Index: branches/ProblemRefactoring/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj	(revision 13373)
@@ -167,4 +167,9 @@
       <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
       <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 13373)
@@ -97,8 +97,6 @@
     <Compile Include="ProblemDefinitionScriptException.cs" />
     <Compile Include="ProgrammableProblemInstances.cs" />
-    <Content Include="Templates\CompiledSingleObjectiveProblemDefinition_Template.cs" />
-    <Content Include="Templates\CompiledMultiObjectiveProblemDefinition_Template.cs">
-      <SubType>Code</SubType>
-    </Content>
+    <Content Include="Templates\MultiObjectiveCombinedEncodingProblem_Template.cs" />
+    <Content Include="Templates\MultiObjectiveProblem_Template.cs" />
     <Compile Include="Templates\ScriptTemplates.Designer.cs">
       <AutoGen>True</AutoGen>
@@ -108,4 +106,6 @@
     <Compile Include="SingleObjectiveProgrammableProblem.cs" />
     <Compile Include="SingleObjectiveProblemDefinitionScript.cs" />
+    <Content Include="Templates\SingleObjectiveCombinedEncodingProblem_Template.cs" />
+    <Content Include="Templates\SingleObjectiveProblem_Template.cs" />
     <EmbeddedResource Include="Templates\ScriptTemplates.resx">
       <Generator>PublicResXFileCodeGenerator</Generator>
@@ -160,4 +160,9 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{dbecb8b0-b166-4133-baf1-ed67c3fd7fca}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Encodings.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj">
       <Project>{bb6d334a-4bb6-4674-9883-31a6ebb32cab}</Project>
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 13373)
@@ -40,5 +40,6 @@
     private MultiObjectiveProblemDefinitionScript(bool deserializing) : base(deserializing) { }
     private MultiObjectiveProblemDefinitionScript(MultiObjectiveProblemDefinitionScript<TEncoding, TSolution> original, Cloner cloner) : base(original, cloner) { }
-    public MultiObjectiveProblemDefinitionScript() : base(ScriptTemplates.CompiledMultiObjectiveProblemDefinition_Template) { }
+    public MultiObjectiveProblemDefinitionScript(string codeTemplate) : base(codeTemplate) { }
+    public MultiObjectiveProblemDefinitionScript() : base() { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProgrammableProblemInstances.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProgrammableProblemInstances.cs	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProgrammableProblemInstances.cs	(revision 13373)
@@ -26,4 +26,5 @@
 using HeuristicLab.Encodings.BinaryVectorEncoding;
 using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
@@ -32,5 +33,5 @@
 namespace HeuristicLab.Problems.Programmable {
   #region single-objective
-  [Item("Binary Vector Programmable Problem (single-objective)", "Represents a binary vector single-objective problem that can be programmed with a script.")]
+  [Item("Binary Vector Problem (single-objective)", "Represents a binary vector single-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -43,5 +44,5 @@
     public SingleObjectiveBinaryVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.SingleObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "BinaryVectorEncoding");
@@ -56,5 +57,5 @@
   }
 
-  [Item("Multi Solution Programmable Problem (single-objective)", "Represents a multi solution single-objective problem that can be programmed with a script.")]
+  [Item("Combined Encoding Problem (single-objective)", "Represents a combined encoding single-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -67,9 +68,5 @@
     public SingleObjectiveMultiSolutionProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
-      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
-      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "MultiEncoding");
-      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "CombinedSolution");
-      ProblemScript.Code = codeTemplate;
+      ProblemScript.Code = ScriptTemplates.SingleObjectiveCombinedEncodingProblem_Template;
     }
 
@@ -80,5 +77,5 @@
   }
 
-  [Item("Integer Vector Programmable Problem (single-objective)", "Represents an integer vector single-objective problem that can be programmed with a script.")]
+  [Item("Integer Vector Problem (single-objective)", "Represents an integer vector single-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -91,5 +88,5 @@
     public SingleObjectiveIntegerVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.SingleObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.IntegerVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "IntegerVectorEncoding");
@@ -103,5 +100,5 @@
   }
 
