Index: /branches/PushGP/HeuristicLab.PushGP/FeatureTests/Program.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/FeatureTests/Program.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/FeatureTests/Program.cs	(revision 15334)
@@ -12,4 +12,5 @@
   using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Extensions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
@@ -23,11 +24,12 @@
     private const int ExampleCount = 200;
     private const int InstanceCount = 1024;
-    private const int PopulationCount = 100;
+    private const int PopulationCount = 1000;
 
     private static int TotalInstanceCount => PopulationCount * InstanceCount * ExampleCount;
 
     static void Main(string[] args) {
+      // object pooling
       //Test1();
-      //Test1_2();
+      Test1_2();
       //Test3();
 
@@ -53,8 +55,37 @@
       //TestSplitLogic();
       //TestStringBuilder();
-      TestRandomReset();
+      //TestRandomReset();
+
+      //TestRandomBiased(0, 4, 0.01);
+      //TestRandomBiased(0, 4, 0.25);
+      //TestRandomBiased(0, 4, 0.5);
+      //TestRandomBiased(0, 4, 1);
+      //TestRandomBiased(0, 4, 2);
+      //TestRandomBiased(0, 4, 3);
+      //TestRandomBiased(0, 4, 4);
+
 
       Console.WriteLine("\nPress any key to continue...");
       Console.ReadKey(false);
+    }
+
+    private static void TestRandomBiased(int min, int max, double bias) {
+      var random = new MersenneTwister();
+      var total = 100000;
+
+      var distribution = Enumerable
+        .Range(0, total)
+        .Select(_ => random.NextBiased(min, max, bias))
+        .GroupBy(x => x)
+        .OrderBy(g => g.Key)
+        .ToDictionary(g => g.Key, g => g.Count() / (double)total * 100);
+
+      Console.WriteLine($@"{min}|{max}|{bias}");
+
+      foreach (var entry in distribution) {
+        Console.WriteLine($@"{entry.Key}: {entry.Value}");
+      }
+
+      Console.WriteLine();
     }
 
@@ -496,5 +527,5 @@
       var config = new PushConfiguration {
         EvalPushLimit = 1024,
-        MaxPointsInProgram = 1024
+        MaxProgramLength = 1024
       };
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteDataDescriptor.cs	(revision 15334)
@@ -11,6 +11,6 @@
     private const string InstanceArchiveName = "HeuristicLab.BenchmarkSuite.Data.BenchmarkExamples.zip";
     private const string ResourcePath = @".*\.Data\.";
-    private const string ExampleFieldDelimiter = ",";
-
+    private const char ExampleFieldDelimiter = ',';
+    private const char ExampleFieldQualifier = '"';
     private Example[] examples;
 
@@ -36,5 +36,5 @@
 
         using (var reader = new StreamReader(entry.Open())) {
-          var lines = CsvParser.Parse(reader, ',', '"');
+          var lines = CsvParser.Parse(reader, ExampleFieldDelimiter, ExampleFieldQualifier);
 
           foreach (var line in lines) {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteOverview.cd
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteOverview.cd	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/BenchmarkSuiteOverview.cd	(revision 15334)
@@ -0,0 +1,106 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+  <Class Name="HeuristicLab.BenchmarkSuite.BenchmarkSuiteInstanceProvider">
+    <Position X="4.25" Y="3.25" Width="3.75" />
+    <Members>
+      <Property Name="Description" Hidden="true" />
+      <Method Name="LoadData" Hidden="true" />
+      <Field Name="name" Hidden="true" />
+      <Property Name="Name" Hidden="true" />
+      <Field Name="referencePublication" Hidden="true" />
+      <Property Name="ReferencePublication" Hidden="true" />
+      <Field Name="webLink" Hidden="true" />
+      <Property Name="WebLink" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>QAAAAAAAAIAwAAAAAAAAAAQAAIAEAAAAAAAAQAAAAEA=</HashCode>
+      <FileName>BenchmarkSuiteInstanceProvider.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.BenchmarkSuiteDataDescriptor">
+    <Position X="3.25" Y="0.75" Width="2.5" />
+    <Members>
+      <Method Name="CloneExamples" Hidden="true" />
+      <Property Name="Description" Hidden="true" />
+      <Field Name="ExampleFieldDelimiter" Hidden="true" />
+      <Field Name="ExampleFieldQualifier" Hidden="true" />
+      <Field Name="examples" Hidden="true" />
+      <Property Name="FileName" Hidden="true" />
+      <Method Name="GetResourceName" Hidden="true" />
+      <Property Name="InputArgumentCount" Hidden="true" />
+      <Field Name="InstanceArchiveName" Hidden="true" />
+      <Property Name="Name" Hidden="true" />
+      <Property Name="OutputArgumentCount" Hidden="true" />
+      <Method Name="ParseData" Hidden="true" />
+      <Field Name="ResourcePath" Hidden="true" />
+    </Members>
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Properties" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAEAAADAgAAgAAFAQAAgAAQAAAAQAABAAAAAAABEAAA=</HashCode>
+      <FileName>BenchmarkSuiteDataDescriptor.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Example">
+    <Position X="0.75" Y="2.75" Width="2.5" />
+    <Members>
+      <Method Name="Clone" Hidden="true" />
+      <Field Name="emptyBooleans" Hidden="true" />
+      <Field Name="emptyBooleanVectors" Hidden="true" />
+      <Field Name="emptyChars" Hidden="true" />
+      <Field Name="emptyFloats" Hidden="true" />
+      <Field Name="emptyFloatVectors" Hidden="true" />
+      <Field Name="emptyIntegers" Hidden="true" />
+      <Field Name="emptyIntegerVectors" Hidden="true" />
+      <Field Name="emptyStrings" Hidden="true" />
+      <Field Name="emptyStringVectors" Hidden="true" />
+      <Method Name="Example" Hidden="true" />
+      <Field Name="NewLineSeparator" Hidden="true" />
+      <Field Name="outputPrint" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>KAgkhQAACAAEEUgAICAIAIFAQAIkEBwIAAEAAQCAAVA=</HashCode>
+      <FileName>Example.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.ProblemData">
+    <Position X="4.5" Y="4.75" Width="3.5" />
+    <Members>
+      <Method Name="Clone" Hidden="true" />
+      <Method Name="ProblemData" Hidden="true" />
+      <Field Name="ProblemType" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>IAICASAAAAAIAAIAAEAAAAEAAAAQAABIAgAAQBAAABA=</HashCode>
+      <FileName>ProblemData.cs</FileName>
+    </TypeIdentifier>
+    <ShowAsAssociation>
+      <Property Name="Examples" />
+    </ShowAsAssociation>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Problems.Median" Collapsed="true">
+    <Position X="0.75" Y="0.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAgAAgAABAIAAAAAQAAAAUAAAAAEAAAABEAAA=</HashCode>
+      <FileName>Problems\Median.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.BenchmarkSuite.Problems.NumberIO" Collapsed="true">
+    <Position X="0.75" Y="1.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAgAAgAABAIAAAAAQAAAAUAAAAAEAAAABEAAA=</HashCode>
+      <FileName>Problems\NumberIo.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Enum Name="HeuristicLab.BenchmarkSuite.ExampleArgumentType">
+    <Position X="6" Y="0.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAABAAAQAAAAAAQAAAAAAAAAQAAiEAAAAAAAAkAAA=</HashCode>
+      <FileName>ExampleArgumentType.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/HeuristicLab.BenchmarkSuite.csproj	(revision 15334)
@@ -164,4 +164,7 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="BenchmarkSuiteOverview.cd" />
+  </ItemGroup>
   <Choose>
     <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ProblemData.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ProblemData.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/ProblemData.cs	(revision 15334)
@@ -25,6 +25,7 @@
       BestResult = origin.BestResult;
       WorstResult = origin.WorstResult;
-      InputArgumentTypes = origin.InputArgumentTypes;
-      OutputArgumentTypes = origin.OutputArgumentTypes;
+
+      InputArgumentTypes = (ExampleArgumentType[])origin.InputArgumentTypes.Clone();
+      OutputArgumentTypes = (ExampleArgumentType[])origin.OutputArgumentTypes.Clone();
 
       if (origin.Examples != null)
@@ -35,4 +36,5 @@
       FloatStringFormat = origin.FloatStringFormat;
       ProblemType = origin.ProblemType;
+      ProgramExecutionBudget = origin.ProgramExecutionBudget;
     }
 
@@ -82,4 +84,10 @@
     public ErcOptions ErcOptions { get; set; }
 
+    /// <summary>
+    /// Represents the maximum number of programs that will be executed before a run is terminated, which is the product of the maximum generations, the population size, and the size of the training set.
+    /// </summary>
+    [Storable]
+    public int ProgramExecutionBudget { get; set; }
+
     [Storable]
     public string FloatStringFormat { get; set; }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Checksum.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Checksum.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Checksum.cs	(revision 15334)
@@ -19,7 +19,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = char.MaxValue,
+        WorstResult = 1000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CollatzNumbers.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CollatzNumbers.cs	(revision 15334)
@@ -17,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 300,
+        WorstResult = 1000000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CompareStringLengths.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CompareStringLengths.cs	(revision 15334)
@@ -17,4 +17,5 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CountOdds.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CountOdds.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/CountOdds.cs	(revision 15334)
@@ -17,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 50,
+        WorstResult = 1000,
         InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Digits.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Digits.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Digits.cs	(revision 15334)
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 20,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/DoubleLetters.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/DoubleLetters.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/DoubleLetters.cs	(revision 15334)
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/EvenSquares.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/EvenSquares.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/EvenSquares.cs	(revision 15334)
@@ -1,3 +1,5 @@
 ﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
   public class EvenSquares : BenchmarkSuiteDataDescriptor {
     private const string name = "Even Sqaures - Hard";
@@ -15,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 400,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
@@ -34,4 +37,7 @@
         InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
         OutputPrint = output[0],
+
+        // helper
+        OutputIntegerVector = new [] { output[0].Split('\n').Select(ExampleArgumentConverter.ConvertInteger).ToArray() }
       };
     }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ForLoopIndex.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ForLoopIndex.cs	(revision 15334)
@@ -19,7 +19,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 1000,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Grades.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Grades.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Grades.cs	(revision 15334)
@@ -1,3 +1,5 @@
 ﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System;
+
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Integer;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.String;
@@ -6,5 +8,5 @@
     private const string name = "Grades - Hard";
     private const string fileName = "Grades.csv";
-    private const string description = "Given 5 integers, the first four represent the lower numeric thresholds for achieving an A, B, C, and D, and will be distinct and in descending order.The fifth represents the student’s numeric grade.The program must print Student has a X grade., where X is A, B, C, D, or F depending on the thresholds and the numeric grade.";
+    private const string description = "Given 5 integers, the first four represent the lower numeric thresholds for achieving an A, B, C, and D, and will be distinct and in descending order. The fifth represents the student’s numeric grade. The program must print Student has a X grade., where X is A, B, C, D, or F depending on the thresholds and the numeric grade.";
 
     protected override string FileName { get { return fileName; } }
@@ -18,7 +20,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 25,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
@@ -39,4 +42,8 @@
 
     protected override Example ParseExample(string[] input, string[] output) {
+      char grade;
+      if (!GetGrade(output[0], out grade))
+        throw new InvalidOperationException("Unable to parse grade.");
+
       return new Example {
         InputArgs = input,
@@ -44,5 +51,20 @@
         InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
         OutputPrint = output[0],
+
+        // help
+        OutputChar = new[] { grade }
       };
+    }
+
+    public static bool GetGrade(string str, out char grade) {
+      const string start = "Student has a ";
+
+      if (str.StartsWith(start) && str.Length > start.Length) {
+        grade = str[start.Length];
+        return true;
+      }
+
+      grade = default(char);
+      return false;
     }
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/LastIndexOfZero.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/LastIndexOfZero.cs	(revision 15334)
@@ -17,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 45000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 50,
+        WorstResult = 1000000,
         InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Median.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Median.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Median.cs	(revision 15334)
@@ -17,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 20000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 1,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/MirrorImage.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/MirrorImage.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/MirrorImage.cs	(revision 15334)
@@ -17,4 +17,5 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NegativeToZero.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NegativeToZero.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NegativeToZero.cs	(revision 15334)
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 50000,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NumberIo.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NumberIo.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/NumberIo.cs	(revision 15334)
@@ -20,7 +20,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 5000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 400,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Float, ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/PigLatin.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/PigLatin.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/PigLatin.cs	(revision 15334)
@@ -19,7 +19,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ReplaceSpaceWithNewline.cs	(revision 15334)
@@ -19,7 +19,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 20,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print, ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ScrabbleScore.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ScrabbleScore.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/ScrabbleScore.cs	(revision 15334)
@@ -48,7 +48,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 500,
+        WorstResult = 1000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SmallOrLarge.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SmallOrLarge.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SmallOrLarge.cs	(revision 15334)
@@ -19,7 +19,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 5,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Smallest.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Smallest.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Smallest.cs	(revision 15334)
@@ -17,12 +17,13 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 20000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 1,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer, ExampleArgumentType.Integer },
-        OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
+        OutputArgumentTypes = new[] { ExampleArgumentType.Print },
         TrainingCount = 100,
         TestCount = 1000,
-        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean,
+        EnabledDataTypes = DataTypes.Exec | DataTypes.Integer | DataTypes.Boolean | DataTypes.Print,
         MaxSize = 200,
         EvalLimit = 200,
@@ -40,4 +41,6 @@
         OutputArgs = output,
         InputInteger = ExampleArgumentConverter.ConvertIntegers(input),
+        OutputPrint = output[0],
+        // Helper
         OutputInteger = ExampleArgumentConverter.ConvertIntegers(output[0]),
       };
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringDifferences.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringDifferences.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringDifferences.cs	(revision 15334)
@@ -6,5 +6,5 @@
     private const string name = "String Differences - Hard";
     private const string fileName = "StringDifferences.csv";