-  [Item("Real Vector Programmable Problem (single-objective)", "Represents a real vector single-objective problem that can be programmed with a script.")]
+  [Item("Real Vector Problem (single-objective)", "Represents a real vector single-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -114,5 +111,5 @@
     public SingleObjectiveRealVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.SingleObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.RealVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "RealVectorEncoding");
@@ -126,19 +123,26 @@
   }
 
-  //[Item("Permutation Programmable Problem (single-objective)", "Represents a permutation single-objective problem that can be programmed with a script.")]
-  //[Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
-  //[StorableClass]
-  //public sealed class SingleObjectivePermutationProgrammableProblem : SingleObjectiveProgrammableProblem<PermutationEncoding, Permutation> {
-
-  //  [StorableConstructor]
-  //  private SingleObjectivePermutationProgrammableProblem(bool deserializing) : base(deserializing) { }
-  //  private SingleObjectivePermutationProgrammableProblem(SingleObjectivePermutationProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
-  //  public SingleObjectivePermutationProgrammableProblem()
-  //    : base(string.Format(ScriptTemplates.CompiledSingleObjectiveProblemDefinition, "HeuristicLab.Encodings.PermutationEncoding", "PermutationEncoding", "Permutation")) { }
-
-  //  public override IDeepCloneable Clone(Cloner cloner) {
-  //    return new SingleObjectivePermutationProgrammableProblem(this, cloner);
-  //  }
-  //}
+  [Item("Permutation Problem (single-objective)", "Represents a permutation single-objective problem that can be programmed with a script.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
+  [StorableClass]
+  public sealed class SingleObjectivePermutationProgrammableProblem : SingleObjectiveProgrammableProblem<PermutationEncoding, Permutation> {
+
+    [StorableConstructor]
+    private SingleObjectivePermutationProgrammableProblem(bool deserializing) : base(deserializing) { }
+    private SingleObjectivePermutationProgrammableProblem(SingleObjectivePermutationProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
+
+    public SingleObjectivePermutationProgrammableProblem()
+      : base() {
+      var codeTemplate = ScriptTemplates.SingleObjectiveProblem_Template;
+      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.PermutationEncoding");
+      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "PermutationEncoding");
+      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "Permutation");
+      ProblemScript.Code = codeTemplate;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectivePermutationProgrammableProblem(this, cloner);
+    }
+  }
 
   //[Item("Symbolic Expression Tree Programmable Problem (single-objective)", "Represents a symbolic expression tree single-objective problem that can be programmed with a script.")]
@@ -176,5 +180,5 @@
 
   #region multi-objective
-  [Item("Binary Vector Programmable Problem (multi-objective)", "Represents a binary vector multi-objective problem that can be programmed with a script.")]
+  [Item("Binary Vector Problem (multi-objective)", "Represents a binary vector multi-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -187,5 +191,5 @@
     public MultiObjectiveBinaryVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledMultiObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.MultiObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "BinaryVectorEncoding");
@@ -200,5 +204,5 @@
   }
 
-  [Item("Multi Solution Programmable Problem (multi-objective)", "Represents a multi solution multi-objective problem that can be programmed with a script.")]
+  [Item("Combined Encoding Problem (multi-objective)", "Represents a combined encoding multi-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -211,9 +215,5 @@
     public MultiObjectiveMultiSolutionProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
-      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
-      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "MultiEncoding");
-      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "CombinedSolution");
-      ProblemScript.Code = codeTemplate;
+      ProblemScript.Code = ScriptTemplates.MultiObjectiveCombinedEncodingProblem_Template;
     }
 
@@ -224,5 +224,5 @@
   }
 