-    private const string description = "Given 2 strings (without whitespace) as input, find the indices at which the strings have different characters, stopping at the end of the shorter one.For each such index, print a line containing the index as well as the character in each string. For example, if the strings are “dealer” and “dollars”, the program should print: 1 e o, 2 a l, 4 e a";
+    private const string description = "Given 2 strings (without whitespace) as input, find the indices at which the strings have different characters, stopping at the end of the shorter one. For each such index, print a line containing the index as well as the character in each string. For example, if the strings are “dealer” and “dollars”, the program should print: 1 e o, 2 a l, 4 e a";
 
     protected override string FileName { get { return fileName; } }
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.String, ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringLengthsBackwards.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringLengthsBackwards.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/StringLengthsBackwards.cs	(revision 15334)
@@ -14,10 +14,11 @@
 
     public override ProblemData CreateProblemData() {
-      return new ProblemData(ProblemType.StringDifferences) {
+      return new ProblemData(ProblemType.StringLengthsBackwards) {
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 200,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.StringVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SumOfSquares.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SumOfSquares.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SumOfSquares.cs	(revision 15334)
@@ -17,7 +17,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 15000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 338350,
+        WorstResult = 1000000000, // 338350,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Integer },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SuperAnagrams.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SuperAnagrams.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/SuperAnagrams.cs	(revision 15334)
@@ -19,4 +19,5 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 60000000,
         Examples = CloneExamples(),
         BestResult = 0,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Syllables.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Syllables.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/Syllables.cs	(revision 15334)
@@ -1,3 +1,5 @@
 ﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System;
+
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Char;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Integer;
@@ -19,7 +21,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
@@ -50,4 +53,8 @@
 
     protected override Example ParseExample(string[] input, string[] output) {
+      long numberOfSyllables;
+      if (!GetNumberOfSyllables(output[0], out numberOfSyllables))
+        throw new InvalidOperationException("Unable to parse number of syllables.");
+
       return new Example {
         InputArgs = input,
@@ -55,5 +62,20 @@
         InputString = input,
         OutputPrint = output[0],
+
+        // help
+        OutputInteger = new[] { numberOfSyllables }
       };
+    }
+
+    public static bool GetNumberOfSyllables(string str, out long numberOfSyllables) {
+      if (str.Length == 0) {
+        numberOfSyllables = 0;
+        return false;
+      }
+
+      var lastIndex = str.Length - 1;
+      var lastCharStr = str[lastIndex].ToString();
+
+      return long.TryParse(lastCharStr, out numberOfSyllables);
     }
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorAverage.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorAverage.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorAverage.cs	(revision 15334)
@@ -15,7 +15,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 1000,
+        WorstResult = 1000000,
         InputArgumentTypes = new[] { ExampleArgumentType.FloatVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.Float },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorSummed.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorSummed.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/VectorSummed.cs	(revision 15334)
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 45000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100000,
+        WorstResult = 1000000000,
         InputArgumentTypes = new[] { ExampleArgumentType.IntegerVector, ExampleArgumentType.IntegerVector },
         OutputArgumentTypes = new[] { ExampleArgumentType.IntegerVector },
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WallisPi.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WallisPi.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WallisPi.cs	(revision 15334)
@@ -6,5 +6,5 @@
     private const string name = "Wallis Pi - Hard";
     private const string fileName = "WallisPi.csv";
-    private const string description = " John Wallis gave a infinite product that converges to π/4. Given an integer input n, compute an approximation of this product out to n terms.Results are rounded to 5 decimal place";
+    private const string description = " John Wallis gave a infinite product that converges to π/4. Given an integer input n, compute an approximation of this product out to n terms. Results are rounded to 5 decimal places.";
 
     protected override string FileName { get { return fileName; } }
@@ -18,7 +18,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 45000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 1,
+        WorstResult = 1000000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer },
         OutputArgumentTypes = new[] { ExampleArgumentType.Float },
@@ -28,4 +29,5 @@
         MaxSize = 600,
         EvalLimit = 8000,
+        FloatStringFormat = "N5",
         ErcOptions = {
           ErcProbability = 0.05,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WordStats.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WordStats.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/WordStats.cs	(revision 15334)
@@ -1,3 +1,6 @@
 ﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System;
+  using System.Linq;
+
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Char;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Integer;
@@ -20,7 +23,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 30000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 1000,
+        WorstResult = 10000,
         InputArgumentTypes = new[] { ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
@@ -30,6 +34,7 @@
         MaxSize = 1000,
         EvalLimit = 6000,
+        FloatStringFormat = "0.0#########",
         ErcOptions = {
-          ErcProbability = 0.05,
+        ErcProbability = 0.05,
           IntegerErcOptions = new IntegerErcOptions(
             new IntegerRangeErc(-100, 100)),
@@ -45,10 +50,57 @@
 
     protected override Example ParseExample(string[] input, string[] output) {
+      long numberOfSentences;
+      if (!GetNumberOfSentences(output[0], out numberOfSentences))
+        throw new InvalidOperationException("Unable to find or parse line with number of sentences.");
+
+      double averageSentenceLength;
+      if (!GetAverageSentenceLength(output[0], out averageSentenceLength))
+        throw new InvalidOperationException("Unable to find line or parse with average sentence length.");
+
       return new Example {
         InputArgs = input,
         OutputArgs = output,
         InputString = input,
-        OutputPrint = output[0]
+        OutputPrint = output[0],
+
+        // help
+        OutputInteger = new[] { numberOfSentences },
+        OutputFloat = new[] { averageSentenceLength }
       };
+    }
+
+    public static bool GetNumberOfSentences(string str, out long numberOfSentences) {
+      var lines = str.Split('\n');
+      var requiredLineIndex = lines.Length - 2;
+      numberOfSentences = 0;
+
+      if (requiredLineIndex < 0)
+        return false;
+
+      var line = lines[requiredLineIndex];
+      var numberOfSentencesStr = line.Split(' ').Last();
+
+
+      if (!long.TryParse(numberOfSentencesStr, out numberOfSentences))
+        return false;
+
+      return true;
+    }
+
+    public static bool GetAverageSentenceLength(string str, out double averageSentenceLength) {
+      var lines = str.Split('\n');
+      var requiredLineIndex = lines.Length - 1;
+      averageSentenceLength = 0;
+
+      if (requiredLineIndex < 0)
+        return false;
+
+      var line = lines[requiredLineIndex];
+      var averageSentenceLengthStr = line.Split(' ').Last();
+
+      if (!double.TryParse(averageSentenceLengthStr, out averageSentenceLength))
+        return false;
+
+      return true;
     }
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/XWordLines.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/XWordLines.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite/Problems/XWordLines.cs	(revision 15334)
@@ -1,3 +1,5 @@
 ﻿namespace HeuristicLab.BenchmarkSuite.Problems {
+  using System.Linq;
+
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Char;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Integer;
@@ -6,5 +8,5 @@
     private const string name = "X-Word Lines - Hard";
     private const string fileName = "XWordLines.csv";
-    private const string description = "Given an integer X and a string that can contain spaces and newlines, print the string with exactly X words per line.The last line may have fewer than X words.";
+    private const string description = "Given an integer X and a string that can contains spaces and newlines, print the string with exactly X words per line. The last line may have fewer than X words.";
 
     protected override string FileName { get { return fileName; } }
@@ -18,7 +20,8 @@
         Name = Name,
         Description = Description,
+        ProgramExecutionBudget = 45000000,
         Examples = CloneExamples(),
         BestResult = 0,
-        WorstResult = 100,
+        WorstResult = 5000,
         InputArgumentTypes = new[] { ExampleArgumentType.Integer, ExampleArgumentType.String },
         OutputArgumentTypes = new[] { ExampleArgumentType.Print },
@@ -43,4 +46,6 @@
         InputString = new[] { input[0] },
         OutputPrint = output[0],
+        // Helper
+        OutputInteger = new[] { input[0].Split(' ', '\n').LongCount(x => !string.IsNullOrWhiteSpace(x)) }
       };
     }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/StringExtensions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/StringExtensions.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/StringExtensions.cs	(revision 15334)
@@ -0,0 +1,55 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Base.Extensions {
+  public static class StringExtensions {
+    public static bool IsNumeric(this string str) {
+      int n;
+      return int.TryParse("123", out n);
+    }
+
+    /// <summary>
+    /// https://www.dotnetperls.com/levenshtein
+    /// </summary>
+    public static int LevenshteinDistance(this string source, string target) {
+      if (source == null && target == null) return 0;
+      if (source == null) return target.Length;
+      if (target == null) return source.Length;
+
+      int n = source.Length;
+      int m = target.Length;
+      int[,] d = new int[n + 1, m + 1];
+
+      // Step 1
+      if (n == 0) {
+        return m;
+      }
+
+      if (m == 0) {
+        return n;
+      }
+
+      // Step 2
+      for (int i = 0; i <= n; d[i, 0] = i++) {
+      }
+
+      for (int j = 0; j <= m; d[0, j] = j++) {
+      }
+
+      // Step 3
+      for (int i = 1; i <= n; i++) {
+        //Step 4
+        for (int j = 1; j <= m; j++) {
+          // Step 5
+          int cost = (target[j - 1] == source[i - 1]) ? 0 : 1;
+
+          // Step 6
+          d[i, j] = Math.Min(
+              Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
+              d[i - 1, j - 1] + cost);
+        }
+      }
+      // Step 7
+      return d[n, m];
+    }
+  }
+}
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/TypeExtensions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/TypeExtensions.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Extensions/TypeExtensions.cs	(revision 15334)
@@ -0,0 +1,29 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Base.Extensions {
+  public static class TypeExtensions {
+    public static bool IsSubclass(this Type type, Type baseType) {
+      if (type == null || baseType == null || type == baseType)
+        return false;
+
+      if (baseType.IsGenericType == false) {
+        if (type.IsGenericType == false)
+          return type.IsSubclassOf(baseType);
+      } else {
+        baseType = baseType.GetGenericTypeDefinition();
+      }
+
+      type = type.BaseType;
+      var objectType = typeof(object);
+      while (type != objectType && type != null) {
+        var curentType = type.IsGenericType ? type.GetGenericTypeDefinition() : type;
+        if (curentType == baseType)
+          return true;
+
+        type = type.BaseType;
+      }
+
+      return false;
+    }
+  }
+}
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/HeuristicLab.Problems.ProgramSynthesis.Base.csproj	(revision 15334)
@@ -125,4 +125,6 @@
     <Compile Include="Extensions\EnumerableExtensions.cs" />
     <Compile Include="Extensions\NormalDistributedRandomExtensions.cs" />
+    <Compile Include="Extensions\StringExtensions.cs" />
+    <Compile Include="Extensions\TypeExtensions.cs" />
     <Compile Include="Generators\StringGenerator.cs" />
     <Compile Include="Weighted\IWeighted.cs" />
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Plugin.cs	(revision 15334)
@@ -23,5 +23,5 @@
 #endregion
 
-namespace HeuristicLab.Problems.ProgramSynthesis.PushGP {
+namespace HeuristicLab.Problems.ProgramSynthesis.Base {
   using HeuristicLab.PluginInfrastructure;
 
@@ -33,5 +33,4 @@
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
-  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
@@ -40,5 +39,4 @@
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   public class Plugin : PluginBase {
-
   }
 }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/ExpressionsClassDiagramm.cd	(revision 15334)
@@ -0,0 +1,54 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.Expression">
+    <Position X="3" Y="0.5" Width="2" />
+    <Members>
+      <Method Name="Expression" Hidden="true" />
+      <Method Name="IPooledObject.Init" Hidden="true" />
+      <Method Name="IPooledObject.Reset" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>EAAAAAgAJAAAAAAMAAAAAAAAAAAAACAAAQAAAAAAABA=</HashCode>
+      <FileName>Push\Expressions\Expression.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.PushProgram">
+    <Position X="0.5" Y="4.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AMtgMCECJAAABAAcgAYAAAQCQkABAeBgAQEIIgCAABo=</HashCode>
+      <FileName>Push\Expressions\PushProgram.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.StatefulExpression&lt;T&gt;">
+    <Position X="2.75" Y="4.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAggAAAAAACABAAIgAAAAAAAAAAAAKAAAAAABAAAAAA=</HashCode>
+      <FileName>Push\Expressions\StatefulExpression.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ProgramSynthesis.Push.Expressions.StatelessExpression">
+    <Position X="5" Y="4.5" Width="2" />
+    <Members>
+      <Field Name="hashCode" Hidden="true" />
+    </Members>
+    <Compartments>
+      <Compartment Name="Methods" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAgAAAAAAAAAAAAAgAAAAAAAAAAAAKAAAAAAAAAAAAA=</HashCode>
+      <FileName>Push\Expressions\StatelessExpression.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 15334)
@@ -103,4 +103,8 @@
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Selection-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
@@ -132,5 +136,5 @@
     <Compile Include="Push\Configuration\IEnabledExpressionsConfiguration.cs" />
     <Compile Include="Push\Configuration\PushConfigurationBase.cs" />
-    <Compile Include="Push\Configuration\PushConfigurationParameterCollection.cs" />
+    <Compile Include="Push\Configuration\PushConfiguration.cs" />
     <Compile Include="Push\Crossover\AlternationCrossover.cs" />
     <Compile Include="Push\Crossover\IPlushCrossover.cs" />
@@ -218,5 +222,4 @@
     <Compile Include="Push\Configuration\IReadonlyPushConfiguration.cs" />
     <Compile Include="Push\Interpreter\PooledPushInterpreter.cs" />
-    <Compile Include="Push\Configuration\PushConfiguration.cs" />
     <Compile Include="Push\Interpreter\PushInterpreter.cs" />
     <Compile Include="Push\Interpreter\PushInterpreterPool.cs" />
@@ -306,4 +309,8 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="ExpressionsClassDiagramm.cd" />
+    <None Include="packages.config" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 15334)
@@ -44,4 +44,6 @@
   [PluginDependency("HeuristicLab.Random", "3.3")]
   [PluginDependency("HeuristicLab.Selection", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
 
   public class Plugin : PluginBase {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Analyzer/IndividualZeroErrorAnalyzer.cs	(revision 15334)
@@ -23,5 +23,5 @@
     private const string RESULT_PARAMETER_NAME = "Zero Error Individuals Per Case";
     private const string RESULT_PARAMETER_DESCRIPTION = "Relative frequency of instructions aggregated over the whole population.";
-    private const string Y_AXIS_TITLE = "Count of zero error individuals";
+    private const string Y_AXIS_TITLE = "Relative count of zero error individuals";
     private const string X_AXIS_TITLE = "Case Nr";
     private const string ROW_NAME = "Cases";
@@ -134,5 +134,5 @@
             YAxisMaximumFixedValue = 1,
             YAxisMinimumAuto = false,
-            SecondYAxisMaximumAuto = false,
+            YAxisMaximumAuto = false,
             XAxisMinimumFixedValue = 1,
             XAxisMaximumFixedValue = caseCount,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Attributes/PushExpressionAttriubte.cs	(revision 15334)
@@ -20,5 +20,5 @@
     /// Determines the amount of items fetched form the EXEC stack required for this expression. Used for mapping individuals.
     /// </summary>
-    public readonly uint ExecIn;
+    public readonly uint RequiredBlockCount;
 
     /// <summary>
@@ -32,5 +32,5 @@
       string description,
       StackTypes additionalStackDependencies = default(StackTypes),
-      uint execIn = 0,
+      uint requiredBlockCount = 0,
       bool isHidden = false,
       int inExpressionNr = -1) {
@@ -40,5 +40,5 @@
       Name = name;
       Description = description;
-      ExecIn = execIn;
+      RequiredBlockCount = requiredBlockCount;
       IsHidden = isHidden;
       InExpressionNr = inExpressionNr > 0 ? inExpressionNr : default(int?);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 15334)
@@ -9,12 +9,13 @@
     int MaxStringLength { get; }
     int MaxVectorLength { get; }
-    int MaxPointsInProgram { get; }
+    int MaxProgramLength { get; }
     int MaxPointsInRandomExpression { get; }
     bool TopLevelPushCode { get; }
     bool TopLevelPopCode { get; }
-    int MaxParenthesesClose { get; }
-    double ParenthesesCloseBiasLevel { get; }
+    int MaxClose { get; }
+    double CloseBiasLevel { get; }
     IReadOnlyErcOptions ErcOptions { get; }
     string FloatStringFormat { get; }
+    bool TopLevelPushInputArguments { get; }
 
     bool IsStackEnabled(StackTypes stackType);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 15334)
@@ -1,67 +1,187 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Configuration {
   using System.Collections.Generic;
-  using Base.Erc;
-  using Common;
-  using Persistence.Default.CompositeSerializers.Storable;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
 
   [StorableClass]
   public class PushConfiguration : PushConfigurationBase, IReadOnlyPushConfiguration {
+    private const string INSTRUCTIONS_PARAMETER_NAME = "Instructions";
+    private const string INSTRUCTIONS_PARAMETER_DESCRIPTION = "Enables/Disables Instructions";
+    private const string EVAL_PUSH_LIMIT_PARAMETER_NAME = "EvalPushLimit";
+    private const string EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION = "This is the maximum allowed number of \"executions\" in a single top-level call to the interpreter. The execution of a single Push instruction counts as one execution, as does the processing of a single literal, as does the descent into one layer of parentheses (that is, the processing of the \"(\" counts as one execution).";
+    private const string MIN_PROGRAM_LENGTH = "MinProgramLength";
+    private const string MIN_PROGRAM_LENGTH_PARAMETER_DESCRIPTION = "This is the minium size of an item on the CODE/EXEC stack, expressed as a number of points. A point is an instruction, a literal, or a pair of parentheses.";
+    private const string MAX_PROGRAM_LENGTH = "MaxProgramLength";
+    private const string MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION = "This is the maximum size of an item on the CODE/EXEC stack, expressed as a number of points. A point is an instruction, a literal, or a pair of parentheses.";
+    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_NAME = "TopLevelPushCode";
+    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION = "When TRUE (which is the default), code passed to the top level of the interpreter will be pushed onto the CODE stack prior to execution.";
+    private const string TOP_LEVEL_POP_CODE_PARAMETER_NAME = "TopLevelPopCode";
+    private const string TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION = "When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.";
+    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME = "MaxPointsInRandomInstruction";
+    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION = "MaxPointsInRandomInstruction";
+    private const string ERC_OPTIONS_PARAMETER_NAME = "ERC options";
+    private const string MAX_STRING_LENGTH_PARAMETER_NAME = "Max. string length of string literals";
+    private const string MAX_DEPTH_PARAMETER_NAME = "Max. depth of a Push program";
+    private const string MAX_CLOSE_PARAMETER_NAME = "Max. close";
+    private const string MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION = "Specifies how many sub programs are max. closed if open during the recursive translation of an individual to a push program. Value is exclusive.";
+    private const string CLOSE_BIAS_LEVEL_PARAMETER_NAME = "Close bias level";
+    private const string PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION = "Specifies how strong a random value between 0 .. 'Max. parentheses close' is biased towards 0. In other words, this parameter controls the length of sub programs.";
+    private const string MAX_VECTOR_LENGTH_PARAMETER_NAME = "Max. vector length";
+    private const string TOP_LEVEL_PUSH_INPUT_ARGUMENTS = "TopLevelPushInputArguments";
+
     public PushConfiguration() {
-      Name = "Push Configuration";
-
-      ErcOptions = new ErcOptions();
-      EvalPushLimit = 1024;
-      MinPointsInProgram = 25;
-      MaxPointsInProgram = 200;
-      TopLevelPushCode = true;
-      TopLevelPopCode = false;
-      MaxPointsInRandomExpression = 64;
-      MaxStringLength = 1000;
-      MaxVectorLength = 500;
-      MaxDepth = 100;
+      Parameters = new ParameterCollection();
+      InitParameters();
+
       FloatStringFormat = "R";
-      MaxParenthesesClose = 4;
-      ParenthesesCloseBiasLevel = 1;
-    }
-
+    }
+
+    public PushConfiguration(PushConfiguration origin, Cloner cloner) : base(origin, cloner) {
+      Parameters = cloner.Clone(origin.Parameters);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushConfiguration(this, cloner);
+    }
 
     [StorableConstructor]
-    public PushConfiguration(bool deserializing)
-      : base(deserializing) {
-    }
-
-    public PushConfiguration(PushConfiguration origin, Cloner cloner) : base(origin, cloner) {
-
-      ErcOptions = cloner.Clone(origin.ErcOptions);
-      EvalPushLimit = origin.EvalPushLimit;
-      MinPointsInProgram = origin.MinPointsInProgram;
-      MaxPointsInProgram = origin.MaxPointsInProgram;
-      MaxPointsInRandomExpression = origin.MaxPointsInRandomExpression;
-      TopLevelPushCode = origin.TopLevelPushCode;
-      TopLevelPopCode = origin.TopLevelPopCode;
-      MaxStringLength = origin.MaxStringLength;
-      MaxVectorLength = origin.MaxVectorLength;
-      MaxDepth = origin.MaxDepth;
-      FloatStringFormat = origin.FloatStringFormat;
-      MaxParenthesesClose = origin.MaxParenthesesClose;
-      ParenthesesCloseBiasLevel = origin.ParenthesesCloseBiasLevel;
-    }
+    protected PushConfiguration(bool deserialize) { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    // ReSharper disable once UnusedMember.Local
+    private void AfterDeserialization() {
+      InitParameters();
+    }
+
+    [Storable]
+    public ParameterCollection Parameters { get; private set; }
 
     [Storable]
     public string FloatStringFormat { get; set; }
 
-
-    IReadOnlyList<string> IReadOnlyExpressionsConfiguration.EnabledExpressions { get { return enabledExpressions; } }
-
-    [Storable]
-    public int MaxParenthesesClose { get; set; }
-    [Storable]
-    public double ParenthesesCloseBiasLevel { get; set; }
-
-
-    [Storable]
-    public ErcOptions ErcOptions { get; set; }
-
-    IReadOnlyErcOptions IReadOnlyPushConfiguration.ErcOptions { get { return ErcOptions; } }
+    private void InitParameters() {
+      if (!Parameters.ContainsKey(INSTRUCTIONS_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<IExpressionsConfiguration>(
+          INSTRUCTIONS_PARAMETER_NAME,
+          INSTRUCTIONS_PARAMETER_DESCRIPTION,
+          this));
+
+      if (!Parameters.ContainsKey(ERC_OPTIONS_PARAMETER_NAME))
+        Parameters.Add(new ValueParameter<ErcOptions>(ERC_OPTIONS_PARAMETER_NAME));
+
+      if (!Parameters.ContainsKey(MAX_VECTOR_LENGTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_VECTOR_LENGTH_PARAMETER_NAME,
+          new IntValue(500)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(EVAL_PUSH_LIMIT_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          EVAL_PUSH_LIMIT_PARAMETER_NAME,
+          EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION,
+          new IntValue(1000)));
+
+      if (!Parameters.ContainsKey(MAX_PROGRAM_LENGTH))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_PROGRAM_LENGTH,
+          MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION,
+          new IntValue(200)));
+
+      if (!Parameters.ContainsKey(MIN_PROGRAM_LENGTH))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MIN_PROGRAM_LENGTH,
+          MIN_PROGRAM_LENGTH_PARAMETER_DESCRIPTION,
+          new IntValue(0)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_CLOSE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_CLOSE_PARAMETER_NAME,
+          MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION,
+          new IntValue(4)) { Hidden = false });
+
+      if (!Parameters.ContainsKey(CLOSE_BIAS_LEVEL_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<DoubleValue>(
+          CLOSE_BIAS_LEVEL_PARAMETER_NAME,
+          PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION,
+          new DoubleValue(3)) { Hidden = false });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_PUSH_CODE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_PUSH_CODE_PARAMETER_NAME,
+          TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION,
+          new BoolValue(true)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_POP_CODE_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_POP_CODE_PARAMETER_NAME,
+          TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION,
+          new BoolValue(false)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME,
+          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION,
+          new IntValue(50)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_STRING_LENGTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_STRING_LENGTH_PARAMETER_NAME,
+          new IntValue(1000)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(MAX_DEPTH_PARAMETER_NAME))
+        Parameters.Add(new FixedValueParameter<IntValue>(
+          MAX_DEPTH_PARAMETER_NAME,
+          new IntValue(1000)) { Hidden = true });
+
+      if (!Parameters.ContainsKey(TOP_LEVEL_PUSH_INPUT_ARGUMENTS))
+        Parameters.Add(new FixedValueParameter<BoolValue>(
+          TOP_LEVEL_PUSH_INPUT_ARGUMENTS,
+          new BoolValue(true)) { Hidden = false });
+    }
+
+    public IValueParameter<IExpressionsConfiguration> InstructionsParameter
+    {
+      get { return (IValueParameter<IExpressionsConfiguration>)Parameters[INSTRUCTIONS_PARAMETER_NAME]; }
+    }
+
+    public IExpressionsConfiguration Instructions
+    {
+      get { return InstructionsParameter.Value; }
+      set { InstructionsParameter.Value = value; }
+    }
+
+    public IValueParameter<ErcOptions> ErcOptionsParameter
+    {
+      get { return (IValueParameter<ErcOptions>)Parameters[ERC_OPTIONS_PARAMETER_NAME]; }
+    }
+
+    public ErcOptions ErcOptions
+    {
+      get { return ErcOptionsParameter.Value; }
+      set
+      {
+        ErcOptionsParameter.Value = value;
+      }
+    }
+
+    IReadOnlyList<string> IReadOnlyExpressionsConfiguration.EnabledExpressions
+    {
+      get
+      {
+        return enabledExpressions;
+      }
+    }
+
+    IReadOnlyErcOptions IReadOnlyPushConfiguration.ErcOptions
+    {
+      get
+      {
+        return ErcOptions;
+      }
+    }
 
     /// <summary>
@@ -74,21 +194,79 @@
     ///     is up to the calling program.
     /// </summary>
-    [Storable]
-    public int EvalPushLimit { get; set; }
+    public IValueParameter<IntValue> EvalPushLimitParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[EVAL_PUSH_LIMIT_PARAMETER_NAME]; }
+    }
+
+    public int EvalPushLimit
+    {
+      get { return EvalPushLimitParameter.Value.Value; }
+      set { EvalPushLimitParameter.Value.Value = value; }
+    }
+
+
+    /// <summary>
+    /// Determines the likelihood of smaller or bigger values.
+    /// x greater than 1 means that result is biased towards min.
+    /// x smaller than 1 means that result is biased towards max.
+    /// </summary>
+    public IValueParameter<DoubleValue> CloseBiasLevelParameter
+    {
+      get { return (IValueParameter<DoubleValue>)Parameters[CLOSE_BIAS_LEVEL_PARAMETER_NAME]; }
+    }
+
+    public double CloseBiasLevel
+    {
+      get { return CloseBiasLevelParameter.Value.Value; }
+      set { CloseBiasLevelParameter.Value.Value = value; }
+    }
+
+    /// <summary>
+    /// Determines the maximum of blocks which will be closed.
+    /// </summary>
+    public IValueParameter<IntValue> MaxCloseParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_CLOSE_PARAMETER_NAME]; }
+    }
+
+    public int MaxClose
+    {
+      get { return MaxCloseParameter.Value.Value; }
+      set
+      {
+        MaxCloseParameter.Value.Value = value;
+      }
+    }
 
     /// <summary>
     /// This is the maximum of depth a push program can have. Expressions, which lead to exceed this limit are interpreted as NOOP.
     /// </summary>
-    [Storable]
-    public int MaxDepth { get; set; }
-
-    /// <summary>
-    ///     This is the minimum size of an item on the CODE stack, expressed as a number of points.
-    ///     A point is an instruction, a literal, or a pair of parentheses. Any instruction that would cause this limit to be
-    ///     exceeded should instead act as a NOOP, leaving all stacks in the states that they were in before the execution of the
-    ///     instruction.
-    /// </summary>
-    [Storable]
-    public int MinPointsInProgram { get; set; }
+    public IValueParameter<IntValue> MaxDepthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_DEPTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxDepth
+    {
+      get { return MaxDepthParameter.Value.Value; }
+      set
+      {
+        MaxDepthParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MinProgramLengthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MIN_PROGRAM_LENGTH]; }
+    }
+
+    public int MinProgramLength
+    {
+      get { return MinProgramLengthParameter.Value.Value; }
+      set
+      {
+        MinProgramLengthParameter.Value.Value = value;
+      }
+    }
 
     /// <summary>
@@ -98,12 +276,45 @@
     ///     instruction.
     /// </summary>
-    [Storable]
-    public int MaxPointsInProgram { get; set; }
+    public IValueParameter<IntValue> MaxProgramLengthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_PROGRAM_LENGTH]; }
+    }
+
+    public int MaxProgramLength
+    {
+      get { return MaxProgramLengthParameter.Value.Value; }
+      set
+      {
+        MaxProgramLengthParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MaxVectorLengthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_VECTOR_LENGTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxVectorLength
+    {
+      get { return MaxVectorLengthParameter.Value.Value; }
+      set { MaxVectorLengthParameter.Value.Value = value; }
+    }
 
     /// <summary>
     ///     The maximum number of points in an expression produced by the CODE.RAND instruction.
     /// </summary>
-    [Storable]
-    public int MaxPointsInRandomExpression { get; set; }
+    public IValueParameter<IntValue> MaxPointsInRandomExpressionParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME]; }
+    }
+
+    public int MaxPointsInRandomExpression
+    {
+      get { return MaxPointsInRandomExpressionParameter.Value.Value; }
+      set
+      {
+        MaxPointsInRandomExpressionParameter.Value.Value = value;
+      }
+    }
 
     /// <summary>
@@ -111,21 +322,55 @@
     ///     will be pushed onto the CODE stack prior to execution.
     /// </summary>
-    [Storable]
-    public bool TopLevelPushCode { get; set; }
+    public IValueParameter<BoolValue> TopLevelPushCodeParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_PUSH_CODE_PARAMETER_NAME]; }
+    }
+
+    public bool TopLevelPushCode
+    {
+      get { return TopLevelPushCodeParameter.Value.Value; }
+      set
+      {
+        TopLevelPushCodeParameter.Value.Value = value;
+      }
+    }
 
     /// <summary>
     ///     When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.
     /// </summary>
-    [Storable]
-    public bool TopLevelPopCode { get; set; }
-
-    [Storable]
-    public int MaxStringLength { get; set; }
-
-    [Storable]
-    public int MaxVectorLength { get; set; }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushConfiguration(this, cloner);
+    public IValueParameter<BoolValue> TopLevelPopCodeParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_POP_CODE_PARAMETER_NAME]; }
+    }
+
+    public bool TopLevelPopCode
+    {
+      get { return TopLevelPopCodeParameter.Value.Value; }
+      set
+      {
+        TopLevelPopCodeParameter.Value.Value = value;
+      }
+    }
+
+    public IValueParameter<IntValue> MaxStringLengthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[MAX_STRING_LENGTH_PARAMETER_NAME]; }
+    }
+
+    public int MaxStringLength
+    {
+      get { return MaxStringLengthParameter.Value.Value; }
+      set { MaxStringLengthParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> TopLevelPushInputArgumentsParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_PUSH_INPUT_ARGUMENTS]; }
+    }
+
+    public bool TopLevelPushInputArguments
+    {
+      get { return TopLevelPushInputArgumentsParameter.Value.Value; }
+      set { TopLevelPushInputArgumentsParameter.Value.Value = value; }
     }
   }
Index: anches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationParameterCollection.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfigurationParameterCollection.cs	(revision 15333)
+++ 	(revision )
@@ -1,337 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Configuration {
-  using System.Collections.Generic;
-
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Data;
-  using HeuristicLab.Parameters;
-  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
-
-  [StorableClass]
-  public class PushConfigurationParameterCollection : PushConfigurationBase, IReadOnlyPushConfiguration {
-    private const string INSTRUCTIONS_PARAMETER_NAME = "Instructions";
-    private const string INSTRUCTIONS_PARAMETER_DESCRIPTION = "Enables/Disables Instructions";
-    private const string EVAL_PUSH_LIMIT_PARAMETER_NAME = "EvalPushLimit";
-    private const string EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION = "This is the maximum allowed number of \"executions\" in a single top-level call to the interpreter. The execution of a single Push instruction counts as one execution, as does the processing of a single literal, as does the descent into one layer of parentheses (that is, the processing of the \"(\" counts as one execution).";
-    private const string MAX_POINTS_IN_PROGRAM_PARAMETER_NAME = "MaxProgramLength";
-    private const string MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION = "This is the maximum size of an item on the CODE/EXEC stack, expressed as a number of points. A point is an instruction, a literal, or a pair of parentheses.";
-    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_NAME = "TopLevelPushCode";
-    private const string TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION = "When TRUE (which is the default), code passed to the top level of the interpreter will be pushed onto the CODE stack prior to execution.";
-    private const string TOP_LEVEL_POP_CODE_PARAMETER_NAME = "TopLevelPopCode";
-    private const string TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION = "When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.";
-    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME = "MaxPointsInRandomInstruction";
-    private const string MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION = "MaxPointsInRandomInstruction";
-    private const string ERC_OPTIONS_PARAMETER_NAME = "ERC options";
-    private const string MAX_STRING_LENGTH_PARAMETER_NAME = "Max. string length";
-    private const string MAX_DEPTH_PARAMETER_NAME = "Max. program recursion";
-    private const string MAX_PARENTHESES_CLOSE_PARAMETER_NAME = "Max. parentheses close";
-    private const string MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION = "Specifies how many sub programs are closed if open during the recursive translation of an individual to a push program. Value is exclusive.";
-    private const string PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_NAME = "Parentheses close bias level";
-    private const string PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION = "Specifies how strong a random value between 0 .. 'Max. parentheses close' is biased towards 0. In other words, this parameter controls the length of sub programs.";
-    private const string MAX_VECTOR_LENGTH_PARAMETER_NAME = "Max. vector length";
-
-    public PushConfigurationParameterCollection() {
-      Parameters = new ParameterCollection();
-
-      InitParameters();
-    }
-
-    public PushConfigurationParameterCollection(PushConfigurationParameterCollection origin, Cloner cloner) : base(origin, cloner) {
-      Parameters = cloner.Clone(origin.Parameters);
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushConfigurationParameterCollection(this, cloner);
-    }
-
-    [StorableConstructor]
-    protected PushConfigurationParameterCollection(bool deserialize) { }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    // ReSharper disable once UnusedMember.Local
-    private void AfterDeserialization() {
-      InitParameters();
-    }
-
-    [Storable]
-    public ParameterCollection Parameters { get; private set; }
-
-    [Storable]
-    public string FloatStringFormat { get; set; }
-
-    private void InitParameters() {
-      if (!Parameters.ContainsKey(INSTRUCTIONS_PARAMETER_NAME))
-        Parameters.Add(new ValueParameter<IExpressionsConfiguration>(
-          INSTRUCTIONS_PARAMETER_NAME,
-          INSTRUCTIONS_PARAMETER_DESCRIPTION,
-          this));
-
-      if (!Parameters.ContainsKey(ERC_OPTIONS_PARAMETER_NAME))
-        Parameters.Add(new ValueParameter<ErcOptions>(ERC_OPTIONS_PARAMETER_NAME));
-
-      if (!Parameters.ContainsKey(MAX_VECTOR_LENGTH_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_VECTOR_LENGTH_PARAMETER_NAME,
-          new IntValue(500)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(EVAL_PUSH_LIMIT_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          EVAL_PUSH_LIMIT_PARAMETER_NAME,
-          EVAL_PUSH_LIMIT_PARAMETER_DESCRIPTION,
-          new IntValue(1000)));
-
-      if (!Parameters.ContainsKey(MAX_POINTS_IN_PROGRAM_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_POINTS_IN_PROGRAM_PARAMETER_NAME,
-          MAX_PROGRAM_LENGTH_PARAMETER_DESCRIPTION,
-          new IntValue(200)));
-
-      if (!Parameters.ContainsKey(MAX_PARENTHESES_CLOSE_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_PARENTHESES_CLOSE_PARAMETER_NAME,
-          MAX_PARENTHESES_CLOSE_PARAMETER_DESCRIPTION,
-          new IntValue(4)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<DoubleValue>(
-          PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_NAME,
-          PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_DESCRIPTION,
-          new DoubleValue(4)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(TOP_LEVEL_PUSH_CODE_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<BoolValue>(
-          TOP_LEVEL_PUSH_CODE_PARAMETER_NAME,
-          TOP_LEVEL_PUSH_CODE_PARAMETER_DESCRIPTION,
-          new BoolValue(true)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(TOP_LEVEL_POP_CODE_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<BoolValue>(
-          TOP_LEVEL_POP_CODE_PARAMETER_NAME,
-          TOP_LEVEL_POP_CODE_PARAMETER_DESCRIPTION,
-          new BoolValue(false)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME,
-          MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_DESCRIPTION,
-          new IntValue(50)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(MAX_STRING_LENGTH_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_STRING_LENGTH_PARAMETER_NAME,
-          new IntValue(1000)) { Hidden = true });
-
-      if (!Parameters.ContainsKey(MAX_DEPTH_PARAMETER_NAME))
-        Parameters.Add(new FixedValueParameter<IntValue>(
-          MAX_DEPTH_PARAMETER_NAME,
-          new IntValue(1000)) { Hidden = true });
-    }
-
-    public IValueParameter<IExpressionsConfiguration> InstructionsParameter
-    {
-      get { return (IValueParameter<IExpressionsConfiguration>)Parameters[INSTRUCTIONS_PARAMETER_NAME]; }
-    }
-
-    public IExpressionsConfiguration Instructions
-    {
-      get { return InstructionsParameter.Value; }
-      set { InstructionsParameter.Value = value; }
-    }
-
-    public IValueParameter<ErcOptions> ErcOptionsParameter
-    {
-      get { return (IValueParameter<ErcOptions>)Parameters[ERC_OPTIONS_PARAMETER_NAME]; }
-    }
-
-    public ErcOptions ErcOptions
-    {
-      get { return ErcOptionsParameter.Value; }
-      set
-      {
-        ErcOptionsParameter.Value = value;
-      }
-    }
-
-    IReadOnlyList<string> IReadOnlyExpressionsConfiguration.EnabledExpressions
-    {
-      get
-      {
-        return enabledExpressions;
-      }
-    }
-
-    IReadOnlyErcOptions IReadOnlyPushConfiguration.ErcOptions
-    {
-      get
-      {
-        return ErcOptions;
-      }
-    }
-
-    /// <summary>
-    ///     This is the maximum allowed number of "executions" in a single top-level call to the interpreter.
-    ///     The execution of a single Push instruction counts as one execution, as does the processing of a single literal,
-    ///     as does the descent into one layer of parentheses (that is, the processing of the "(" counts as one execution).
-    ///     When this limit is exceeded the interpreter aborts immediately, leaving its stacks in the states they were in prior
-    ///     to the abort (so they may still be examined by a calling program). Whether or not this counts as an "abnormal"
-    ///     termination
-    ///     is up to the calling program.
-    /// </summary>
-    public IValueParameter<IntValue> EvalPushLimitParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[EVAL_PUSH_LIMIT_PARAMETER_NAME]; }
-    }
-
-    public int EvalPushLimit
-    {
-      get { return EvalPushLimitParameter.Value.Value; }
-      set { EvalPushLimitParameter.Value.Value = value; }
-    }
-
-
-    /// <summary>
-    /// Determines the likelyhood of smaller or bigger values.
-    /// x greater than 1 means that result is biased towards min.
-    /// x smaller than 1 means that result is biased towards max.
-    /// </summary>
-    public IValueParameter<DoubleValue> ParenthesesCloseBiasLevelParameter
-    {
-      get { return (IValueParameter<DoubleValue>)Parameters[PARENTHESES_CLOSE_BIAS_LEVEL_PARAMETER_NAME]; }
-    }
-
-    public double ParenthesesCloseBiasLevel
-    {
-      get { return ParenthesesCloseBiasLevelParameter.Value.Value; }
-      set { ParenthesesCloseBiasLevelParameter.Value.Value = value; }
-    }
-
-    /// <summary>
-    /// Determines the maximum of blocks which will be closed.
-    /// </summary>
-    public IValueParameter<IntValue> MaxParenthesesCloseParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_PARENTHESES_CLOSE_PARAMETER_NAME]; }
-    }
-
-    public int MaxParenthesesClose
-    {
-      get { return MaxParenthesesCloseParameter.Value.Value; }
-      set
-      {
-        MaxParenthesesCloseParameter.Value.Value = value;
-      }
-    }
-
-    /// <summary>
-    /// This is the maximum of depth a push program can have. Expressions, which lead to exceed this limit are interpreted as NOOP.
-    /// </summary>
-    public IValueParameter<IntValue> MaxDepthParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_DEPTH_PARAMETER_NAME]; }
-    }
-
-    public int MaxDepth
-    {
-      get { return MaxDepthParameter.Value.Value; }
-      set
-      {
-        MaxDepthParameter.Value.Value = value;
-      }
-    }
-
-    /// <summary>
-    ///     This is the maximum size of an item on the CODE stack, expressed as a number of points.
-    ///     A point is an instruction, a literal, or a pair of parentheses. Any instruction that would cause this limit to be
-    ///     exceeded should instead act as a NOOP, leaving all stacks in the states that they were in before the execution of the
-    ///     instruction.
-    /// </summary>
-    public IValueParameter<IntValue> MaxPointsInProgramParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_POINTS_IN_PROGRAM_PARAMETER_NAME]; }
-    }
-
-    public int MaxPointsInProgram
-    {
-      get { return MaxPointsInProgramParameter.Value.Value; }
-      set
-      {
-        MaxPointsInProgramParameter.Value.Value = value;
-      }
-    }
-
-    public IValueParameter<IntValue> MaxVectorLengthParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_VECTOR_LENGTH_PARAMETER_NAME]; }
-    }
-
-    public int MaxVectorLength
-    {
-      get { return MaxVectorLengthParameter.Value.Value; }
-      set { MaxVectorLengthParameter.Value.Value = value; }
-    }
-
-    /// <summary>
-    ///     The maximum number of points in an expression produced by the CODE.RAND instruction.
-    /// </summary>
-    public IValueParameter<IntValue> MaxPointsInRandomExpressionParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_POINTS_IN_RANDOM_INSTRUCTION_PARAMETER_NAME]; }
-    }
-
-    public int MaxPointsInRandomExpression
-    {
-      get { return MaxPointsInRandomExpressionParameter.Value.Value; }
-      set
-      {
-        MaxPointsInRandomExpressionParameter.Value.Value = value;
-      }
-    }
-
-    /// <summary>
-    ///     When TRUE (which is the default), code passed to the top level of the interpreter
-    ///     will be pushed onto the CODE stack prior to execution.
-    /// </summary>
-    public IValueParameter<BoolValue> TopLevelPushCodeParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_PUSH_CODE_PARAMETER_NAME]; }
-    }
-
-    public bool TopLevelPushCode
-    {
-      get { return TopLevelPushCodeParameter.Value.Value; }
-      set
-      {
-        TopLevelPushCodeParameter.Value.Value = value;
-      }
-    }
-
-    /// <summary>
-    ///     When TRUE, the CODE stack will be popped at the end of top level calls to the interpreter. The default is FALSE.
-    /// </summary>
-    public IValueParameter<BoolValue> TopLevelPopCodeParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[TOP_LEVEL_POP_CODE_PARAMETER_NAME]; }
-    }
-
-    public bool TopLevelPopCode
-    {
-      get { return TopLevelPopCodeParameter.Value.Value; }
-      set
-      {
-        TopLevelPopCodeParameter.Value.Value = value;
-      }
-    }
-
-    public IValueParameter<IntValue> MaxStringLengthParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[MAX_STRING_LENGTH_PARAMETER_NAME]; }
-    }
-
-    public int MaxStringLength
-    {
-      get { return MaxStringLengthParameter.Value.Value; }
-      set { MaxStringLengthParameter.Value.Value = value; }
-    }
-  }
-}
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs	(revision 15334)
@@ -31,7 +31,9 @@
       ChildParameter.ActualName = "PlushVector";
 
+      Parameters.Add(new LookupParameter<IntValue>("MaxProgramLength", "The max length of children"));
+
       Parameters.Add(new FixedValueParameter<PercentValue>("AlternationRate", "Specifies the probability of switching to another parent.", new PercentValue(0.5)));
       Parameters.Add(new FixedValueParameter<DoubleValue>("AlignmentDeviation", "When alternating between parents, the index at which to continue copying may be offset backward or forward some amount based on a random sample from a normal distribution with mean 0 and standard deviation set by the alignment deviation parameter", new DoubleValue(1.0)));
-      Parameters.Add(new FixedValueParameter<IntValue>("MaxLength", "The max length of a children", new IntValue(100)));
+
     }
 
@@ -47,13 +49,13 @@
     }
 
-    public IValueParameter<IntValue> MaxLengthParameter
+    public ILookupParameter<IntValue> MaxProgramLengthParameter
     {
-      get { return (IValueParameter<IntValue>)Parameters["MaxLength"]; }
+      get { return (ILookupParameter<IntValue>)Parameters["MaxProgramLength"]; }
     }
 
-    public int MaxLength
+    public int MaxProgramLength
     {
-      get { return MaxLengthParameter.Value.Value; }
-      set { MaxLengthParameter.Value.Value = value; }
+      get { return MaxProgramLengthParameter.ActualValue.Value; }
+      set { MaxProgramLengthParameter.ActualValue.Value = value; }
     }
 
@@ -98,5 +100,5 @@
         ParentsParameter.ActualValue,
         AlternationRate,