-  [Item("Integer Vector Programmable Problem (multi-objective)", "Represents an integer vector multi-objective problem that can be programmed with a script.")]
+  [Item("Integer Vector Problem (multi-objective)", "Represents an integer vector multi-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -235,5 +235,5 @@
     public MultiObjectiveIntegerVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.MultiObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.IntegerVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "IntegerVectorEncoding");
@@ -247,5 +247,5 @@
   }
 
-  [Item("Real Vector Programmable Problem (multi-objective)", "Represents a real vector multi-objective problem that can be programmed with a script.")]
+  [Item("Real Vector Problem (multi-objective)", "Represents a real vector multi-objective problem that can be programmed with a script.")]
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
@@ -258,5 +258,5 @@
     public MultiObjectiveRealVectorProgrammableProblem()
       : base() {
-      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      var codeTemplate = ScriptTemplates.MultiObjectiveProblem_Template;
       codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.RealVectorEncoding");
       codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "RealVectorEncoding");
@@ -270,19 +270,25 @@
   }
 
-  //[Item("Permutation Programmable Problem (multi-objective)", "Represents a permutation multi-objective problem that can be programmed with a script.")]
-  //[Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
-  //[StorableClass]
-  //public sealed class MultiObjectivePermutationProgrammableProblem : MultiObjectiveProgrammableProblem<PermutationEncoding, Permutation> {
-
-  //  [StorableConstructor]
-  //  private MultiObjectivePermutationProgrammableProblem(bool deserializing) : base(deserializing) { }
-  //  private MultiObjectivePermutationProgrammableProblem(MultiObjectivePermutationProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
-  //  public MultiObjectivePermutationProgrammableProblem()
-  //    : base(string.Format(ScriptTemplates.CompiledMultiObjectiveProblemDefinition, "HeuristicLab.Encodings.PermutationEncoding", "PermutationEncoding", "Permutation")) { }
-
-  //  public override IDeepCloneable Clone(Cloner cloner) {
-  //    return new MultiObjectivePermutationProgrammableProblem(this, cloner);
-  //  }
-  //}
+  [Item("Permutation Problem (multi-objective)", "Represents a permutation multi-objective problem that can be programmed with a script.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
+  [StorableClass]
+  public sealed class MultiObjectivePermutationProgrammableProblem : MultiObjectiveProgrammableProblem<PermutationEncoding, Permutation> {
+
+    [StorableConstructor]
+    private MultiObjectivePermutationProgrammableProblem(bool deserializing) : base(deserializing) { }
+    private MultiObjectivePermutationProgrammableProblem(MultiObjectivePermutationProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
+    public MultiObjectivePermutationProgrammableProblem()
+      : base() {
+      var codeTemplate = ScriptTemplates.MultiObjectiveProblem_Template;
+      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.PermutationEncoding");
+      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "PermutationEncoding");
+      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "Permutation");
+      ProblemScript.Code = codeTemplate;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectivePermutationProgrammableProblem(this, cloner);
+    }
+  }
 
   //[Item("Symbolic Expression Tree Programmable Problem (multi-objective)", "Represents a symbolic expression tree multi-objective problem that can be programmed with a script.")]
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledMultiObjectiveProblemDefinition_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledMultiObjectiveProblemDefinition_Template.cs	(revision 13372)
+++ 	(revision )
@@ -1,57 +1,0 @@
-﻿using System;
-using System.Linq;
-using System.Collections.Generic;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using ENCODING_NAMESPACE;
-using HeuristicLab.Optimization;
-using HeuristicLab.Problems.Programmable;
-
-namespace HeuristicLab.Problems.Programmable {
-  public class CompiledSingleObjectiveProblemDefinition : CompiledMultiObjectiveProblemDefinition<ENCODING_CLASS, SOLUTION_CLASS> {
-    public override bool[] Maximization { get { return new[] { false, false }; } }
-
-    public override void Initialize() {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
-      // Add additional initialization code e.g. private variables that you need for evaluating
-    }
-
-    public override double[] Evaluate(SOLUTION_CLASS solution, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      var quality = new[] { 0.0, 0.0 };
-      return quality;
-    }
-
-    public override void Analyze(SOLUTION_CLASS[] solution, double[][] qualities, ResultCollection results, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Write or update results given the range of vectors and resulting qualities
-      // Uncomment the following lines if you want to retrieve the best individual
-
-      //var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
-      //var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
-
-      //if (!results.ContainsKey("Best Solution")) {
-      //  results.Add(new Result("Best Solution", typeof(SOLUTION_CLASS)));
-      //}
-      //results["Best Solution"].Value = (IItem)best.Clone();
-    }
-
-    public override IEnumerable<SOLUTION_CLASS> GetNeighbors(SOLUTION_CLASS individual, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Create new vectors, based on the given one that represent small changes
-      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
-      while (true) {
-        // Algorithm will draw only a finite amount of samples
-        // Change to a for-loop to return a concrete amount of neighbors
-        var neighbor = (SOLUTION_CLASS)individual.Clone();
-        // modify the solution specified as neighbor
-        yield return neighbor;
-      }
-    }
-
-    // Implement further classes and methods
-  }
-}
-
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledSingleObjectiveProblemDefinition_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledSingleObjectiveProblemDefinition_Template.cs	(revision 13372)
+++ 	(revision )
@@ -1,57 +1,0 @@
-﻿using System;
-using System.Linq;
-using System.Collections.Generic;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using ENCODING_NAMESPACE;
-using HeuristicLab.Optimization;
-using HeuristicLab.Problems.Programmable;
-
-namespace HeuristicLab.Problems.Programmable {
-  public class CompiledSingleObjectiveProblemDefinition : CompiledSingleObjectiveProblemDefinition<ENCODING_CLASS, SOLUTION_CLASS> {
-    public override bool Maximization { get { return false; } }
-
-    public override void Initialize() {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
-      // Add additional initialization code e.g. private variables that you need for evaluating
-    }
-
-    public override double Evaluate(SOLUTION_CLASS solution, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      var quality = 0.0;
-      return quality;
-    }
-
-    public override void Analyze(SOLUTION_CLASS[] solution, double[] qualities, ResultCollection results, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Write or update results given the range of vectors and resulting qualities
-      // Uncomment the following lines if you want to retrieve the best individual
-
-      //var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
-      //var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
-
-      //if (!results.ContainsKey("Best Solution")) {
-      //  results.Add(new Result("Best Solution", typeof(SOLUTION_CLASS)));
-      //}
-      //results["Best Solution"].Value = (IItem)best.Clone();
-    }
-
-    public override IEnumerable<SOLUTION_CLASS> GetNeighbors(SOLUTION_CLASS individual, IRandom random) {
-      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
-      // Create new vectors, based on the given one that represent small changes
-      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
-      while (true) {
-        // Algorithm will draw only a finite amount of samples
-        // Change to a for-loop to return a concrete amount of neighbors
-        var neighbor = (SOLUTION_CLASS)individual.Clone();
-        // modify the solution specified as neighbor
-        yield return neighbor;
-      }
-    }
-
-    // Implement further classes and methods
-  }
-}
-
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveCombinedEncodingProblem_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveCombinedEncodingProblem_Template.cs	(revision 13373)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveCombinedEncodingProblem_Template.cs	(revision 13373)
@@ -0,0 +1,66 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+//using HeuristicLab.Encodings.BinaryVectorEncoding;
+//using HeuristicLab.Encodings.IntegerVectorEncoding;
+//using HeuristicLab.Encodings.RealVectorEncoding;
+//using HeuristicLab.Encodings.PermutationEncoding;
+//using HeuristicLab.Encodings.LinearLinkageEncoding;
+//using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledSingleObjectiveProblemDefinition : CompiledMultiObjectiveProblemDefinition<CombinedEncoding, CombinedSolution> {
+    public override bool[] Maximization { get { return new[] { true, false }; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
+      // Add additional initialization code e.g. private variables that you need for evaluating
+      //Encoding.Add(new BinaryVectorEncoding("b") { Length = 10 });
+      //Encoding.Add(new IntegerVectorEncoding("i") { Length = 10, Bounds = new int[,] { { -100, 100 } } });
+      //Encoding.Add(new RealVectorEncoding("r") { Length = 10, Bounds = new double[,] { { -100, 100 } } });
+      //Encoding.Add(new PermutationEncoding("p") { Length = 20, PermutationType = PermutationTypes.Absolute });
+      //Encoding.Add(new LinearLinkageEncoding("lle") { Length = 30 });
+      //Encoding.Add(new SymbolicExpressionTreeEncoding("tree") { ... });
+    }
+
+    public override double[] Evaluate(CombinedSolution solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var quality = new[] { 0.0, 0.0 };
+      // var b = solution.GetSolution<BinaryVector>("b");
+      // quality[0] = b.Count(x => x); // one max!
+      // var r = solution.GetSolution<RealVector>("r");
+      // quality[1] = r.Select((i, v) => new { Idx = i, Val = v }).Sum(x => b[x.Idx] ? x.Val * x.Val : 0.0); // sphere
+
+      // NOTE: Check the Maximization property above (true or false)!
+      return quality;
+    }
+
+    public override void Analyze(CombinedSolution[] solutions, double[][] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+      // Uncomment the following lines if you want to retrieve the best solution
+    }
+
+    public override IEnumerable<CombinedSolution> GetNeighbors(CombinedSolution solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = (CombinedSolution)solution.Clone();
+        // modify the solution specified as neighbor
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveProblem_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveProblem_Template.cs	(revision 13373)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/MultiObjectiveProblem_Template.cs	(revision 13373)
@@ -0,0 +1,49 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using ENCODING_NAMESPACE;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledSingleObjectiveProblemDefinition : CompiledMultiObjectiveProblemDefinition<ENCODING_CLASS, SOLUTION_CLASS> {
+    public override bool[] Maximization { get { return new[] { false, false }; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
+      // Encoding.Length = 100;
+      // Add additional initialization code e.g. private variables that you need for evaluating
+    }
+
+    public override double[] Evaluate(SOLUTION_CLASS solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var quality = new[] { 0.0, 0.0 };
+      return quality;
+    }
+
+    public override void Analyze(SOLUTION_CLASS[] solutions, double[][] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+    }
+
+    public override IEnumerable<SOLUTION_CLASS> GetNeighbors(SOLUTION_CLASS solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = (SOLUTION_CLASS)solution.Clone();
+        // modify the solution specified as neighbor
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs	(revision 13373)
@@ -10,5 +10,4 @@
 
 namespace HeuristicLab.Problems.Programmable {
-  using System;
 
 
@@ -68,16 +67,36 @@
     ///using HeuristicLab.Core;
     ///using HeuristicLab.Data;
-    ///using HeuristicLab.Encodings.BinaryVectorEncoding;
-    ///using HeuristicLab.Encodings.IntegerVectorEncoding;
-    ///using HeuristicLab.Encodings.RealVectorEncoding;
-    ///using HeuristicLab.Encodings.PermutationEncoding;
-    ///using HeuristicLab.Encodings.LinearLinkageEncoding;
-    ///using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+    ///using ENCODING_NAMESPACE;
     ///using HeuristicLab.Optimization;
-    ///using H [rest of string was truncated]&quot;;.
+    ///using HeuristicLab.Problems.Programmable;
+    ///
+    ///namespace HeuristicLab.Problems.Programmable {
+    ///  public class CompiledSingleObjectiveProblemDefinition : CompiledMultiObjectiveProblemDefinition&lt;ENCODING_CLASS, SOLUTION_CLASS&gt; {
+    ///    public override bool[] Maximization { get { return new[] { false, false [rest of string was truncated]&quot;;.
     /// </summary>
-    public static string CompiledMultiObjectiveProblemDefinition_Template {
+    public static string MultiObjectiveCombinedEncodingProblem_Template {
       get {
-        return ResourceManager.GetString("CompiledMultiObjectiveProblemDefinition_Template", resourceCulture);
+        return ResourceManager.GetString("MultiObjectiveCombinedEncodingProblem_Template", resourceCulture);
+      }
+    }
+
+    /// <summary>
+    ///   Looks up a localized string similar to using System;
+    ///using System.Linq;
+    ///using System.Collections.Generic;
+    ///using HeuristicLab.Common;
+    ///using HeuristicLab.Core;
+    ///using HeuristicLab.Data;
+    ///using ENCODING_NAMESPACE;
+    ///using HeuristicLab.Optimization;
+    ///using HeuristicLab.Problems.Programmable;
+    ///
+    ///namespace HeuristicLab.Problems.Programmable {
+    ///  public class CompiledSingleObjectiveProblemDefinition : CompiledMultiObjectiveProblemDefinition&lt;ENCODING_CLASS, SOLUTION_CLASS&gt; {
+    ///    public override bool[] Maximization { get { return new[] { false, false [rest of string was truncated]&quot;;.
+    /// </summary>
+    public static string MultiObjectiveProblem_Template {
+      get {
+        return ResourceManager.GetString("MultiObjectiveProblem_Template", resourceCulture);
       }
     }
@@ -100,7 +119,30 @@
     ///    pub [rest of string was truncated]&quot;;.
     /// </summary>
-    public static string CompiledSingleObjectiveProblemDefinition_Template {
+    public static string SingleObjectiveCombinedEncodingProblem_Template {
       get {
-        return ResourceManager.GetString("CompiledSingleObjectiveProblemDefinition_Template", resourceCulture);
+        return ResourceManager.GetString("SingleObjectiveCombinedEncodingProblem_Template", resourceCulture);
+      }
+    }
+
+    /// <summary>
+    ///   Looks up a localized string similar to using System;
+    ///using System.Linq;
+    ///using System.Collections.Generic;
+    ///using HeuristicLab.Common;
+    ///using HeuristicLab.Core;
+    ///using HeuristicLab.Data;
+    ///using ENCODING_NAMESPACE;
+    ///using HeuristicLab.Optimization;
+    ///using HeuristicLab.Problems.Programmable;
+    ///
+    ///namespace HeuristicLab.Problems.Programmable {
+    ///  public class CompiledSingleObjectiveProblemDefinition : CompiledSingleObjectiveProblemDefinition&lt;ENCODING_CLASS, SOLUTION_CLASS&gt; {
+    ///    public override bool Maximization { get { return false; } }
+    ///
+    ///    pub [rest of string was truncated]&quot;;.
+    /// </summary>
+    public static string SingleObjectiveProblem_Template {
+      get {
+        return ResourceManager.GetString("SingleObjectiveProblem_Template", resourceCulture);
       }
     }
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx	(revision 13372)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx	(revision 13373)
@@ -119,9 +119,15 @@
   </resheader>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="CompiledMultiObjectiveProblemDefinition_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>CompiledMultiObjectiveProblemDefinition_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  <data name="MultiObjectiveCombinedEncodingProblem_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>MultiObjectiveCombinedEncodingProblem_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
   </data>
-  <data name="CompiledSingleObjectiveProblemDefinition_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>CompiledSingleObjectiveProblemDefinition_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  <data name="MultiObjectiveProblem_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>MultiObjectiveProblem_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="SingleObjectiveCombinedEncodingProblem_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>SingleObjectiveCombinedEncodingProblem_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="SingleObjectiveProblem_Template" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>SingleObjectiveProblem_Template.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
   </data>
 </root>
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveCombinedEncodingProblem_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveCombinedEncodingProblem_Template.cs	(revision 13373)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveCombinedEncodingProblem_Template.cs	(revision 13373)
@@ -0,0 +1,74 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+//using HeuristicLab.Encodings.BinaryVectorEncoding;
+//using HeuristicLab.Encodings.IntegerVectorEncoding;
+//using HeuristicLab.Encodings.RealVectorEncoding;
+//using HeuristicLab.Encodings.PermutationEncoding;
+//using HeuristicLab.Encodings.LinearLinkageEncoding;
+//using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledSingleObjectiveProblemDefinition : CompiledSingleObjectiveProblemDefinition<CombinedEncoding, CombinedSolution> {
+    public override bool Maximization { get { return true; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
+      // Add additional initialization code e.g. private variables that you need for evaluating
+      //Encoding.Add(new BinaryVectorEncoding("b") { Length = 10 });
+      //Encoding.Add(new IntegerVectorEncoding("i") { Length = 10, Bounds = new int[,] { { -100, 100 } } });
+      //Encoding.Add(new RealVectorEncoding("r") { Length = 10, Bounds = new double[,] { { -100, 100 } } });
+      //Encoding.Add(new PermutationEncoding("p") { Length = 20, PermutationType = PermutationTypes.Absolute });
+      //Encoding.Add(new LinearLinkageEncoding("lle") { Length = 30 });
+      //Encoding.Add(new SymbolicExpressionTreeEncoding("tree") { ... });
+    }
+
+    public override double Evaluate(CombinedSolution solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var quality = 0.0;
+      // var b = solution.GetSolution<BinaryVector>("b");
+      // quality = b.Count(x => x); // one max!
+      // var r = solution.GetSolution<RealVector>("r");
+      // quality += r.Sum(x => -x * x); // sphere
+
+      // NOTE: Check the Maximization property above (true or false)!
+      return quality;
+    }
+
+    public override void Analyze(CombinedSolution[] solutions, double[] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+      // Uncomment the following lines if you want to retrieve the best solution
+
+      //var orderedSolutions = solutions.Zip(qualities, (i, q) => new { Solution = i, Quality = q }).OrderBy(z => z.Quality);
+      //var best = Maximization ? orderedSolutions.Last().Solution : orderedSolutions.First().Solution;
+
+      //if (!results.ContainsKey("Best Solution")) {
+      //  results.Add(new Result("Best Solution", typeof(SOLUTION_CLASS)));
+      //}
+      //results["Best Solution"].Value = (IItem)best.Clone();
+    }
+
+    public override IEnumerable<CombinedSolution> GetNeighbors(CombinedSolution solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = (CombinedSolution)solution.Clone();
+        // modify the solution specified as neighbor
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveProblem_Template.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveProblem_Template.cs	(revision 13373)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/Templates/SingleObjectiveProblem_Template.cs	(revision 13373)
@@ -0,0 +1,58 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using ENCODING_NAMESPACE;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledSingleObjectiveProblemDefinition : CompiledSingleObjectiveProblemDefinition<ENCODING_CLASS, SOLUTION_CLASS> {
+    public override bool Maximization { get { return false; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define e.g. the length of the solution encoding or the solution creator by modifying the Encoding property
+      // Encoding.Length = 100;
+      // Add additional initialization code e.g. private variables that you need for evaluating
+    }
+
+    public override double Evaluate(SOLUTION_CLASS solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var quality = 0.0;
+      return quality;
+    }
+
+    public override void Analyze(SOLUTION_CLASS[] solutions, double[] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+      // Uncomment the following lines if you want to retrieve the best solution
+
+      //var orderedSolutions = solutions.Zip(qualities, (i, q) => new { Solution = i, Quality = q }).OrderBy(z => z.Quality);
+      //var best = Maximization ? orderedSolutions.Last().Solution : orderedSolutions.First().Solution;
+
+      //if (!results.ContainsKey("Best Solution")) {
+      //  results.Add(new Result("Best Solution", typeof(SOLUTION_CLASS)));
+      //}
+      //results["Best Solution"].Value = (IItem)best.Clone();
+    }
+
+    public override IEnumerable<SOLUTION_CLASS> GetNeighbors(SOLUTION_CLASS solution, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = (SOLUTION_CLASS)solution.Clone();
+        // modify the solution specified as neighbor
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