-        MaxLength,
+        MaxProgramLength,
         AlignmentDeviation);
       return base.InstrumentedApply();
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/IPooledObject.cs	(revision 15334)
@@ -1,5 +1,4 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool {
   public interface IPooledObject {
-    void Init();
     void Reset();
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/ManagedPoolProvider.cs	(revision 15334)
@@ -7,4 +7,6 @@
   using System.Reflection;
   using System.Runtime.Serialization.Formatters.Binary;
+
+  using Microsoft.IO;
 
   public interface IManagedPool<T> : IDisposable where T : class, IPooledObject {
@@ -17,6 +19,7 @@
     private readonly ObjectPool<IManagedPool<T>> managedPools;
     private readonly BinaryFormatter binaryFormatter = new BinaryFormatter();
+    private readonly RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager();
     private byte[] dummyPartition;
-    private static volatile object dummyCreationLockObject = new object();
+    private volatile object dummyCreationLockObject = new object();
 
     private static readonly FieldInfo InternalListArrayProperty = typeof(List<T[]>).GetField(
@@ -56,4 +59,5 @@
 
     private T[] CloneDummyPartition() {
+      // init dummy partition
       if (dummyPartition == null) {
         lock (dummyCreationLockObject) {
@@ -65,7 +69,7 @@
             }
 
-            using (var memoryStream = new MemoryStream()) {
-              binaryFormatter.Serialize(memoryStream, temp);
-              dummyPartition = memoryStream.ToArray();
+            using (var ms = recyclableMemoryStreamManager.GetStream("dummyPartition")) {
+              binaryFormatter.Serialize(ms, temp);
+              dummyPartition = ms.ToArray();
             }
           }
@@ -73,12 +77,7 @@
       }
 
-      using (var memoryStream = new MemoryStream(dummyPartition)) {
-        memoryStream.Seek(0, SeekOrigin.Begin);
-
-        var result = (T[])binaryFormatter.Deserialize(memoryStream);
-
-        for (var i = 0; i < result.Length; i++)
-          result[i].Init();
-
+      using (var ms = recyclableMemoryStreamManager.GetStream("dummyPartition", dummyPartition, 0, dummyPartition.Length)) {
+        ms.Seek(0, SeekOrigin.Begin);
+        var result = (T[])binaryFormatter.Deserialize(ms);
         return result;
       }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledList.cs	(revision 15334)
@@ -6,9 +6,4 @@
   [Serializable]
   public class PooledList<T> : List<T>, IPooledObject {
-    public Guid Id { get; private set; }
-
-    void IPooledObject.Init() {
-      Id = Guid.NewGuid();
-    }
 
     void IPooledObject.Reset() {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Data/Pool/PooledObject.cs	(revision 15334)
@@ -20,6 +20,4 @@
     }
 
-    void IPooledObject.Init() { }
-
     public void Reset() {
       resetor(item);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEncoding.cs	(revision 15334)
@@ -27,14 +27,12 @@
       minLengthParameter = new FixedValueParameter<IntValue>(Name + ".MinLength", new IntValue(25));
       maxLengthParameter = new FixedValueParameter<IntValue>(Name + ".MaxLength", new IntValue(100));
-      minCloseParameter = new FixedValueParameter<IntValue>(Name + ".MinClose", new IntValue(0));
       maxCloseParameter = new FixedValueParameter<IntValue>(Name + ".MaxClose", new IntValue(3));
       closeBiasLevelParameter = new FixedValueParameter<DoubleValue>(Name + ".CloseBiasLevel", new DoubleValue(3d));
       instructionsParameter = new ValueParameter<IExpressionsConfiguration>(Name + ".Instructions");
       ercOptionsParameter = new ValueParameter<ErcOptions>(Name + ".ErcOptions");
-      inInstructionProbabilityParameter = new FixedValueParameter<PercentValue>(Name + ".InInstructionProbability");
+      inInstructionProbabilityParameter = new FixedValueParameter<PercentValue>(Name + ".InInstructionProbability", new PercentValue(0.1));
 
       Parameters.Add(minLengthParameter);
       Parameters.Add(maxLengthParameter);
-      Parameters.Add(minCloseParameter);
       Parameters.Add(maxCloseParameter);
       Parameters.Add(closeBiasLevelParameter);
@@ -78,8 +76,4 @@
       ConfigureOperators(Operators);
     }
-    private void OnMinCloseParameterChanged() {
-      RegisterMinCloseParameterEvents();
-      ConfigureOperators(Operators);
-    }
     private void OnMaxCloseParameterChanged() {
       RegisterMaxCloseParameterEvents();
@@ -106,5 +100,4 @@
       RegisterMinLengthParameterEvents();
       RegisterMaxLengthParameterEvents();
-      RegisterMinCloseParameterEvents();
       RegisterMaxCloseParameterEvents();
       RegisterCloseBiasLevelParameterEvents();
@@ -124,9 +117,4 @@
     }
 
-    private void RegisterMinCloseParameterEvents() {
-      MinCloseParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
-      MinCloseParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
-    }
-
     private void RegisterMaxCloseParameterEvents() {
       MaxCloseParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
@@ -156,6 +144,6 @@
     #region Encoding Parameters
     [Storable]
-    private IFixedValueParameter<IntValue> minLengthParameter;
-    public IFixedValueParameter<IntValue> MinLengthParameter
+    private IValueParameter<IntValue> minLengthParameter;
+    public IValueParameter<IntValue> MinLengthParameter
     {
       get { return minLengthParameter; }
@@ -174,6 +162,6 @@
 
     [Storable]
-    private IFixedValueParameter<IntValue> maxLengthParameter;
-    public IFixedValueParameter<IntValue> MaxLengthParameter
+    private IValueParameter<IntValue> maxLengthParameter;
+    public IValueParameter<IntValue> MaxLengthParameter
     {
       get { return maxLengthParameter; }
@@ -192,24 +180,6 @@
 
     [Storable]
-    private IFixedValueParameter<IntValue> minCloseParameter;
-    public IFixedValueParameter<IntValue> MinCloseParameter
-    {
-      get { return minCloseParameter; }
-      set
-      {
-        if (value == null) throw new ArgumentNullException("Min close parameter must not be null.");
-        if (value.Value == null) throw new ArgumentNullException("Min close parameter value must not be null.");
-        if (minCloseParameter == value) return;
-
-        if (minCloseParameter != null) Parameters.Remove(minCloseParameter);
-        minCloseParameter = value;
-        Parameters.Add(minCloseParameter);
-        OnMinCloseParameterChanged();
-      }
-    }
-
-    [Storable]
-    private IFixedValueParameter<IntValue> maxCloseParameter;
-    public IFixedValueParameter<IntValue> MaxCloseParameter
+    private IValueParameter<IntValue> maxCloseParameter;
+    public IValueParameter<IntValue> MaxCloseParameter
     {
       get { return maxCloseParameter; }
@@ -228,6 +198,6 @@
 
     [Storable]
-    private IFixedValueParameter<DoubleValue> closeBiasLevelParameter;
-    public IFixedValueParameter<DoubleValue> CloseBiasLevelParameter
+    private IValueParameter<DoubleValue> closeBiasLevelParameter;
+    public IValueParameter<DoubleValue> CloseBiasLevelParameter
     {
       get { return closeBiasLevelParameter; }
@@ -246,6 +216,6 @@
 
     [Storable]
-    private IFixedValueParameter<PercentValue> inInstructionProbabilityParameter;
-    public IFixedValueParameter<PercentValue> InInstructionProbabilityParameter
+    private IValueParameter<PercentValue> inInstructionProbabilityParameter;
+    public IValueParameter<PercentValue> InInstructionProbabilityParameter
     {
       get { return inInstructionProbabilityParameter; }
@@ -321,10 +291,4 @@
     }
 
-    public int MinClose
-    {
-      get { return MinCloseParameter.Value.Value; }
-      set { MinCloseParameter.Value.Value = value; }
-    }
-
     public int MaxClose
     {
@@ -341,7 +305,7 @@
 
     #region Operator Discovery
-    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    private static readonly IEnumerable<Type> EncodingSpecificOperatorTypes;
     static PlushEncoding() {
-      encodingSpecificOperatorTypes = new List<Type>() {
+      EncodingSpecificOperatorTypes = new List<Type>() {
         typeof (IPlushOperator),
         typeof (IPlushCreator),
@@ -353,5 +317,5 @@
     private void DiscoverOperators() {
       var assembly = typeof(IPlushOperator).Assembly;
-      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(EncodingSpecificOperatorTypes, assembly, true, false, false);
       var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
       var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
@@ -374,6 +338,5 @@
         creator.MinLengthParameter.ActualName = MinLengthParameter.Name;
         creator.MaxLengthParameter.ActualName = MaxLengthParameter.Name;
-        creator.MinCloseParameter.ActualName = MinCloseParameter.Name;
-        creator.MaxCloseParameter.ActualName = MinCloseParameter.Name;
+        creator.MaxCloseParameter.ActualName = MaxCloseParameter.Name;
         creator.CloseBiasLevelParameter.ActualName = CloseBiasLevelParameter.Name;
         creator.ErcOptionsParameter.ActualName = ErcOptionsParameter.Name;
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushEntry.cs	(revision 15334)
@@ -9,4 +9,11 @@
     public PlushEntry() { }
 
+    public PlushEntry(Expression instruction = null, int close = 0, bool silent = false) {
+      Instruction = instruction;
+      Close = close;
+      Silent = silent;
+    }
+
+    [StorableConstructor]
     public PlushEntry(bool deserializing) : base(deserializing) { }
 
@@ -14,4 +21,5 @@
       Instruction = cloner.Clone(origin.Instruction);
       Close = origin.Close;
+      Silent = origin.Silent;
     }
 
@@ -20,4 +28,6 @@
     [Storable]
     public int Close { get; set; }
+    [Storable]
+    public bool Silent { get; set; }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Encoding/PlushVector.cs	(revision 15334)
@@ -1,5 +1,4 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Encoding {
   using System.Collections.Generic;
-
   using HeuristicLab.Common;
   using HeuristicLab.Core;
@@ -9,5 +8,5 @@
 
   [StorableClass]
-  public class PlushVector : Item {
+  public sealed class PlushVector : Item {
 
     [Storable]
@@ -22,9 +21,13 @@
 
     [StorableConstructor]
-    public PlushVector(bool deserializing) : base(deserializing) {
+    private PlushVector(bool deserializing) : base(deserializing) {
     }
 
     public PlushVector(PlushVector origin, Cloner cloner) : base(origin, cloner) {
-      entries = new List<PlushEntry>(origin.entries);
+      entries = new List<PlushEntry>(origin.entries.Count);
+      for (var i = 0; i < origin.entries.Count; i++) {
+        entries.Add(cloner.Clone(origin.entries[i]));
+      }
+
       pushProgram = origin.pushProgram;
     }
@@ -62,27 +65,28 @@
       var instructions = new List<Expression>();
 
-      for (var i = currentIndex; i < entries.Count; i++) {
-        var entry = entries[i];
+      for (; currentIndex < entries.Count; currentIndex++) {
+        var entry = entries[currentIndex];
+
+        if (entry.Silent)
+          continue;
+
+        close += entry.Close;
+        instructions.Add(entry.Instruction);
+
+        PushExpressionAttribute attribute;
         var instructionType = entry.Instruction.GetType();
 
-        close += entry.Close;
-
-        PushExpressionAttribute attribute;
         if (ExpressionTable.TypeToAttributeTable.TryGetValue(instructionType, out attribute)) {
-          for (var blockIdx = 0u; blockIdx < attribute.ExecIn && currentIndex < entries.Count; blockIdx++) {
-            if (close != 0) {
+          for (var blockIdx = 0u; blockIdx < attribute.RequiredBlockCount; blockIdx++) {
+            if (close == 0 && currentIndex < entries.Count) {
+              currentIndex++;
+              var subProgram = FromPlush(ref currentIndex, ref close, depth + 1);
+              instructions.Add(subProgram);
+            } else {
               close--;
               instructions.Add(PushProgram.Empty);
-            } else {
-              currentIndex++;
-              var subProgram = FromPlush(ref currentIndex, ref close, depth + 1);
-              var subExpression = subProgram.Count == 1 ? subProgram.Expressions[0] : subProgram;
-
-              instructions.Add(subExpression);
             }
           }
         }
-
-        instructions.Add(entry.Instruction);
 
         if (close > 0 && depth > 0) {
@@ -96,4 +100,5 @@
       }
 
+      instructions.Reverse();
       return new PushProgram(instructions);
     }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Evaluator/PushBenchmarkSuiteEvaluator.cs	(revision 15334)
@@ -3,4 +3,5 @@
   using System.Collections.Generic;
   using System.Globalization;
+  using System.Linq;
 
   using HeuristicLab.BenchmarkSuite;
@@ -9,4 +10,5 @@
   using HeuristicLab.Parameters;
   using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.ProgramSynthesis.Base.Extensions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
@@ -18,14 +20,14 @@
   public class PushBenchmarkSuiteEvaluator : ParameterizedNamedItem, IPushEvaluator {
 
-    private const string DataBoundsParameterName = "DataBounds";
-    private const string DataParameterName = "Data";
-    private const string DataParameterDescription = "Program Synthesis";
+    private const string DATA_BOUNDS_PARAMETER_NAME = "DataBounds";
+    private const string DATA_PARAMETER_NAME = "Data";
+    private const string DATA_PARAMETER_DESCRIPTION = "Program Synthesis";
 
     public PushBenchmarkSuiteEvaluator() {
-      Parameters.Add(new FixedValueParameter<DataBounds>(DataBoundsParameterName));
+      Parameters.Add(new FixedValueParameter<DataBounds>(DATA_BOUNDS_PARAMETER_NAME));
 
       Parameters.Add(new ValueParameter<ProblemData>(
-        DataParameterName,
-        DataParameterDescription));
+        DATA_PARAMETER_NAME,
+        DATA_PARAMETER_DESCRIPTION));
     }
 
@@ -47,5 +49,5 @@
     public IValueParameter<ProblemData> DataParameter
     {
-      get { return (IValueParameter<ProblemData>)Parameters[DataParameterName]; }
+      get { return (IValueParameter<ProblemData>)Parameters[DATA_PARAMETER_NAME]; }
     }
 
@@ -58,5 +60,5 @@
     public IValueParameter<DataBounds> DataBoundsParameter
     {
-      get { return (IValueParameter<DataBounds>)Parameters[DataBoundsParameterName]; }
+      get { return (IValueParameter<DataBounds>)Parameters[DATA_BOUNDS_PARAMETER_NAME]; }
     }
 
@@ -131,6 +133,48 @@
 
       switch (Data.ProblemType) {
+        // special
         case ProblemType.NumberIO: return NumberIo(interpreter, example);
-        case ProblemType.Median: return Median(interpreter, example);
+        case ProblemType.StringDifferences: return StringDifferences(interpreter, example);
+        case ProblemType.EvenSquares: return EvenSquares(interpreter, example);
+        case ProblemType.WallisPi: return WallisPi(interpreter, example);
+        case ProblemType.VectorSummed: return VectorsSummed(interpreter, example);
+        case ProblemType.XWordLines: return XWordLines(interpreter, example);
+        case ProblemType.NegativeToZero: return NegativeToZero(interpreter, example);
+        case ProblemType.WordStats: return WordStats(interpreter, example);
+        case ProblemType.Checksum: return Checksum(interpreter, example);
+        case ProblemType.Grades: return Grade(interpreter, example);
+        case ProblemType.Syllables: return Syllables(interpreter, example);
+
+        // printed string right/wrong
+        case ProblemType.Smallest:
+        case ProblemType.Median: return PrintedStringRight(interpreter, example);
+
+        // boolean error
+        case ProblemType.MirrorImage:
+        case ProblemType.SuperAnagrams:
+        case ProblemType.CompareStringLengths: return GetDiff(example.OutputBoolean, interpreter.BooleanStack, Data.WorstResult, BooleanDiffer);
+
+        // float error
+        case ProblemType.VectorAverage: return GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision));
+
+        // integer error
+        case ProblemType.LastIndexOfZero:
+        case ProblemType.CountOdds:
+        case ProblemType.SumOfSquares:
+        case ProblemType.ScrabbleScore:
+        case ProblemType.CollatzNumbers: return GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer);
+
+        // levenshtein distance + integer error
+        case ProblemType.ReplaceSpaceWithNewline:
+          return GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, Data.WorstResult)
+               + GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer);
+
+        // printed levenshtein distance
+        case ProblemType.ForLoopIndex:
+        case ProblemType.DoubleLetters:
+        case ProblemType.StringLengthsBackwards:
+        case ProblemType.PigLatin:
+        case ProblemType.Digits:
+        case ProblemType.SmallOrLarge: return GetPrintDiffer(example.OutputPrint, interpreter.PrintStack, Data.WorstResult);
       }
 
@@ -163,10 +207,13 @@
     }
 
-    private double Median(IPushInterpreter interpreter, Example example) {
-      return interpreter.PrintStack.IsEmpty || !interpreter.PrintStack.ToString().Equals(example.OutputPrint) ? 1 : 0;
+    private double PrintedStringRight(IPushInterpreter interpreter, Example example) {
+      return interpreter.PrintStack.IsEmpty ||
+             !interpreter.PrintStack.ToString().Equals(example.OutputPrint)
+             ? 1
+             : 0;
     }
 
     private double NumberIo(IPushInterpreter interpreter, Example example) {
-      if (interpreter.PrintStack.IsEmpty)
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
         return Data.WorstResult;
 
@@ -176,7 +223,7 @@
       if (double.TryParse(printResult, NumberStyles.Number | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out value)) {
         var diff = Math.Abs(example.OutputFloat[0] - value);
-        var result = Math.Min(diff, Data.WorstResult);
-
-        return result;
+        diff = Math.Min(diff, Data.WorstResult);
+
+        return diff;
       }
 
@@ -187,5 +234,248 @@
         Data.WorstResult);
 
-      return levenshteinDistance + penaltyError;
+      var result = levenshteinDistance + penaltyError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double StringDifferences(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return Data.WorstResult;
+      }
+
+      var printResult = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printResult);
+      var lineCountWithCorrectFormat = interpreter.PrintStack.AsStrings().Count(line => {
+        var parts = line.Split(' ');
+
+        if (parts.Length != 3)
+          return false;
+
+        var part0 = parts[0].Trim();
+        if (part0.Length == 0 || !part0.IsNumeric())
+          return false;
+
+        var part1 = parts[1].Trim();
+        if (part1.Length != 1)
+          return false;
+
+        var part2 = parts[2].Trim();
+        if (part2.Length != 1)
+          return false;
+
+        return true;
+      });
+
+      var lineCountWithInvalidFormat = example.OutputPrintLineCount - lineCountWithCorrectFormat;
+      lineCountWithInvalidFormat = Math.Min(lineCountWithInvalidFormat, example.OutputPrintLineCount);
+
+      var result = distance + lineCountWithInvalidFormat;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double EvenSquares(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return Data.WorstResult;
+      }
+
+      var distance = example.OutputPrint.LevenshteinDistance(interpreter.PrintStack.ToString());
+      var printLines = interpreter.PrintStack.AsStrings().ToArray();
+      var lineCountWithCorrectFormat = printLines.Count(line => line.IsNumeric());
+      var lineCountWithInvalidFormat = example.OutputPrintLineCount - lineCountWithCorrectFormat;
+
+      lineCountWithInvalidFormat = Math.Abs(Math.Min(lineCountWithInvalidFormat, example.OutputPrintLineCount));
+
+      var compareLength = Math.Min(printLines.Length, example.OutputPrintLineCount);
+      long integerError = 0;
+
+      for (var i = 0; i < compareLength; i++) {
+        long value;
+        if (long.TryParse(printLines[i], out value)) {
+          integerError += Math.Abs(value - example.OutputIntegerVector[0][i]);
+        } else {
+          integerError += example.OutputPrintLineCount > 0
+            ? (long)(Data.WorstResult / example.OutputPrintLineCount)
+            : 0;
+        }
+      }
+
+      var result = distance + lineCountWithInvalidFormat + integerError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double WallisPi(IPushInterpreter interpreter, Example example) {
+      if (interpreter.FloatStack.IsEmpty)
+        return Data.WorstResult;
+
+      var floatDiff = GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, (a, b) => FloatDiffer(a, b, example.OutputFloatPrecision));
+      var expectedStr = example.OutputFloat[0].ToString(Data.FloatStringFormat, CultureInfo.CurrentCulture);
+      var resultStr = interpreter.FloatStack.TopOrDefault.ToString(Data.FloatStringFormat, CultureInfo.CurrentCulture);
+      var distance = expectedStr.LevenshteinDistance(resultStr);
+
+      var result = floatDiff + distance;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double VectorsSummed(IPushInterpreter interpreter, Example example) {
+      if (interpreter.IntegerVectorStack.IsEmpty && example.OutputIntegerVector.Length > 0)
+        return Data.WorstResult;
+
+      var resultVector = interpreter.IntegerVectorStack[0];
+      var expectedVector = example.OutputIntegerVector[0];
+      var comparableLength = Math.Min(resultVector.Count, expectedVector.Length);
+
+      // add penalty if length does not match
+      var result = expectedVector.Length > 0
+        ? (expectedVector.Length - comparableLength) * (Data.WorstResult / expectedVector.Length)
+        : 0;
+
+      for (var i = 0; i < comparableLength; i++) {
+        result += Math.Abs(resultVector[i] - expectedVector[i]);
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double XWordLines(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var estimatedWordsPerLineCount = example.InputInteger[0];
+      var estimatedWordCount = example.OutputInteger[0];
+      var estimatedLastWordCount = estimatedWordCount - estimatedWordsPerLineCount * Math.Max(0, example.OutputPrintLineCount - 1);
+      var printResult = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printResult);
+      var lineCount = interpreter.PrintStack.Count;
+      var lineCountError = Math.Abs(example.OutputPrintLineCount - lineCount);
+      var totalWordsPerLineError = 0L;
+
+      for (var i = 0; i < interpreter.PrintStack.Lines.Count - 1; i++) {
+        totalWordsPerLineError += Math.Abs(interpreter.PrintStack.Lines[i].Split(' ').Length - estimatedWordsPerLineCount);
+      }
+
+      // last line
+      var lastLine = interpreter.PrintStack.Lines[interpreter.PrintStack.Lines.Count - 1];
+      totalWordsPerLineError += Math.Abs(lastLine.Split(' ').Length - estimatedLastWordCount);
+
+      var result = distance + lineCountError + totalWordsPerLineError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double NegativeToZero(IPushInterpreter interpreter, Example example) {
+      if (interpreter.IntegerVectorStack.IsEmpty && example.OutputIntegerVector.Length > 0)
+        return Data.WorstResult;
+
+      var resultVector = interpreter.IntegerVectorStack.Top;
+      var expectedVector = example.OutputIntegerVector[0];
+      var comparableLength = Math.Min(resultVector.Count, expectedVector.Length);
+
+      // add penalty if length does not match
+      var result = expectedVector.Length > 0
+        ? (expectedVector.Length - comparableLength) * (Data.WorstResult / expectedVector.Length)
+        : 0;
+
+      for (var i = 0; i < comparableLength; i++) {
+        var expectedStr = expectedVector[i].ToString();
+        var resultStr = resultVector[i].ToString();
+        result += expectedStr.LevenshteinDistance(resultStr);
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double WordStats(IPushInterpreter interpreter, Example example) {
+      if (string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty) {
+        return 0.0;
+      }
+
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      var statsError = 0.0;
+      long numberOfSentences;
+      var expectedNumberOfSentences = example.OutputInteger[0];
+      statsError += BenchmarkSuite.Problems.WordStats.GetNumberOfSentences(printStr, out numberOfSentences)
+        ? Math.Abs(expectedNumberOfSentences - numberOfSentences)
+        : Data.WorstResult / 3.0;
+
+      double averageSentenceLength;
+      var expectedAverageSentenceLength = example.OutputFloat[0];
+      statsError += BenchmarkSuite.Problems.WordStats.GetAverageSentenceLength(printStr, out averageSentenceLength)
+        ? Math.Abs(expectedAverageSentenceLength - averageSentenceLength)
+        : Data.WorstResult / 3.0;
+
+      var result = distance + statsError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Checksum(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      var expectedLastCharIndex = example.OutputPrint.Length - 1;
+      var result = distance;
+
+      if (expectedLastCharIndex >= 0) {
+        var expectedLastChar = example.OutputPrint[expectedLastCharIndex];
+        var resultLastCharIndex = printStr.Length - 1;
+
+        if (resultLastCharIndex >= 0) {
+          var resultLastChar = printStr[resultLastCharIndex];
+          result += Math.Abs(expectedLastChar - resultLastChar);
+        }
+      }
+
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Syllables(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      long numberOfSyllables;
+      var expectedNumberOfSyllables = example.OutputInteger[0];
+      var numberOfSyllablesError = BenchmarkSuite.Problems.Syllables.GetNumberOfSyllables(printStr, out numberOfSyllables)
+        ? Math.Abs(expectedNumberOfSyllables - numberOfSyllables)
+        : Data.WorstResult / 2.0;
+
+      var result = distance + numberOfSyllablesError;
+      return Math.Min(result, Data.WorstResult);
+    }
+
+    private double Grade(IPushInterpreter interpreter, Example example) {
+      if (!string.IsNullOrEmpty(example.OutputPrint) && interpreter.PrintStack.IsEmpty)
+        return Data.WorstResult;
+
+      var printStr = interpreter.PrintStack.ToString();
+      var distance = example.OutputPrint.LevenshteinDistance(printStr);
+
+      char grade;
+      var expectedGrade = example.OutputChar[0];
+      var gradeError = BenchmarkSuite.Problems.Grades.GetGrade(printStr, out grade)
+        ? Math.Abs(expectedGrade - grade)
+        : Data.WorstResult / 2;
+
+      var result = distance + gradeError;
+      return Math.Min(result, Data.WorstResult);
     }
 
@@ -215,5 +505,5 @@
 
     private static double StringDiffer(string a, string b) {
-      return LevenshteinDistance(a, b);
+      return a.LevenshteinDistance(b);
     }
 
@@ -240,5 +530,5 @@
 
     private static double GetPrintDiffer(string estimated, string printResult, double worstResult) {
-      var distance = LevenshteinDistance(estimated, printResult);
+      var distance = estimated.LevenshteinDistance(printResult);
 
       return Math.Min(distance, worstResult);
@@ -247,5 +537,5 @@
     private static double GetPrintDiffer(string estimated, IPrintStack printStack, double worstResult) {
       var printResult = printStack.ToString();
-      var distance = LevenshteinDistance(estimated, printResult);
+      var distance = estimated.LevenshteinDistance(printResult);
 
       return Math.Min(distance, worstResult);
@@ -293,49 +583,4 @@
       return diff;
     }
-
-    /// <summary>
-    /// https://www.dotnetperls.com/levenshtein
-    /// </summary>
-    private static int LevenshteinDistance(string source, string target) {
-      if (source == null && target == null) return 0;
-      if (source == null) return target.Length;
-      if (target == null) return source.Length;
-
-      int n = source.Length;
-      int m = target.Length;
-      int[,] d = new int[n + 1, m + 1];
-
-      // Step 1
-      if (n == 0) {
-        return m;
-      }
-
-      if (m == 0) {
-        return n;
-      }
-
-      // Step 2
-      for (int i = 0; i <= n; d[i, 0] = i++) {
-      }
-
-      for (int j = 0; j <= m; d[0, j] = j++) {
-      }
-
-      // Step 3
-      for (int i = 1; i <= n; i++) {
-        //Step 4
-        for (int j = 1; j <= m; j++) {
-          // Step 5
-          int cost = (target[j - 1] == source[i - 1]) ? 0 : 1;
-
-          // Step 6
-          d[i, j] = Math.Min(
-              Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
-              d[i - 1, j - 1] + cost);
-        }
-      }
-      // Step 7
-      return d[n, m];
-    }
   }
 }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs	(revision 15334)
@@ -94,5 +94,6 @@
     "CODE.QUOTE",
     "Specifies that the next expression submitted for execution will instead be pushed literally onto the CODE stack.",
-    StackTypes.Exec)]
+    StackTypes.Exec,
+    requiredBlockCount: 1)]
   [StorableClass]
   public class CodeQuoteExpression : StatelessExpression {
@@ -175,13 +176,13 @@
 
           if (secondProgram.Depth > interpreter.Configuration.MaxDepth ||
-              firstProgram.Count + secondProgram.Count > interpreter.Configuration.MaxPointsInProgram)
+              firstProgram.Count + secondProgram.Count > interpreter.Configuration.MaxProgramLength)
             return;
-        } else if (firstProgram.Count + 1 > interpreter.Configuration.MaxPointsInProgram) return;
+        } else if (firstProgram.Count + 1 > interpreter.Configuration.MaxProgramLength) return;
       } else if (second.IsProgram) {
         secondProgram = (PushProgram)second;
 
         if (secondProgram.Depth > interpreter.Configuration.MaxDepth
-            || secondProgram.Count + 1 > interpreter.Configuration.MaxPointsInProgram) return;
-      } else if (interpreter.Configuration.MaxPointsInProgram <= 2) {
+            || secondProgram.Count + 1 > interpreter.Configuration.MaxProgramLength) return;
+      } else if (interpreter.Configuration.MaxProgramLength <= 2) {
         return;
       }
@@ -318,5 +319,5 @@
       return interpreter.CodeStack.Count < 2 ||
             (interpreter.CodeStack.Top.IsProgram &&
-            ((PushProgram)interpreter.CodeStack.Top).Expressions.Count + 1 > interpreter.Configuration.MaxPointsInProgram);
+            ((PushProgram)interpreter.CodeStack.Top).Expressions.Count + 1 > interpreter.Configuration.MaxProgramLength);
     }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DefineExpressions.cs	(revision 15334)
@@ -68,5 +68,5 @@
     "Defines the name on top of the NAME stack as an instruction that will push the top item of the EXEC stack onto the EXEC stack.",
     StackTypes.Name,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   [StorableClass]
   public class ExecDefineExpression : DefineExpression<Expression> {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoCountExpressions.cs	(revision 15334)
@@ -57,5 +57,5 @@
     "An iteration instruction that performs a loop (the body of which is taken from the EXEC stack) the number of times indicated by the INTEGER argument, pushing an index (which runs from zero to one less than the number of iterations) onto the INTEGER stack prior to each execution of the loop body.",
     StackTypes.Integer,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   public class ExecDoCountExpression : StatelessExpression {
     public ExecDoCountExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoRangeExpressions.cs	(revision 15334)
@@ -83,5 +83,5 @@
     description: "An iteration instruction that executes the top item on the EXEC stack a number of times that depends on the top two integers, while also pushing the loop counter onto the INTEGER stack for possible access during the execution of the body of the loop.",
     additionalStackDependencies: StackTypes.Integer,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   public class ExecDoRangeExpression : StatelessExpression {
     public ExecDoRangeExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DoTimesExpressions.cs	(revision 15334)
@@ -68,5 +68,5 @@
   [Serializable]
   [StorableClass]
-  [PushExpression(StackTypes.Exec, "EXEC.DO*TIMES", "Like EXEC.DO*COUNT but does not push the loop counter", StackTypes.Integer, execIn: 1)]
+  [PushExpression(StackTypes.Exec, "EXEC.DO*TIMES", "Like EXEC.DO*COUNT but does not push the loop counter", StackTypes.Integer, requiredBlockCount: 1)]
   public class ExecDoTimesExpression : StatelessExpression {
     public ExecDoTimesExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/DuplicateExpressions.cs	(revision 15334)
@@ -88,5 +88,5 @@
 
   [StorableClass]
-  [PushExpression(StackTypes.Exec, "EXEC.DUP", "Duplicates the top item on the EXEC stack." , execIn: 1)]
+  [PushExpression(StackTypes.Exec, "EXEC.DUP", "Duplicates the top item on the EXEC stack." , requiredBlockCount: 1)]
   public class ExecDuplicateExpression : DuplicateExpression<Expression> {
     public ExecDuplicateExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EmptyExpression.cs	(revision 15334)
@@ -72,4 +72,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.Float,
@@ -85,9 +86,9 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.Boolean,
     "BOOLEAN.EMPTY",
-    "Pushes TRUE onto the BOOLEAN stack if the BOOLEAN stack is empty, otherwise FALSE.",
-    StackTypes.Boolean)]
+    "Pushes TRUE onto the BOOLEAN stack if the BOOLEAN stack is empty, otherwise FALSE.")]
   public class BooleanEmptyExpression : EmptyExpression<bool> {
     public BooleanEmptyExpression() { }
@@ -99,4 +100,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.Char,
@@ -113,4 +115,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.String,
@@ -127,4 +130,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.IntegerVector,
@@ -141,4 +145,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.FloatVector,
@@ -155,4 +160,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.BooleanVector,
@@ -169,4 +175,5 @@
   }
 
+  [StorableClass]
   [PushExpression(
     StackTypes.StringVector,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 15334)
@@ -83,6 +83,5 @@
     StackTypes.Boolean,
     "BOOLEAN.=",
-    "Pushes TRUE onto the BOOLEAN stack if the top two BOOLEAN items are equal, or FALSE otherwise.",
-    StackTypes.Boolean)]
+    "Pushes TRUE onto the BOOLEAN stack if the top two BOOLEAN items are equal, or FALSE otherwise.")]
   public class BooleanEqualsExpression : EqualsExpression<bool> {
     public BooleanEqualsExpression() { }
@@ -125,5 +124,5 @@
     "Pushes TRUE onto the BOOLEAN stack if the top two EXEC items are equal, or FALSE otherwise.",
     StackTypes.Boolean,
-    execIn: 0)]
+    requiredBlockCount: 0)]
   public class ExecEqualsExpression : EqualsExpression<Expression> {
     public ExecEqualsExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExecExpressions.cs	(revision 15334)
@@ -20,5 +20,5 @@
     "If the top item of the BOOLEAN stack is TRUE then this removes the second item on the EXEC stack, leaving the first item to be executed. If it is false then it removes the first item, leaving the second to be executed.",
     StackTypes.Boolean,
-    execIn: 2)]
+    requiredBlockCount: 2)]
   public class ExecIfExpression : StatelessExpression {
     public ExecIfExpression() { }
@@ -45,5 +45,5 @@
     "EXEC.Y",
     "Inserts beneath the top item of the EXEC stack a new item of the form \"( EXEC.Y <TopItem> )\"",
-    execIn: 1)]
+    requiredBlockCount: 1)]
   [StorableClass]
   public class ExecYExpression : StatelessExpression {
@@ -54,5 +54,5 @@
     public override bool IsNoop(IInternalPushInterpreter interpreter) {
       return interpreter.ExecStack.Count == 0 ||
-             interpreter.Configuration.MaxPointsInProgram < 2 ||
+             interpreter.Configuration.MaxProgramLength < 2 ||
              (interpreter.ExecStack.Top.IsProgram && ((PushProgram)interpreter.ExecStack.Top).Depth == interpreter.Configuration.MaxDepth);
     }
@@ -80,5 +80,5 @@
     "EXEC.K",
     "Removes the second item on the EXEC stack.",
-    execIn: 2)]
+    requiredBlockCount: 2)]
   [StorableClass]
   public class ExecKExpression : StatelessExpression {
@@ -106,5 +106,5 @@
     "EXEC.S",
     "Pops 3 items from the EXEC stack called A, B, and C. Then pushes a list containing B and C back onto the EXEC stack, followed by another instance of C, followed by another instance of A.",
-    execIn: 3)]
+    requiredBlockCount: 3)]
   [StorableClass]
   public class ExecSExpression : StatelessExpression {
@@ -167,5 +167,5 @@
     "EXEC.WHILE",
     "Executes top EXEC item recursively as long top BOOLEAN is TRUE.",
-    StackTypes.Boolean, execIn: 1)]
+    StackTypes.Boolean, requiredBlockCount: 1)]
   [StorableClass]
   public class ExecWhileExpression : StatelessExpression {
@@ -196,5 +196,5 @@
     "EXEC.DO*WHILE",
     "Executes top EXEC item recursively until max. amount of eval. expressions is reached or top EXEC item removes the the recursive call.",
-    execIn: 1)]
+    requiredBlockCount: 1)]
   [StorableClass]
   public class ExecDoWhileExpression : StatelessExpression {
@@ -220,5 +220,5 @@
     "Top EXEC item is only executed, if top BOOLEAN is TRUE.",
     StackTypes.Boolean,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   [StorableClass]
   public class ExecWhenExpression : StatelessExpression {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/Expression.cs	(revision 15334)
@@ -1,5 +1,4 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
   using System;
-  using System.Collections.Generic;
 
   using HeuristicLab.Common;
@@ -20,10 +19,5 @@
     public bool IsProgram { get { return GetType() == typeof(PushProgram); } }
 
-    public static readonly IReadOnlyCollection<Expression> EmptyContainer = new Expression[0];
-
-    public abstract string StringRepresentation
-    {
-      get;
-    }
+    public abstract string StringRepresentation { get; }
 
     public abstract bool IsNoop(IInternalPushInterpreter interpreter);
@@ -43,5 +37,5 @@
 
     public object Clone() {
-      return Clone(new Cloner());
+      return this;
     }
 
@@ -50,6 +44,4 @@
     }
 
-    void IPooledObject.Init() { }
-
     void IPooledObject.Reset() { }
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ExpressionTable.cs	(revision 15334)
@@ -6,4 +6,7 @@
   using Attributes;
   using Data.Pool;
+
+  using HeuristicLab.Problems.ProgramSynthesis.Base.Extensions;
+
   using Stack;
 
@@ -124,27 +127,5 @@
     }
 
-    private static bool IsSubclassOf(Type type, Type baseType) {
-      if (type == null || baseType == null || type == baseType)
-        return false;
-
-      if (baseType.IsGenericType == false) {
-        if (type.IsGenericType == false)
-          return type.IsSubclassOf(baseType);
-      } else {
-        baseType = baseType.GetGenericTypeDefinition();
-      }
-
-      type = type.BaseType;
-      var objectType = typeof(object);
-      while (type != objectType && type != null) {
-        var curentType = type.IsGenericType ? type.GetGenericTypeDefinition() : type;
-        if (curentType == baseType)
-          return true;
-
-        type = type.BaseType;
-      }
-
-      return false;
-    }
+
 
     private static IEnumerable<Type> GetExpressionTypes(Type baseType) {
@@ -152,5 +133,5 @@
              from assemblyType in domainAssembly.GetTypes()
              where !assemblyType.IsAbstract &&
-                   IsSubclassOf(assemblyType, baseType) &&
+                   assemblyType.IsSubclass(baseType) &&
                    assemblyType.GetConstructor(Type.EmptyTypes) != null
              select assemblyType;
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/FloatExpressions.cs	(revision 15334)
@@ -341,4 +341,5 @@
   /// </summary>
   [PushExpression(StackTypes.Float, "FLOAT.COS", "Pushes the cosine of the top item.")]
+  [StorableClass]
   public class FloatCosineExpression : StatelessExpression {
     public FloatCosineExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PopExpressions.cs	(revision 15334)
@@ -84,5 +84,5 @@
 
   [StorableClass]
-  [PushExpression(StackTypes.Exec, "EXEC.POP", "Pops the top EXEC item.", execIn: 1)]
+  [PushExpression(StackTypes.Exec, "EXEC.POP", "Pops the top EXEC item.", requiredBlockCount: 1)]
   public class ExecPopExpression : PopExpression<Expression> {
     public ExecPopExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 15334)
@@ -26,4 +26,20 @@
 
   [StorableClass]
+  [PushExpression(StackTypes.Print, "PRINT.ENSURE_NEWLINE", "Pushes an empty string onto the PRINT STACK if current line isn't empty already.")]
+  public class PrintEnsureNewLineExpression : StatelessExpression {
+    public PrintEnsureNewLineExpression() { }
+    [StorableConstructor]
+    protected PrintEnsureNewLineExpression(bool deserializing) : base(deserializing) { }
+
+    public override bool IsNoop(IInternalPushInterpreter interpreter) {
+      return interpreter.PrintStack.IsCurrentLineEmpty;
+    }
+
+    public override void Eval(IInternalPushInterpreter interpreter) {
+      interpreter.PrintStack.NewLine();
+    }
+  }
+
+  [StorableClass]
   public abstract class PrintExpression<T> : StatelessExpression {
     protected PrintExpression() { }
@@ -104,5 +120,5 @@
     "Pushes the top BOOLEAN onto the EXEC stack.",
     StackTypes.Exec,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   public class ExecPrintExpression : PrintExpression<Expression> {
     public ExecPrintExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PushProgram.cs	(revision 15334)
@@ -5,4 +5,6 @@
 namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
   using System.Diagnostics;
+  using System.Diagnostics.CodeAnalysis;
+
   using Constants;
   using Data.Pool;
@@ -38,5 +40,5 @@
 
     [StorableConstructor]
-    public PushProgram(bool deserializing) : this(EmptyExpressions) { }
+    private PushProgram(bool deserializing) : this(EmptyExpressions) { }
 
     public PushProgram(IReadOnlyList<Expression> expressions) {
@@ -67,6 +69,4 @@
     }
 
-    void IPooledObject.Init() { }
-
     void IPooledObject.Reset() {
       expressions = null;
@@ -159,4 +159,5 @@
     [NonSerialized]
     private int? hashCode;
+    [SuppressMessage("ReSharper", "NonReadonlyMemberInGetHashCode")]
     public override int GetHashCode() {
       if (hashCode == null) hashCode = expressions.HashCode();
@@ -256,19 +257,20 @@
       get
       {
-        if (branches == null) {
-          branches = 1;
-
-          for (var i = 0; i < Count; i++) {
-            var expression = expressions[i];
-
-            if (!expression.IsProgram)
-              continue;
-
-            var program = (PushProgram)expression;
-            branches += program.Branches;
-          }
-        }
-
+        if (branches == null) CountBranches();
         return branches.Value;
+      }
+    }
+
+    private void CountBranches() {
+      branches = 1;
+
+      for (var i = 0; i < Count; i++) {
+        var expression = expressions[i];
+
+        if (!expression.IsProgram)
+          continue;
+
+        var program = (PushProgram)expression;
+        branches += program.Branches;
       }
     }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RotateExpressions.cs	(revision 15334)
@@ -100,5 +100,5 @@
     "EXEC.ROT",
     "Rotates the top 3 items of the EXEC stack clockwise.",
-    execIn: 3)]
+    requiredBlockCount: 3)]
   [StorableClass]
   public class ExecRotateExpression : RotateExpression<Expression> {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/ShoveExpressions.cs	(revision 15334)
@@ -107,5 +107,5 @@
     "Moves the top EXEC item to a specific stack index, whereby the index is taken from the INTEGER stack.",
     StackTypes.Integer,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   [StorableClass]
   public class ExecShoveExpression : ShoveExpression<Expression> {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StatefulExpression.cs	(revision 15334)
@@ -69,6 +69,4 @@
     }
 
-    void IPooledObject.Init() { }
-
     public void Reset() {
       State = default(T);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/StringExpressions.cs	(revision 15334)
@@ -122,5 +122,5 @@
     public override bool IsNoop(IInternalPushInterpreter interpreter) {
       return interpreter.StringStack.Count < 2 ||
-             interpreter.StringStack.Top.Length + interpreter.StringStack[1].Length >= interpreter.Configuration.MaxStringLength;
+             interpreter.StringStack.Top.Length + interpreter.StringStack[1].Length > interpreter.Configuration.MaxStringLength;
     }
 
@@ -148,5 +148,5 @@
       return interpreter.StringStack.IsEmpty ||
              interpreter.CharStack.IsEmpty ||
-             interpreter.StringStack.Top.Length + 1 >= interpreter.Configuration.MaxStringLength;
+             interpreter.StringStack.Top.Length + 1 > interpreter.Configuration.MaxStringLength;
     }
 
@@ -618,12 +618,24 @@
 
     public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = GetResultString(interpreter);
+
+      // Should be checked in isNoop but would require to calculate result twice which is an expensive operation
+      if (result.Length > interpreter.Configuration.MaxStringLength)
+        return;
+
+      interpreter.StringStack.Remove(2);
+      interpreter.StringStack.Top = result;
+    }
+
+    private static string GetResultString(IInternalPushInterpreter interpreter) {
       var third = interpreter.StringStack[2];
       var second = interpreter.StringStack[1];
       var first = interpreter.StringStack[0];
-      interpreter.StringStack.Remove(2);
-
-      interpreter.StringStack.Top = third.Length == 0 || second.Length == 0
+
+      var result = third.Length == 0 || second.Length == 0
         ? third
         : third.Replace(second, first);
+
+      return result;
     }
   }
@@ -647,12 +659,23 @@
 
     public override void Eval(IInternalPushInterpreter interpreter) {
+      var result = GetResultString(interpreter);
+
+      // Should be checked in isNoop but would require to calculate result twice which is an expensive operation
+      if (result.Length > interpreter.Configuration.MaxStringLength)
+        return;
+
+      interpreter.StringStack.Remove(2);
+      interpreter.StringStack.Top = result;
+    }
+
+    private static string GetResultString(IInternalPushInterpreter interpreter) {
       var third = interpreter.StringStack[2];
       var second = interpreter.StringStack[1];
       var first = interpreter.StringStack[0];
-      interpreter.StringStack.Remove(2);
-
-      interpreter.StringStack.Top = third.Length == 0 || second.Length == 0
+
+      var result = third.Length == 0 || second.Length == 0
         ? third
         : ReplaceFirst(third, second, first);
+      return result;
     }
 
@@ -802,5 +825,5 @@
     "STRING.ITERATE",
     "Iterates over the top STRING using the CODE on the EXEC stack.",
-    StackTypes.Exec | StackTypes.Char, execIn: 1)]
+    StackTypes.Exec | StackTypes.Char, requiredBlockCount: 1)]
   public class StringIterateExpression : StatelessExpression {
     public StringIterateExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/SwapExpressions.cs	(revision 15334)
@@ -104,5 +104,5 @@
     "EXEC.SWAP",
     "Swaps the top two items on the stack.",
-    execIn: 2)]
+    requiredBlockCount: 2)]
   public class ExecSwapExpression : SwapExpression<Expression> {
     public ExecSwapExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/VectorIterateExpressions.cs	(revision 15334)
@@ -67,5 +67,5 @@
     "Iterates in reverse order (due to performance reasons) over the top INTEGER[] using the top item of the EXEC stack.",
     StackTypes.Integer | StackTypes.Exec,
-    execIn: 1)]
+    requiredBlockCount: 1)]
   public class IntegerVectorIterateExpression : VectorIterateExpression<long> {
     public IntegerVectorIterateExpression() { }
@@ -87,5 +87,5 @@
     "FLOAT[].ITERATE",
     "Iterates in reverse order (due to performance reasons) over the top FLOAT[] using the top item of the EXEC stack.",
-    StackTypes.Float | StackTypes.Exec, execIn: 1)]
+    StackTypes.Float | StackTypes.Exec, requiredBlockCount: 1)]
   public class FloatVectorIterateExpression : VectorIterateExpression<double> {
     public FloatVectorIterateExpression() { }
@@ -107,5 +107,5 @@
     "BOOLEAN[].ITERATE",
     "Iterates in reverse order (due to performance reasons) over the top BOOLEAN[] using the top item of the EXEC stack.",
-    StackTypes.Boolean | StackTypes.Exec, execIn: 1)]
+    StackTypes.Boolean | StackTypes.Exec, requiredBlockCount: 1)]
   public class BooleanVectorIterateExpression : VectorIterateExpression<bool> {
     public BooleanVectorIterateExpression() { }
@@ -127,5 +127,5 @@
     "STRING[].ITERATE",
     "Iterates in reverse order (due to performance reasons) over the top STRING[] using the top item of the EXEC stack.",
-    StackTypes.String | StackTypes.Exec, execIn: 1)]
+    StackTypes.String | StackTypes.Exec, requiredBlockCount: 1)]
   public class StringVectorIterateExpression : VectorIterateExpression<string> {
     public StringVectorIterateExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankDuplicateExpressions.cs	(revision 15334)
@@ -116,5 +116,5 @@
     "EXEC.YANKDUP",
     "Pushes a copy of an indexed item \"deep\" in the stack onto the top of the stack, without removing the deep item.",
-    StackTypes.Integer, execIn: 0)]
+    StackTypes.Integer, requiredBlockCount: 0)]
   public class ExecYankDuplicateExpression : YankDuplicateExpression<Expression> {
     public ExecYankDuplicateExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/YankExpressions.cs	(revision 15334)
@@ -115,5 +115,5 @@
     "Removes an indexed item from \"deep\" in the stack and pushes it on top of the stack.",
     StackTypes.Integer,
-    execIn: 0)]
+    requiredBlockCount: 0)]
   public class ExecYankExpression : YankExpression<Expression> {
     public ExecYankExpression() { }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Extensions/ControlExntensions.cs	(revision 15334)
@@ -17,4 +17,5 @@
 
       if (propertyInfo == null ||
+          // ReSharper disable once AssignNullToNotNullAttribute
           !control.GetType().IsSubclassOf(propertyInfo.ReflectedType) ||
           control.GetType().GetProperty(
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Individual/InduvidualMapper.cs	(revision 15334)
@@ -47,6 +47,6 @@
         var expressionType = expression.GetType();
 
-        if (config.ParenthesesCloseBiasLevel > 0) {
-          close += random.NextBiased(0, config.MaxParenthesesClose, config.ParenthesesCloseBiasLevel);
+        if (config.CloseBiasLevel > 0) {
+          close += random.NextBiased(0, config.MaxClose, config.CloseBiasLevel);
 
           // check if expression requires additional blocks
@@ -54,5 +54,5 @@
             var attr = ExpressionTable.TypeToAttributeTable[expressionType];
 
-            for (var blockIdx = 0u; blockIdx < attr.ExecIn && currentIndex < vector.Length; blockIdx++) {
+            for (var blockIdx = 0u; blockIdx < attr.RequiredBlockCount && currentIndex < vector.Length; blockIdx++) {
               if (close != 0) {
                 close--;
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15334)
@@ -77,12 +77,22 @@
 
     public static void PrintStacks(this IPushInterpreter interpreter) {
+      var maxStackNameLength = interpreter.Stacks.Max(x => x.Key.ToString().Length);
+      var totalLength = maxStackNameLength + 6;
+
       foreach (var pair in interpreter.Stacks) {
         var stackName = pair.Key.ToString();
         var stack = interpreter.Stacks[pair.Key];
 
-        if (stack.IsEmpty || !stack.IsEnabled) continue;
+        if (stack.IsEmpty || !stack.IsEnabled)
+          continue;
 
-        var stackString = string.Join(" ", interpreter.StringifyStack(pair.Key).Reverse());
-        Console.WriteLine("--------- {0} ---------\n{1}\n", stackName, stackString);
+        var stackString = string.Join(" ", interpreter.StringifyStack(pair.Key));
+
+        //var padLength = (totalLength - stackName.Length) / 2;
+        //var padLengthLeft = stackName.Length + padLength;
+        //var padLengthRight = padLengthLeft + padLength;
+        //Console.WriteLine("{0}\n{1}\n", stackName.PadLeft(padLengthLeft, '-').PadRight(padLengthRight, '-'), stackString);
+
+        Console.WriteLine("{0}: {1}", stackName, stackString);
       }
 
@@ -96,13 +106,16 @@
 
     public static void InitExample(this IPushInterpreter interpreter, Example example) {
-      interpreter.BooleanStack.Push(example.InputBoolean);
-      interpreter.IntegerStack.Push(example.InputInteger);
-      interpreter.FloatStack.Push(example.InputFloat);
-      interpreter.CharStack.Push(example.InputChar);
-      interpreter.StringStack.Push(example.InputString);
-      interpreter.StringVectorStack.Push(example.InputStringVector);
-      interpreter.IntegerVectorStack.Push(example.InputIntegerVector);
-      interpreter.FloatVectorStack.Push(example.InputFloatVector);
+      if (interpreter.Configuration.TopLevelPushInputArguments) {
+        interpreter.BooleanStack.Push(example.InputBoolean);
+        interpreter.IntegerStack.Push(example.InputInteger);
+        interpreter.FloatStack.Push(example.InputFloat);
+        interpreter.CharStack.Push(example.InputChar);
+        interpreter.StringStack.Push(example.InputString);
+        interpreter.StringVectorStack.Push(example.InputStringVector);
+        interpreter.IntegerVectorStack.Push(example.InputIntegerVector);
+        interpreter.FloatVectorStack.Push(example.InputFloatVector);
+      }
 
+      // init in expressions
       interpreter.SetInput(
         integers: example.InputInteger,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15334)
@@ -31,5 +31,5 @@
 
       // setting the capacity of the Stacks to max points ensures that there will be enough memory at runtime
-      ExecStack = new PushStack<Expression>(Configuration.MaxPointsInProgram);
+      ExecStack = new PushStack<Expression>(Configuration.MaxProgramLength);
       CodeStack = new PushStack<Expression>();
       NameStack = new PushStack<string>();
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15334)
@@ -22,8 +22,10 @@
       ExpressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(poolPartitionSize, () => new PooledList<Expression>(), maxPartitionCount);
 
-      pool = new ObjectPool<PooledPushInterpreter>(() => {
-        var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, ExpressionListPoolProvider);
-        return new PooledPushInterpreter(this, PushConfiguration, poolContainer);
-      }, size);
+      pool = new ObjectPool<PooledPushInterpreter>(CreateInterpreter, size);
+    }
+
+    private PooledPushInterpreter CreateInterpreter() {
+      var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, ExpressionListPoolProvider);
+      return new PooledPushInterpreter(this, PushConfiguration, poolContainer);
     }
 
@@ -31,6 +33,9 @@
 
     public PooledPushInterpreter Create(IRandom random = null) {
-      var interpreter = pool.Allocate();
-      interpreter.Reset(random);
+      //var interpreter = pool.Allocate();
+      //interpreter.Reset(random);
+
+      var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, ExpressionListPoolProvider);
+      var interpreter = new PooledPushInterpreter(this, PushConfiguration, poolContainer, random);
 
       return interpreter;
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Manipulator/UniformMutation.cs	(revision 15334)
@@ -1,3 +1,4 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Manipulator {
+﻿// ReSharper disable CompareOfFloatsByEqualityOperator
+namespace HeuristicLab.Problems.ProgramSynthesis.Push.Manipulator {
 
   using HeuristicLab.Common;
@@ -9,6 +10,8 @@
   using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
+  using HeuristicLab.Problems.ProgramSynthesis.Base.Extensions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Encoding;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator;
 
@@ -27,7 +30,9 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>("InInstructionProbability", "The probability of IN Instructions"));
 
-      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionMutationProbability", "The probability an instruction gets mutated", new PercentValue(0.02)));
-      Parameters.Add(new FixedValueParameter<PercentValue>("CloseMutationProbability", "The probability close gets mutated", new PercentValue(0.02)));
-      Parameters.Add(new FixedValueParameter<PercentValue>("CloseIncrementRate", "When mutating individual, the increment rate specifies if close should be increased or decreased by 1.", new PercentValue(0.5)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionMutationProbability", "The probability instructions get mutated", new PercentValue(0.8)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionMutationRate", "The probability an instruction gets mutated", new PercentValue(0.01)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("InstructionConstantTweakRate", "When mutating an instruction, this parameter specifies if mutation is related to the current type (e.g. INTEGER, FLOAT) or not. ", new PercentValue(0)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("CloseMutationProbability", "The probability close gets mutated", new PercentValue(0.2)));
+      Parameters.Add(new FixedValueParameter<PercentValue>("CloseIncrementRate", "When mutating individual, the increment rate specifies if close should be increased or decreased by 1.", new PercentValue(0.1)));
     }
 
@@ -47,4 +52,26 @@
       get { return InstructionMutationProbabilityParameter.Value.Value; }
       set { InstructionMutationProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> InstructionMutationRateParameter
+    {
+      get { return (IValueParameter<PercentValue>)Parameters["InstructionMutationRate"]; }
+    }
+
+    public double InstructionMutationRate
+    {
+      get { return InstructionMutationRateParameter.Value.Value; }
+      set { InstructionMutationRateParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> InstructionConstantTweakRateParameter
+    {
+      get { return (IValueParameter<PercentValue>)Parameters["InstructionConstantTweakRate"]; }
+    }
+
+    public double InstructionConstantTweakRate
+    {
+      get { return InstructionConstantTweakRateParameter.Value.Value; }
+      set { InstructionConstantTweakRateParameter.Value.Value = value; }
     }
 
@@ -104,10 +131,12 @@
         RandomParameter.ActualValue,
         PlushVectorParameter.ActualValue,
-        CloseIncrementRate,
         ErcOptionsParameter.ActualValue,
         InstructionsParameter.ActualValue,
         InInstructionProbabilityParameter.ActualValue.Value,
         CloseMutationProbability,
-        InstructionMutationProbability);
+        CloseIncrementRate,
+        InstructionMutationProbability,
+        InstructionMutationRate,
+        InstructionConstantTweakRate);
       return base.InstrumentedApply();
     }
@@ -116,38 +145,72 @@
       IRandom random,
       PlushVector plushVector,
-      double closeIncrementRate,
       IReadOnlyErcOptions ercOptions,
       IReadOnlyExpressionsConfiguration instructions,
       double inInstructionProbability,
       double closeMutationProbability,
-      double instructionMutationProbability
+      double closeIncrementRate,
+      double instructionMutationProbability,
+      double instructionMutationRate,
+      double constantTweakRate
       ) {
 
-      for (var i = 0; i < plushVector.Entries.Count; i++) {
-        var entry = plushVector[i];
-        var x = random.NextDouble();
-
-        if (x < instructionMutationProbability) {
-          var instruction = CodeGeneratorUtils.GetRandomExpression(
-            random,
-            ercOptions,
-            instructions,
-            inInstructionProbability);
-          entry.Instruction = instruction;
+      var x = random.NextDouble();
+
+      // instruction manipulation
+      if (x < instructionMutationProbability) {
+        if (instructionMutationRate == 0) return;
+        for (var i = 0; i < plushVector.Entries.Count; i++) {
+          MutateInstruction(random, ercOptions, instructions, inInstructionProbability, instructionMutationRate, constantTweakRate, plushVector[i]);
         }
 
-        x = random.NextDouble();
-
-        if (x < closeMutationProbability) {
-          x = random.NextDouble();
-          entry.Close += x < closeIncrementRate ? 1 : -1;
-
-          if (entry.Close < 0)
-            entry.Close = 0;
+        plushVector.UpdatePushProgram();
+        return;
+      }
+
+      // close manipulation
+      if (x < instructionMutationProbability + closeMutationProbability) {
+        if (closeIncrementRate == 0) return;
+        for (var i = 0; i < plushVector.Entries.Count; i++) {
+          MutateClose(random, closeIncrementRate, plushVector[i]);
         }
+
+        plushVector.UpdatePushProgram();
+        return;
       }
-
-      // specifies that the program cached within entry must be updated before reuse
-      plushVector.UpdatePushProgram();
+    }
+
+    private static void MutateClose(IRandom random, double closeIncrementRate, PlushEntry entry) {
+      entry.Close += random.NextDouble() < closeIncrementRate ? 1 : -1;
+
+      if (entry.Close < 0)
+        entry.Close = 0;
+    }
+
+    private static void MutateInstruction(
+      IRandom random,
+      IReadOnlyErcOptions ercOptions,
+      IReadOnlyExpressionsConfiguration instructions,
+      double inInstructionProbability,
+      double instructionMutationRate,
+      double constantTweakRate,
+      PlushEntry entry) {
+
+      if (random.NextDouble() >= instructionMutationRate)
+        return;
+
+      var entryType = entry.Instruction.GetType();
+
+      if (constantTweakRate > 0 && random.NextDouble() < constantTweakRate &&
+          entryType.IsSubclass(typeof(PushExpression<>))) {
+        var attribute = ExpressionTable.TypeToAttributeTable[entryType];
+        entry.Instruction = CodeGeneratorUtils.CreateRandomErcExpression(attribute.StackType, random, ercOptions);
+        return;
+      }
+
+      entry.Instruction = CodeGeneratorUtils.GetRandomExpression(
+        random,
+        ercOptions,
+        instructions,
+        inInstructionProbability);
     }
   }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/IntegerVectorPushBenchmarkSuiteProblem.cs	(revision 15334)
@@ -51,5 +51,5 @@
       Description = data.Description;
       BestKnownQuality = data.BestResult;
-      Config.MaxPointsInProgram = data.MaxSize;
+      Config.MaxProgramLength = data.MaxSize;
       Config.EvalPushLimit = data.EvalLimit;
       Config.ErcOptions = data.ErcOptions;
@@ -62,5 +62,6 @@
       Encoding.Bounds[0, 1] = Config.EnabledExpressions.Count;
 
-      Encoding.Length = data.MaxSize;
+      Encoding.Length = data.MaxSize / 2;
+
     }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PlushPushBenchmarkSuiteProblem.cs	(revision 15334)
@@ -48,5 +48,5 @@
       Description = data.Description;
       BestKnownQuality = data.BestResult;
-      Config.MaxPointsInProgram = data.MaxSize;
+      Config.MaxProgramLength = data.MaxSize;
       Config.EvalPushLimit = data.EvalLimit;
       Config.ErcOptions = data.ErcOptions;
@@ -56,5 +56,6 @@
       Config.InitInExpressions(data.TotalInputArgumentCount);
 
-      Encoding.MaxLength = data.MaxSize;
+      Encoding.MinLength = 0;
+      Encoding.MaxLength = data.MaxSize / 2;
     }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IntegerVectorPushProblem.cs	(revision 15334)
@@ -59,5 +59,5 @@
       Encoding.Bounds[0, 0] = 0;
       Encoding.Bounds[0, 1] = Config.EnabledExpressions.Count;
-      Encoding.Length = Config.MaxPointsInProgram;
+      Encoding.Length = Config.MaxProgramLength;
     }
 
@@ -72,7 +72,12 @@
 
       solutionCreator.ErcOptions = Config.ErcOptions;
+      solutionCreator.MinLength = Config.MinProgramLength;
 
       if (!Operators.OfType<PushExpressionFrequencyAnalyzer>().Any()) {
         Operators.Add(new PushExpressionFrequencyAnalyzer());
+      }
+
+      if (!Operators.OfType<IndividualZeroErrorAnalyzer>().Any()) {
+        Operators.Add(new IndividualZeroErrorAnalyzer());
       }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PlushPushProblem.cs	(revision 15334)
@@ -3,6 +3,4 @@
 
   using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Data;
   using HeuristicLab.Optimization;
   using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -31,5 +29,8 @@
       Encoding.ErcOptionsParameter = Config.ErcOptionsParameter;
       Encoding.InstructionsParameter = Config.InstructionsParameter;
-      Encoding.MaxLength = Config.MaxPointsInProgram;
+      Encoding.MinLengthParameter = Config.MinProgramLengthParameter;
+      Encoding.MaxLengthParameter = Config.MaxProgramLengthParameter;
+      Encoding.MaxCloseParameter = Config.MaxCloseParameter;
+      Encoding.CloseBiasLevelParameter = Config.CloseBiasLevelParameter;
     }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 15334)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem
+{
+    public class PushProblem
+    {
+        
+    }
+}
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblemBase.cs	(revision 15334)
@@ -20,5 +20,5 @@
   public abstract class PushProblemBase<T> : SingleObjectiveBasicProblem<T> where T : class, IEncoding {
     [Storable]
-    protected readonly PushConfigurationParameterCollection Config;
+    public readonly PushConfiguration Config;
 
     protected PushInterpreterPool Pool;
@@ -37,5 +37,5 @@
 
     protected PushProblemBase(IPushEvaluator evaluator) {
-      Config = new PushConfigurationParameterCollection();
+      Config = new PushConfiguration();
       PushEvaluator = evaluator;
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/IPlushCreator.cs	(revision 15334)
@@ -10,5 +10,4 @@
     IValueLookupParameter<IntValue> MinLengthParameter { get; }
     IValueLookupParameter<IntValue> MaxLengthParameter { get; }
-    IValueLookupParameter<IntValue> MinCloseParameter { get; }
     IValueLookupParameter<IntValue> MaxCloseParameter { get; }
     IValueLookupParameter<DoubleValue> CloseBiasLevelParameter { get; }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/SolutionCreator/PlushCreator.cs	(revision 15334)
@@ -24,5 +24,4 @@
       Parameters.Add(new ValueLookupParameter<IntValue>("MinLength", "The min length of the vector."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaxLength", "The max length of the vector."));
-      Parameters.Add(new ValueLookupParameter<IntValue>("MinClose", "The min close variable for a plush genome entry."));
       Parameters.Add(new ValueLookupParameter<IntValue>("MaxClose", "The max close variable for a plush genome entry."));
       Parameters.Add(new ValueLookupParameter<DoubleValue>("CloseBiasLevel", "Determines how strongly the random close variable is biased towards 0."));
@@ -69,8 +68,4 @@
       get { return (IValueLookupParameter<PercentValue>)Parameters["InInstructionProbability"]; }
     }
-    public IValueLookupParameter<IntValue> MinCloseParameter
-    {
-      get { return (IValueLookupParameter<IntValue>)Parameters["MinClose"]; }
-    }
     public IValueLookupParameter<IntValue> MaxCloseParameter
     {
@@ -97,5 +92,4 @@
       var instructions = InstructionsParameter.ActualValue;
       var inInstructionProbability = InInstructionProbabilityParameter.ActualValue.Value;
-      var minClose = MinCloseParameter.ActualValue.Value;
       var maxClose = MaxCloseParameter.ActualValue.Value;
       var biasLevel = CloseBiasLevelParameter.ActualValue.Value;
@@ -103,7 +97,4 @@
       if (minLength > maxLength)
         throw new InvalidOperationException("MinLength > MaxLength");
-
-      if (minClose > maxClose)
-        throw new InvalidOperationException("MinClose > MaxClose");
 
       var length = random.Next(minLength, maxLength);
@@ -117,5 +108,5 @@
           inInstructionProbability);
 
-        var close = random.NextBiased(minClose, maxClose, biasLevel);
+        var close = maxClose == 0 ? 1 : random.NextBiased(0, maxClose, biasLevel);
 
         result.Add(new PlushEntry {
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/IPrintStack.cs	(revision 15334)
@@ -1,4 +1,9 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Stack {
+  using System.Collections.Generic;
+
   public interface IPrintStack : IPushStack {
+    bool IsCurrentLineEmpty { get; }
+    IReadOnlyList<string> Lines { get; }
+
     void NewLine();
     void Push<T>(T item);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/PrintStack.cs	(revision 15334)
@@ -14,9 +14,16 @@
   public class PrintStack : IPrintStack {
     private int lineCount = 0;
+    private int length = 0;
+    private IReadOnlyList<string> lines;
     private readonly StringBuilder stringBuilder = new StringBuilder();
 
+    public PrintStack() {
+      IsCurrentLineEmpty = true;
+    }
+
+    public bool IsCurrentLineEmpty { get; private set; }
+
     IEnumerator IEnumerable.GetEnumerator() {
-      var lines = AsStrings();
-      return lines.GetEnumerator();
+      return Lines.GetEnumerator();
     }
 
@@ -25,5 +32,21 @@
     }
 
+    public IReadOnlyList<string> Lines
+    {
+      get
+      {
+        if (stringBuilder.Length == length) return lines;
+        length = stringBuilder.Length;
+        lines = stringBuilder.ToString().Split(PushEnvironment.NewLine);
+
+        return lines;
+      }
+    }
+
     void IPushStack.Clear() {
+      lineCount = 0;
+      length = 0;
+      lines = null;
+      IsCurrentLineEmpty = true;
       stringBuilder.Clear();
     }
@@ -31,4 +54,5 @@
     public void NewLine() {
       stringBuilder.Append(PushEnvironment.NewLine);
+      IsCurrentLineEmpty = true;
       lineCount++;
     }
@@ -36,5 +60,7 @@
     public void Push<T>(T item) {
       if (IsEmpty) lineCount = 1;
-      stringBuilder.Append(item);
+      var str = item.ToString();
+      stringBuilder.Append(str);
+      IsCurrentLineEmpty = IsCurrentLineEmpty && string.IsNullOrEmpty(str);
     }
 
@@ -42,4 +68,5 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
     }
 
@@ -47,4 +74,5 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
     }
 
@@ -52,4 +80,5 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
     }
 
@@ -57,4 +86,5 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Concat(item);
+      IsCurrentLineEmpty = false;
     }
 
@@ -62,4 +92,5 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Append(item);
+      IsCurrentLineEmpty = false;
     }
 
@@ -67,10 +98,11 @@
       if (IsEmpty) lineCount = 1;
       stringBuilder.Append(item);
+      IsCurrentLineEmpty = false;
     }
-
 
     public void Push(string item) {
       if (IsEmpty) lineCount = 1;
       stringBuilder.Append(item);
+      IsCurrentLineEmpty = IsCurrentLineEmpty && string.IsNullOrEmpty(item);
     }
 
@@ -78,4 +110,6 @@
       for (var i = startIndex; i < items.Count; i++)
         stringBuilder.Append(items[i]);
+
+      IsCurrentLineEmpty = false;
     }
 
@@ -87,13 +121,14 @@
       foreach (var item in items)
         stringBuilder.Append(item);
+
+      IsCurrentLineEmpty = false;
     }
 
     public IEnumerable<string> AsStrings() {
-      var lines = stringBuilder.ToString().Split(PushEnvironment.NewLine);
-      return lines;
+      return Lines;
     }
 
     public IEnumerable<object> AsObjects() {
-      return AsStrings();
+      return Lines;
     }
 
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/packages.config
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/packages.config	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/packages.config	(revision 15334)
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.IO.RecyclableMemoryStream" version="1.2.2" targetFramework="net45" />
+</packages>
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/GPTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/GPTests.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/GPTests.cs	(revision 15334)
@@ -0,0 +1,344 @@
+﻿using System.Linq;
+// ReSharper disable PossibleNullReferenceException
+
+namespace HeuristicLab.Tests.Benchmark {
+  using System;
+  using System.Threading;
+
+  using HeuristicLab.Algorithms.GeneticAlgorithm;
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Data;
+  using HeuristicLab.ParallelEngine;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Analyzer;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Crossover;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Manipulator;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Selector;
+
+  using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+  [TestClass]
+  public class GpTests {
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Checksum() {
+      Run<Checksum>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CollatzNumbers() {
+      Run<CollatzNumbers>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CompareStringLengths() {
+      Run<CompareStringLengths>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void CountOdds() {
+      Run<CountOdds>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Digits() {
+      Run<Digits>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void DoubleLetters() {
+      Run<DoubleLetters>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void EvenSquares() {
+      Run<EvenSquares>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ForLoopIndex() {
+      Run<ForLoopIndex>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Grades() {
+      Run<Grades>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void LastIndexOfZero() {
+      Run<LastIndexOfZero>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Median() {
+      Run<Median>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void MirrorImage() {
+      Run<MirrorImage>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void NegativeToZero() {
+      Run<NegativeToZero>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void NumberIo() {
+      Run<NumberIO>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void PigLatin() {
+      Run<PigLatin>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ReplaceSpaceWithNewLine() {
+      Run<ReplaceSpaceWithNewline>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void ScrabbleScore() {
+      Run<ScrabbleScore>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Smallest() {
+      Run<Smallest>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SmallOrLarge() {
+      Run<SmallOrLarge>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void StringDifferences() {
+      Run<StringDifferences>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void StringLengthsBackwards() {
+      Run<StringLengthsBackwards>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SumOfSquares() {
+      Run<SumOfSquares>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void SuperAnagrams() {
+      Run<SuperAnagrams>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void Syllables() {
+      Run<Syllables>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void VectorAverage() {
+      Run<VectorAverage>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void VectorSummed() {
+      Run<VectorSummed>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void WallisPi() {
+      Run<WallisPi>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void WordStats() {
+      Run<WordStats>();
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "Long")]
+    [TestCategory("ProblemTest")]
+    public void XWordLines() {
+      Run<XWordLines>();
+    }
+
+    static void Run<T>() where T : IBenchmarkSuiteDataDescriptor, new() {
+      var trigger = new AutoResetEvent(false);
+      var alg = GetAlgorithm(new T());
+      Exception exception = null;
+
+      alg.ExceptionOccurred += (sender, args) => {
+        exception = args.Value;
+        trigger.Set();
+      };
+
+      alg.Stopped += (sender, args) => {
+        trigger.Set();
+      };
+
+      var lastGeneration = -1;
+      alg.ExecutionTimeChanged += (sender, args) => {
+        if (!alg.Results.Any() || !alg.Results.ContainsKey("CurrentBestQuality")) return;
+
+        var generation = (alg.Results["Generations"].Value as IntValue).Value;
+
+        if (lastGeneration != -1 && generation == lastGeneration) return;
+
+        Console.WriteLine(@"Generation: {0}", generation);
+
+        if (alg.Results.ContainsKey("CurrentBestQuality")) {
+          var best = (alg.Results["CurrentBestQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentBestQuality: {0}", best);
+        }
+
+        if (alg.Results.ContainsKey("CurrentAverageQuality")) {
+          var average = (alg.Results["CurrentAverageQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentAverageQuality: {0}", average);
+        }
+
+        if (alg.Results.ContainsKey("CurrentWorstQuality")) {
+          var worst = (alg.Results["CurrentWorstQuality"].Value as DoubleValue).Value;
+          Console.WriteLine(@"CurrentWorstQuality: {0}", worst);
+        }
+
+        Console.WriteLine();
+        lastGeneration = generation;
+      };
+
+      alg.Prepare();
+      alg.Start();
+      trigger.WaitOne();
+
+      if (exception != null) {
+        Console.WriteLine(exception.Message);
+        throw exception;
+      }
+
+      var finalGeneration = (alg.Results["Generations"].Value as IntValue).Value;
+      var bestQuality = (alg.Results["CurrentBestQuality"].Value as DoubleValue).Value;
+      var averageQuality = (alg.Results["CurrentAverageQuality"].Value as DoubleValue).Value;
+      var worstQuality = (alg.Results["CurrentWorstQuality"].Value as DoubleValue).Value;
+
+      Console.WriteLine(@"Final Generation: {0}", finalGeneration);
+      Console.WriteLine(@"CurrentBestQuality: {0}", bestQuality);
+      Console.WriteLine(@"CurrentAverageQuality: {0}", averageQuality);
+      Console.WriteLine(@"CurrentWorstQuality: {0}", worstQuality);
+    }
+
+    static GeneticAlgorithm GetAlgorithm(IBenchmarkSuiteDataDescriptor descriptor) {
+      var ga = new GeneticAlgorithm();
+
+      var problemData = descriptor.CreateProblemData();
+      var pushProblem = new PlushPushBenchmarkSuiteProblem();
+
+      pushProblem.Load(problemData);
+      ga.Name = "GA " + pushProblem.Name;
+
+      ga.Problem = pushProblem;
+
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<AlternationCrossover>().First();
+
+      switch (problemData.ProblemType) {
+        case ProblemType.NumberIO:
+        case ProblemType.SmallOrLarge:
+        case ProblemType.Median:
+        case ProblemType.Smallest:
+          crossover.AlignmentDeviation = 5;
+          break;
+
+        default:
+          crossover.AlignmentDeviation = 10;
+          break;
+      }
+
+      crossover.AlternationRate = 0.01;
+      ga.Crossover = crossover;
+
+      ga.Selector = ga.SelectorParameter.ValidValues.OfType<LexicaseSelector>().First();
+
+      var mutator = ga.MutatorParameter.ValidValues.OfType<UniformMutation>().First();
+      mutator.InstructionMutationProbability = 0.875;
+      mutator.CloseMutationProbability = 0.125;
+      mutator.CloseIncrementRate = 0.1;
+      ga.Mutator = mutator;
+
+      ga.MutationProbability.Value = 0.8;
+      ga.SetSeedRandomly.Value = true;
+      ga.PopulationSize.Value = 1000;
+
+      ga.MaximumGenerations.Value = 9; // problemData.ProgramExecutionBudget / problemData.TrainingCount / 1000;
+
+      // remove unnecessary analyzers to improve performance
+      pushProblem.OperatorsParameter.Value
+        .RemoveAll(analyzer =>
+          analyzer.GetType() == typeof(IndividualZeroErrorAnalyzer) ||
+          analyzer.GetType() == typeof(PushExpressionFrequencyAnalyzer));
+
+      ga.Engine = new ParallelEngine();
+
+      return ga;
+    }
+  }
+}
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/RandomWalkTests.cs	(revision 15334)
@@ -24,5 +24,5 @@
       var config = new PushConfiguration {
         EvalPushLimit = data.EvalLimit,
-        MaxPointsInProgram = data.MaxSize,
+        MaxProgramLength = data.MaxSize,
         ErcOptions = data.ErcOptions,
       };
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/SolutionTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/SolutionTests.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Benchmark/SolutionTests.cs	(revision 15334)
@@ -15,11 +15,11 @@
   [TestClass]
   public class SolutionTests {
-    private void TestProgram(PushProgram program, IBenchmarkSuiteDataDescriptor descriptor, string floatStringFormat = "R") {
+    private void TestProgram(PushProgram program, IBenchmarkSuiteDataDescriptor descriptor) {
       var data = descriptor.CreateProblemData();
       var config = new PushConfiguration {
         EvalPushLimit = data.EvalLimit,
-        MaxPointsInProgram = data.MaxSize,
+        MaxProgramLength = data.MaxSize,
         ErcOptions = data.ErcOptions,
-        FloatStringFormat = floatStringFormat
+        FloatStringFormat = data.FloatStringFormat
       };
 
@@ -78,5 +78,26 @@
     public void Digits() {
       TestProgram(
-        PushParser.ParseProgram("( INTEGER.DUP STRING.FROMINTEGER 0 INTEGER.< BOOLEAN.DUP EXEC.WHEN ( STRING.REST STRING.DUP STRING.FIRST STRING.SWAP STRING.REST ) STRING.REVERSE STRING.ITERATE ( PRINT.NEWLINE PRINT.PRINTCHAR ) EXEC.WHEN ( PRINT.NEWLINE \'-\' PRINT.PRINTCHAR PRINT.PRINTSTRING ) )"),
+        PushParser.ParseProgram(@"
+        (
+          INTEGER.DUP STRING.FROMINTEGER
+          INTEGER.DUP 0 INTEGER.< BOOLEAN.DUP
+          BOOLEAN.DUP INTEGER.DUP -10 INTEGER.> BOOLEAN.AND
+          EXEC.WHEN (
+            PRINT.PRINTSTRING
+            EXEC.FLUSH
+          )
+          EXEC.WHEN (
+            STRING.REST STRING.DUP STRING.FIRST STRING.SWAP STRING.REST
+          )
+          STRING.REVERSE
+          STRING.DUP STRING.FIRST PRINT.PRINTSTRING
+          STRING.REST STRING.ITERATE (
+            PRINT.NEWLINE PRINT.PRINTCHAR
+          )
+          EXEC.WHEN (
+            PRINT.NEWLINE
+            '-' PRINT.PRINTCHAR PRINT.PRINTSTRING
+          )
+        )"),
         new Digits());
     }
@@ -111,6 +132,6 @@
               INTEGER.DUP 4 INTEGER.YANKDUP INTEGER.<
               EXEC.IF (
+                PRINT.ENSURE_NEWLINE
                 PRINT.PRINTINTEGER
-                PRINT.NEWLINE
               )
               EXEC.FLUSH
@@ -127,6 +148,11 @@
     public void ForLoopIndex() {
       TestProgram(
-        PushParser.ParseProgram(
-        @"( STRING.FROMINTEGER INTEGER.SWAP true EXEC.WHILE ( INTEGER.DUP PRINT.NEWLINE PRINT.PRINTINTEGER STRING.DUP INTEGER.FROMSTRING INTEGER.+ INTEGER.DUP 2 INTEGER.YANKDUP INTEGER.< ) )"),
+        PushParser.ParseProgram(@"(
+          STRING.FROMINTEGER INTEGER.SWAP true EXEC.WHILE (
+            INTEGER.DUP PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER
+            STRING.DUP INTEGER.FROMSTRING INTEGER.+
+            INTEGER.DUP 2 INTEGER.YANKDUP INTEGER.<
+          )
+        )"),
         new ForLoopIndex());
     }
@@ -226,5 +252,5 @@
     public void Smallest() {
       TestProgram(
-        PushParser.ParseProgram("( IN1 IN2 IN3 IN4 3 EXEC.DO*TIMES INTEGER.MIN )"),
+        PushParser.ParseProgram("( 3 EXEC.DO*TIMES INTEGER.MIN PRINT.PRINTINTEGER )"),
         new Smallest());
     }
@@ -254,8 +280,7 @@
           @"CHAR.ALLFROMSTRING 0 STRING.ITERATE (
             CHAR.DUP 2 CHAR.YANKDUP CHAR.= BOOLEAN.NOT EXEC.IF (
-              INTEGER.DUP PRINT.PRINTINTEGER
+              INTEGER.DUP PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER
               ' ' PRINT.PRINTCHAR PRINT.PRINTCHAR
               ' ' PRINT.PRINTCHAR PRINT.PRINTCHAR
-              PRINT.NEWLINE
             )
             ( CHAR.POP CHAR.POP )
@@ -269,5 +294,5 @@
     public void StringLengthsBackwards() {
       TestProgram(
-        PushParser.ParseProgram(@"STRING[].ITERATE ( STRING.LENGTH PRINT.NEWLINE PRINT.PRINTINTEGER )"),
+        PushParser.ParseProgram(@"STRING[].ITERATE ( STRING.LENGTH PRINT.ENSURE_NEWLINE PRINT.PRINTINTEGER )"),
         new StringLengthsBackwards());
     }
@@ -323,5 +348,18 @@
     public void WallisPi() {
       TestProgram(
-        PushParser.ParseProgram(@"( IN1 2 3 INTEGER.ROT INTEGER.ROT EXEC.DO*TIMES ( 2 EXEC.DO*TIMES ( 1 INTEGER.YANKDUP 1 INTEGER.YANKDUP ) FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT.SWAP FLOAT./ FLOAT.* INTEGER.< EXEC.IF ( INTEGER.SWAP 2 INTEGER.+ INTEGER.SWAP ) ( 2 INTEGER.+ ) ) )"),
+        PushParser.ParseProgram(@"(
+          IN1 2 3 INTEGER.ROT INTEGER.ROT
+          EXEC.DO*TIMES (
+            2 EXEC.DO*TIMES (
+              1 INTEGER.YANKDUP 1 INTEGER.YANKDUP
+            )
+            FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT.SWAP FLOAT./ FLOAT.* INTEGER.<
+            EXEC.IF (
+              INTEGER.SWAP 2 INTEGER.+ INTEGER.SWAP
+            ) (
+              2 INTEGER.+
+            )
+          )
+        )"),
         new WallisPi());
     }
@@ -332,7 +370,41 @@
     public void WordStats() {
       TestProgram(
-        PushParser.ParseProgram("( STRING.DUP STRING.SPLIT STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT EXEC.WHEN ( true EXEC.WHILE ( STRING.LENGTH INTEGER.MAX STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT ) [0] 2 INTEGER.- INTEGER.DUP 0 INTEGER.>= EXEC.WHEN ( INTEGER.INC EXEC.DO*TIMES ( 0 INTEGER[].CONJ ) ) STRING.DUP STRING.SPLIT STRING.STACKDEPTH 1 INTEGER.> EXEC.WHILE ( STRING.LENGTH INTEGER.DEC INTEGER.DUP INTEGER[].DUP INTEGER[].NTH INTEGER.INC INTEGER[].SET STRING.STACKDEPTH 1 INTEGER.> ) INTEGER[].DUP INTEGER[].LENGTH INTEGER.DEC EXEC.DO*COUNT ( PRINT.NEWLINE \"words of length \" PRINT.PRINTSTRING INTEGER.DUP INTEGER.INC PRINT.PRINTINTEGER \": \" PRINT.PRINTSTRING INTEGER[].DUP INTEGER[].NTH PRINT.PRINTINTEGER ) \'.\' STRING.DUP STRING.OCCURRENCESOFCHAR \'!\' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+ \'?\' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+ INTEGER.DUP PRINT.NEWLINE \"number of sentences: \" PRINT.PRINTSTRING PRINT.PRINTINTEGER STRING.SPLIT STRING.STACKDEPTH FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT./ PRINT.NEWLINE \"average sentence length: \" PRINT.PRINTSTRING PRINT.PRINTFLOAT ) )"),
-        new WordStats(),
-        "0.0#########");
+        PushParser.ParseProgram(@"(
+          STRING.DUP STRING.SPLIT
+          STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT
+          EXEC.WHEN (
+            true EXEC.WHILE (
+              STRING.LENGTH INTEGER.MAX STRING.STACKDEPTH 1 INTEGER.= BOOLEAN.NOT
+            )
+            [0] 2 INTEGER.- INTEGER.DUP 0 INTEGER.>=
+            EXEC.WHEN (
+              INTEGER.INC EXEC.DO*TIMES (
+                0 INTEGER[].CONJ
+              )
+            )
+            STRING.DUP STRING.SPLIT STRING.STACKDEPTH 1 INTEGER.>
+            EXEC.WHILE (
+              STRING.LENGTH INTEGER.DEC INTEGER.DUP INTEGER[].DUP
+              INTEGER[].NTH INTEGER.INC INTEGER[].SET STRING.STACKDEPTH 1 INTEGER.>
+            )
+            INTEGER[].DUP INTEGER[].LENGTH INTEGER.DEC
+            EXEC.DO*COUNT (
+              PRINT.ENSURE_NEWLINE
+              ""words of length "" PRINT.PRINTSTRING
+              INTEGER.DUP INTEGER.INC PRINT.PRINTINTEGER
+              "": "" PRINT.PRINTSTRING
+              INTEGER[].DUP INTEGER[].NTH PRINT.PRINTINTEGER
+            )
+            '.' STRING.DUP STRING.OCCURRENCESOFCHAR
+            '!' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+
+            '?' STRING.DUP STRING.OCCURRENCESOFCHAR INTEGER.+
+            INTEGER.DUP PRINT.ENSURE_NEWLINE
+            ""number of sentences: "" PRINT.PRINTSTRING PRINT.PRINTINTEGER
+            STRING.SPLIT STRING.STACKDEPTH FLOAT.FROMINTEGER FLOAT.FROMINTEGER FLOAT./
+            PRINT.ENSURE_NEWLINE
+            ""average sentence length: "" PRINT.PRINTSTRING PRINT.PRINTFLOAT
+          )
+        )"),
+        new WordStats());
     }
 
@@ -342,5 +414,29 @@
     public void XWordLines() {
       TestProgram(
-        PushParser.ParseProgram(@"( STRING.SPLIT STRING.EMPTY BOOLEAN.NOT INTEGER.DUP 1 INTEGER.= EXEC.IF ( EXEC.WHILE ( PRINT.NEWLINE PRINT.PRINTSTRING STRING.EMPTY BOOLEAN.NOT ) ) ( 2 INTEGER.- EXEC.WHILE ( STRING.STACKDEPTH 2 INTEGER.- 1 INTEGER.YANKDUP INTEGER.MIN INTEGER.DUP 0 INTEGER.>= EXEC.IF ( INTEGER.INC EXEC.DO*TIMES ( ' ' STRING.CONJCHAR STRING.SWAP STRING.CONCAT ) PRINT.NEWLINE PRINT.PRINTSTRING STRING.EMPTY BOOLEAN.NOT ) ( PRINT.NEWLINE PRINT.PRINTSTRING STRING.EMPTY BOOLEAN.NOT ) ) ) )"),
+        PushParser.ParseProgram(@"(
+          STRING.SPLIT STRING.EMPTY BOOLEAN.NOT INTEGER.DUP 1 INTEGER.=
+          EXEC.IF (
+            EXEC.WHILE (
+              PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+              STRING.EMPTY BOOLEAN.NOT
+            )
+          ) (
+            2 INTEGER.- EXEC.WHILE (
+              STRING.STACKDEPTH 2 INTEGER.-
+              1 INTEGER.YANKDUP INTEGER.MIN
+              INTEGER.DUP 0 INTEGER.>=
+              EXEC.IF (
+                INTEGER.INC EXEC.DO*TIMES (
+                  ' ' STRING.CONJCHAR STRING.SWAP STRING.CONCAT
+                )
+                PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+                STRING.EMPTY BOOLEAN.NOT
+              ) (
+                PRINT.ENSURE_NEWLINE PRINT.PRINTSTRING
+                STRING.EMPTY BOOLEAN.NOT
+              )
+            )
+          )
+        )"),
         new XWordLines());
     }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Components/PrintStackTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Components/PrintStackTests.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Components/PrintStackTests.cs	(revision 15334)
@@ -17,4 +17,6 @@
 
     [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
     public void TestPushLong() {
       printStack.Push(100L);
@@ -24,4 +26,6 @@
 
     [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
     public void TestPushDouble() {
       printStack.Push(100.5D);
@@ -31,4 +35,6 @@
 
     [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
     public void TestAsStringsWithNewline() {
       printStack.Push(100.5D);
@@ -46,4 +52,6 @@
 
     [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("ComponentTest")]
     public void TestAsStringsWithoutNewline() {
       printStack.Push(100.5D);
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 15334)
@@ -39,6 +39,14 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="dotMemory.Unit, Version=103.0.0.0, Culture=neutral, PublicKeyToken=1010a0d8d6380325, processorArchitecture=MSIL">
+      <HintPath>..\packages\JetBrains.dotMemoryUnit.2.3.20160517.113140\lib\dotMemory.Unit.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
@@ -73,4 +81,8 @@
       <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -104,4 +116,5 @@
   </Choose>
   <ItemGroup>
+    <Compile Include="Benchmark\GPTests.cs" />
     <Compile Include="Benchmark\RandomWalkTests.cs" />
     <Compile Include="Benchmark\SolutionTests.cs" />
@@ -147,5 +160,7 @@
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
   <Choose>
     <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Interpreter/ExpressionTest.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Interpreter/ExpressionTest.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Interpreter/ExpressionTest.cs	(revision 15334)
@@ -19,4 +19,5 @@
     protected PushConfiguration configuration = new PushConfiguration {
       TopLevelPushCode = false,
+      FloatStringFormat = "R",
       ErcOptions = new ErcOptions {
         ErcProbability = 0.05,
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/DeterministicTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/DeterministicTests.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/DeterministicTests.cs	(revision 15334)
@@ -44,5 +44,5 @@
       var currentAverageQuality1 = GetDoubleResult(ga1, "CurrentAverageQuality");
       var currentAverageQuality2 = GetDoubleResult(ga2, "CurrentAverageQuality");
-      Assert.AreEqual(currentAverageQuality1, currentAverageQuality2, 0.0001);
+      Assert.AreEqual(currentAverageQuality1, currentAverageQuality2, 0.01);
 
       var currentWorstQuality1 = GetDoubleResult(ga1, "CurrentWorstQuality");
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/IndividualMapperTests.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/IndividualMapperTests.cs	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/Problem/IndividualMapperTests.cs	(revision 15334)
@@ -11,6 +11,9 @@
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Encoding;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Individual;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Parser;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
   using HeuristicLab.Random;
@@ -53,5 +56,5 @@
       var random = new MersenneTwister();
       var config = new PushConfiguration {
-        ParenthesesCloseBiasLevel = 4
+        CloseBiasLevel = 4
       };
 
@@ -75,4 +78,27 @@
       Assert.AreEqual(vector.Length, program.TotalExpressionCount);
     }
+
+    [TestMethod]
+    [TestProperty("Time", "Short")]
+    [TestCategory("Individual")]
+    public void PlushToPushProgram() {
+      var plushGenome = new PlushVector();
+
+      plushGenome.Add(new PlushEntry { Instruction = new ExecDoTimesExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(8), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(11), Close = 3 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerAddExpression(), Close = 3, Silent = true });
+      plushGenome.Add(new PlushEntry { Instruction = new ExecIfExpression(), Close = 1 });
+      plushGenome.Add(new PlushEntry { Instruction = new IntegerPushExpression(17), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new BooleanPushExpression(false), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new CodeQuoteExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new FloatMultiplyExpression(), Close = 2 });
+      plushGenome.Add(new PlushEntry { Instruction = new ExecRotateExpression(), Close = 0 });
+      plushGenome.Add(new PlushEntry { Instruction = new FloatPushExpression(34.44), Close = 0 });
+
+      var expected = PushParser.ParseProgram("( EXEC.DO*TIMES ( 8 11 ) EXEC.IF ( ) ( 17 false CODE.QUOTE ( FLOAT.* ) ) EXEC.ROT ( 34.44 ) ( ) ( ) )");
+
+      Assert.AreEqual(expected, plushGenome.PushProgram);
+    }
   }
 }
Index: /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/packages.config
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/packages.config	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Tests/packages.config	(revision 15334)
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="JetBrains.dotMemoryUnit" version="2.3.20160517.113140" targetFramework="net45" />
+</packages>
Index: /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/App.config
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/App.config	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/App.config	(revision 15334)
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
+    </startup>
+</configuration>
Index: /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Program.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Program.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Program.cs	(revision 15334)
@@ -0,0 +1,176 @@
+﻿using System.Linq;
+using System.Text;
+
+namespace Push.Thesis {
+  using System.IO;
+  using System.Threading.Tasks;
+
+  using HeuristicLab.Algorithms.GeneticAlgorithm;
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.Optimization;
+  using HeuristicLab.ParallelEngine;
+  using HeuristicLab.Persistence.Default.Xml;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Analyzer;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Crossover;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Extensions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Manipulator;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Selector;
+
+  class Program {
+    static void Main(string[] args) {
+      //BuildListOfInstructions();
+      GenerateRuns();
+      GenerateExperiments();
+      //GenerateExperimentWithAllProblems();
+    }
+
+    private static void GenerateExperimentWithAllProblems() {
+      var provider = new BenchmarkSuiteInstanceProvider();
+
+      var algs = provider
+        .GetDataDescriptors()
+        .AsParallel()
+        .Select(descriptor => new Run(GetAlgorithm((IBenchmarkSuiteDataDescriptor)descriptor)))
+        .ToList();
+
+      var experiment = new Experiment("Experiment Benchmark Suite");
+      experiment.Runs.AddRange(algs);
+
+      XmlGenerator.Serialize(experiment, @"C:\tmp\Plush - GA\Experiment Benchmark Suite.hl");
+    }
+
+    static void GenerateRuns() {
+      var provider = new BenchmarkSuiteInstanceProvider();
+      var descriptors = provider.GetDataDescriptors();
+
+      Parallel.ForEach(descriptors, descriptor => {
+        var benchmarkSuiteProblemDescriptor = (BenchmarkSuiteDataDescriptor)descriptor;
+        var alg = GetAlgorithm(benchmarkSuiteProblemDescriptor);
+
+        XmlGenerator.Serialize(alg, $@"C:\tmp\Plush - GA\Runs\{descriptor.Name}.hl");
+      });
+    }
+
+    static void GenerateExperiments() {
+      var provider = new BenchmarkSuiteInstanceProvider();
+      var descriptors = provider.GetDataDescriptors();
+
+      Parallel.ForEach(descriptors, descriptor => {
+        var benchmarkSuiteProblemDescriptor = (BenchmarkSuiteDataDescriptor)descriptor;
+        var alg = GetAlgorithm(benchmarkSuiteProblemDescriptor);
+        var experiment = GetExperiment(alg, 10);
+
+        XmlGenerator.Serialize(experiment, $@"C:\tmp\Plush - GA\Experiments\Experiment_{descriptor.Name}.hl");
+      });
+    }
+
+    static Experiment GetExperiment(IAlgorithm alg, int repeats) {
+      var experiment = new Experiment("Experiment: " + alg.Problem.Name);
+      experiment.Optimizers.Add(new BatchRun {
+        Optimizer = alg,
+        Repetitions = repeats
+      });
+
+      return experiment;
+    }
+
+    static IAlgorithm GetAlgorithm(IBenchmarkSuiteDataDescriptor descriptor) {
+      var ga = new GeneticAlgorithm();
+
+      var problemData = descriptor.CreateProblemData();
+      var pushProblem = new PlushPushBenchmarkSuiteProblem();
+
+      pushProblem.Load(problemData);
+      ga.Name = "GA " + pushProblem.Name;
+
+      ga.Problem = pushProblem;
+
+      var crossover = ga.CrossoverParameter.ValidValues.OfType<AlternationCrossover>().First();
+
+      switch (problemData.ProblemType) {
+        case ProblemType.NumberIO:
+        case ProblemType.SmallOrLarge:
+        case ProblemType.Median:
+        case ProblemType.Smallest:
+          crossover.AlignmentDeviation = 5;
+          break;
+
+        default:
+          crossover.AlignmentDeviation = 10;
+          break;
+      }
+
+      crossover.AlternationRate = 0.01;
+      ga.Crossover = crossover;
+
+      ga.Selector = ga.SelectorParameter.ValidValues.OfType<LexicaseSelector>().First();
+
+      var mutator = ga.MutatorParameter.ValidValues.OfType<UniformMutation>().First();
+      mutator.InstructionMutationProbability = 0.875;
+      mutator.CloseMutationProbability = 0.125;
+      mutator.CloseIncrementRate = 0.1;
+      ga.Mutator = mutator;
+
+      ga.MutationProbability.Value = 0.8;
+      ga.SetSeedRandomly.Value = true;
+      ga.PopulationSize.Value = 1000;
+
+      ga.MaximumGenerations.Value = problemData.ProgramExecutionBudget / problemData.TrainingCount / 1000;
+
+      var zeroErrorAnalyzer = pushProblem.OperatorsParameter.Value
+        .OfType<IndividualZeroErrorAnalyzer>().SingleOrDefault();
+
+      if (zeroErrorAnalyzer != null) {
+        zeroErrorAnalyzer.StoreHistoryParameter.Value.Value = true;
+        zeroErrorAnalyzer.UpdateIntervalParameter.Value.Value = 5;
+      }
+
+      ga.Engine = new ParallelEngine();
+
+      return ga;
+    }
+
+    static void BuildListOfInstructions() {
+      var sb = new StringBuilder();
+      var attributes = ExpressionTable.StatelessExpressionTable.Values.Select(e => {
+        var type = e.GetType();
+        var attribute = ExpressionTable.TypeToAttributeTable[type];
+
+        return attribute;
+      }).ToList();
+
+      var attributesGrouped = attributes.GroupBy(a => a.StackType).OrderBy(g => g.Key.ToString());
+
+      foreach (var entry in attributesGrouped) {
+        sb.AppendLine($"\\textbf{{{entry.Key}}}");
+        sb.AppendLine("\\begin{description}");
+
+        foreach (var attribute in entry) {
+          var name = attribute.Name
+            .Replace("_", "\\_")
+            .Replace("%", "\\%");
+
+          sb.AppendLine($"\\item[{{{name}}}] {attribute.Description}");
+
+          if (attribute.RequiredBlockCount > 0)
+            sb.AppendLine($"\\\\block wants: {attribute.RequiredBlockCount}");
+
+          if (attribute.AdditionalStackDependencies != default(HeuristicLab.Problems.ProgramSynthesis.Push.Stack.StackTypes)) {
+            var dependenciesNames = attribute.AdditionalStackDependencies.ToValues().Select(v => v.ToString()).OrderBy(x => x);
+            var dependenciesStr = string.Join(", ", dependenciesNames);
+
+            sb.AppendLine($"\\\\dependencies: {dependenciesStr}");
+          }
+
+        }
+
+        sb.AppendLine("\\end{description}");
+      }
+
+
+      File.WriteAllText(@"T:\BTSync\projects\git\bitbucket\master\Paper\appendix\instructions.tex", sb.ToString());
+    }
+  }
+}
Index: /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Properties/AssemblyInfo.cs
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Properties/AssemblyInfo.cs	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Properties/AssemblyInfo.cs	(revision 15334)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Push.Thesis")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Push.Thesis")]
+[assembly: AssemblyCopyright("Copyright ©  2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("662c6679-3ee0-432f-a8a6-251ca165d30b")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Push.Thesis.csproj
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Push.Thesis.csproj	(revision 15334)
+++ /branches/PushGP/HeuristicLab.PushGP/Push.Thesis/Push.Thesis.csproj	(revision 15334)
@@ -0,0 +1,118 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{662C6679-3EE0-432F-A8A6-251CA165D30B}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Push.Thesis</RootNamespace>
+    <AssemblyName>Push.Thesis</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.ParallelEngine-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problem.ProgramSynthesis.BenchmarkSuite\HeuristicLab.BenchmarkSuite.csproj">
+      <Project>{22B5C087-CFC7-4D40-86C6-32FCF2CA921E}</Project>
+      <Name>HeuristicLab.BenchmarkSuite</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Problems.ProgramSynthesis\HeuristicLab.Problems.ProgramSynthesis.csproj">
+      <Project>{5C93448C-47E3-4C3F-B1D0-EE62A48C3204}</Project>
+      <Name>HeuristicLab.Problems.ProgramSynthesis</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/PushGP/HeuristicLab.PushGP/PushGp.sln
===================================================================
--- /branches/PushGP/HeuristicLab.PushGP/PushGp.sln	(revision 15333)
+++ /branches/PushGP/HeuristicLab.PushGP/PushGp.sln	(revision 15334)
@@ -15,4 +15,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ProgramSynthesis.Base", "HeuristicLab.Problems.ProgramSynthesis.Base\HeuristicLab.Problems.ProgramSynthesis.Base.csproj", "{0A60B6BA-8ACE-478E-98F3-57441B53B5F9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Push.Thesis", "Push.Thesis\Push.Thesis.csproj", "{662C6679-3EE0-432F-A8A6-251CA165D30B}"
 EndProject
 Global
@@ -46,4 +48,8 @@
 		{0A60B6BA-8ACE-478E-98F3-57441B53B5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0A60B6BA-8ACE-478E-98F3-57441B53B5F9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{662C6679-3EE0-432F-A8A6-251CA165D30B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{662C6679-3EE0-432F-A8A6-251CA165D30B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{662C6679-3EE0-432F-A8A6-251CA165D30B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{662C6679-3EE0-432F-A8A6-251CA165D30B}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
