Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/HeuristicLab.Problems.ProgramSynthesis.csproj	(revision 14897)
@@ -129,4 +129,5 @@
     <Compile Include="Push\Data\Tree\TreeExtensions.cs" />
     <Compile Include="Push\Data\Tree\TreeNode.cs" />
+    <Compile Include="Push\Constants\Environment.cs" />
     <Compile Include="Push\Exporter\Exporter.cs" />
     <Compile Include="Push\Expressions\BooleanExpressions.cs" />
@@ -149,4 +150,5 @@
     <Compile Include="Push\Expressions\NameExpressions.cs" />
     <Compile Include="Push\Expressions\PopExpressions.cs" />
+    <Compile Include="Push\Expressions\PrintExpressions.cs" />
     <Compile Include="Push\Expressions\PushExpressions.cs" />
     <Compile Include="Push\Expressions\PushProgram.cs" />
@@ -188,5 +190,4 @@
     <Compile Include="Push\Generators\CodeGenerator\RecursiveCodeGenerator.cs" />
     <Compile Include="Push\Generators\ErcUtils.cs" />
-    <Compile Include="Push\Generators\StringGenerator.cs" />
     <Compile Include="Push\Interpreter\Extensions.cs" />
     <Compile Include="Push\Interpreter\IInternalPushInterpreter.cs" />
@@ -199,8 +200,11 @@
     <Compile Include="Push\Interpreter\PushInterpreterPool.cs" />
     <Compile Include="Push\Parser\PushParser.cs" />
+    <Compile Include="Push\Problem\BenchmarkSuite\PushBenchmarkSuiteSolution.cs" />
     <Compile Include="Push\Problem\DataBounds.cs" />
     <Compile Include="Push\Problem\EvaluationResult.cs" />
     <Compile Include="Push\Problem\IndividualMapper.cs" />
-    <Compile Include="Push\Problem\PushEvaluator.cs" />
+    <Compile Include="Push\Problem\BenchmarkSuite\PushBenchmarkSuiteEvaluator.cs" />
+    <Compile Include="Push\Problem\BenchmarkSuite\PushBenchmarkSuiteProblem.cs" />
+    <Compile Include="Push\Problem\IPushEvaluator.cs" />
     <Compile Include="Push\Problem\PushProblem.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -220,9 +224,15 @@
       <DependentUpon>ExpressionSelectionView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Push\Views\PushProgramDebuggerView.cs">
+    <Compile Include="Push\Views\PushDebuggerView.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="Push\Views\PushProgramDebuggerView.Designer.cs">
-      <DependentUpon>PushProgramDebuggerView.cs</DependentUpon>
+    <Compile Include="Push\Views\PushDebuggerView.Designer.cs">
+      <DependentUpon>PushDebuggerView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Push\Problem\BenchmarkSuite\BenchmarkSuitePushSolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Push\Problem\BenchmarkSuite\BenchmarkSuitePushSolutionView.Designer.cs">
+      <DependentUpon>BenchmarkSuitePushSolutionView.cs</DependentUpon>
     </Compile>
   </ItemGroup>
@@ -231,10 +241,14 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
     </EmbeddedResource>
     <EmbeddedResource Include="Push\Views\ExpressionSelectionView.resx">
       <DependentUpon>ExpressionSelectionView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="Push\Views\PushProgramDebuggerView.resx">
-      <DependentUpon>PushProgramDebuggerView.cs</DependentUpon>
+    <EmbeddedResource Include="Push\Views\PushDebuggerView.resx">
+      <DependentUpon>PushDebuggerView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Push\Problem\BenchmarkSuite\BenchmarkSuitePushSolutionView.resx">
+      <DependentUpon>BenchmarkSuitePushSolutionView.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Plugin.cs	(revision 14897)
@@ -29,4 +29,5 @@
   [PluginFile("HeuristicLab.Problems.ProgramSynthesis.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Problems.ProgramSynthesis.BenchmarkSuite", "1.0")]
+  [PluginDependency("HeuristicLab.Problems.ProgramSynthesis.Base", "1.0")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Properties/Resources.resx	(revision 14897)
@@ -1,16 +1,16 @@
 ﻿<?xml version="1.0" encoding="utf-8"?>
 <root>
-  <!-- 
-    Microsoft ResX Schema 
-    
+  <!--
+    Microsoft ResX Schema
+
     Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
     associated with the data types.
-    
+
     Example:
-    
+
     ... ado.net/XML headers & schema ...
     <resheader name="resmimetype">text/microsoft-resx</resheader>
@@ -27,34 +27,34 @@
         <comment>This is a comment</comment>
     </data>
-                
-    There are any number of "resheader" rows that contain simple 
+
+    There are any number of "resheader" rows that contain simple
     name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
     mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
     extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
     read any of the formats listed below.
-    
+
     mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
+    value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
-    
+
     mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
+    value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
             : and then encoded with base64 encoding.
 
     mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
+    value   : The object must be serialized into a byte array
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
@@ -84,8 +84,8 @@
           <xsd:element name="data">
             <xsd:complexType>
-              <xsd:sequence>
+              <xsd:items>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
+              </xsd:items>
               <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
@@ -96,7 +96,7 @@
           <xsd:element name="resheader">
             <xsd:complexType>
-              <xsd:sequence>
+              <xsd:items>
                 <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
+              </xsd:items>
               <xsd:attribute name="name" type="xsd:string" use="required" />
             </xsd:complexType>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/IReadonlyPushConfiguration.cs	(revision 14897)
@@ -1,8 +1,7 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Configuration {
   using System.Collections.Generic;
-
-  using HeuristicLab.Common;
-  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Interfaces;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
+  using Base.Erc;
+  using Common;
+  using Stack;
 
   public interface IReadOnlyPushConfiguration : IDeepCloneable {
@@ -12,4 +11,5 @@
     int MaxStringLength { get; }
     int MaxVectorLength { get; }
+    int MinPointsInProgram { get; }
     int MaxPointsInProgram { get; }
     int MaxPointsInRandomExpression { get; }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Configuration/PushConfiguration.cs	(revision 14897)
@@ -5,5 +5,4 @@
   using Attributes;
   using Base.Erc;
-  using Base.Erc.Interfaces;
   using Common;
   using Core;
@@ -14,7 +13,4 @@
   [StorableClass]
   public class PushConfiguration : ParameterizedNamedItem, IReadOnlyPushConfiguration, IEnabledExpressionsConfiguration {
-
-
-
     public PushConfiguration() {
       Name = "Push Configuration";
@@ -25,9 +21,10 @@
       ErcOptions = new ErcOptions();
       EvalPushLimit = 1024;
-      MaxPointsInProgram = 128;
+      MinPointsInProgram = 25;
+      MaxPointsInProgram = 200;
       TopLevelPushCode = true;
       TopLevelPopCode = false;
       MaxPointsInRandomExpression = 64;
-      MaxStringLength = 32;
+      MaxStringLength = 128;
       MaxVectorLength = 64;
       MaxDepth = 32;
@@ -38,5 +35,5 @@
     private void InitEnabledStacks(bool state = true) {
       foreach (StackTypes type in Enum.GetValues(typeof(StackTypes))) {
-        if (!enabledStacks.ContainsKey(type))
+        if (!enabledStacks.ContainsKey(type) && type != StackTypes.None)
           enabledStacks.Add(type, state);
       }
@@ -54,4 +51,5 @@
       ErcOptions = cloner.Clone(origin.ErcOptions);
       EvalPushLimit = origin.EvalPushLimit;
+      MinPointsInProgram = origin.MinPointsInProgram;
       MaxPointsInProgram = origin.MaxPointsInProgram;
       MaxPointsInRandomExpression = origin.MaxPointsInRandomExpression;
@@ -72,5 +70,5 @@
 
     [Storable]
-    private Dictionary<StackTypes, bool> enabledStacks;
+    private readonly Dictionary<StackTypes, bool> enabledStacks;
 
     public IReadOnlyDictionary<StackTypes, bool> EnabledStacks { get { return enabledStacks; } }
@@ -122,8 +120,16 @@
 
     /// <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; }
+
+    /// <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
+    ///     exceeded should instead act as a NOOP, leaving all stacks in the states that they were in before the execution of the
     ///     instruction.
     /// </summary>
@@ -155,4 +161,20 @@
     [Storable]
     public int MaxVectorLength { get; set; }
+
+
+    public void SetEnabledStacks(StackTypes types) {
+      // Disable all
+      EnabledExpressions.Clear();
+
+      // Enable those are required
+      foreach (StackTypes type in Enum.GetValues(types.GetType())) {
+        if (type == StackTypes.None) continue;
+
+        enabledStacks[type] = false;
+
+        if (types.HasFlag(type))
+          EnableStack(type, true);
+      }
+    }
 
     public void EnableExpressionOfStack(StackTypes types) {
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/Environment.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/Environment.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Constants/Environment.cs	(revision 14897)
@@ -0,0 +1,10 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Constants {
+  public static class PushEnvironment {
+    public const char VectorStartSymbol = '[';
+    public const char VectorEndSymbol = ']';
+    public const char VectorSeparatorSymbol = ' ';
+
+    public const char CharacterSymbol = '\'';
+    public const char StringSymbol = '\"';
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/EqualsExpressions.cs	(revision 14897)
@@ -1,9 +1,8 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
   using System.Collections.Generic;
-
-  using HeuristicLab.Common;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
+  using Attributes;
+  using Common;
+  using Interpreter;
+  using Stack;
 
   /// <summary>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/PrintExpressions.cs	(revision 14897)
@@ -0,0 +1,127 @@
+﻿using System;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
+  using System.Collections.Generic;
+  using System.Text;
+
+  using Attributes;
+
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Constants;
+
+  using Interpreter;
+  using Stack;
+
+  [PushExpression(StackTypes.Print, "PRINT.NEWLINE")]
+  public class PrintNewLineExpression : StatelessExpression {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      interpreter.PrintStack.Push(Environment.NewLine);
+      return true;
+    }
+  }
+
+  public abstract class PrintExpression<T> : StatelessExpression {
+    protected bool Eval(IInternalPushInterpreter interpreter, IPushStack<T> stack) {
+      if (stack.IsEmpty)
+        return false;
+
+      var value = stack.Pop().ToString();
+      interpreter.PrintStack.Push(value);
+      return true;
+    }
+
+    protected bool EvalVector(IInternalPushInterpreter interpreter, IPushStack<List<T>> vectorStack) {
+      if (vectorStack.IsEmpty)
+        return false;
+
+      var sb = new StringBuilder();
+      var vector = vectorStack.Pop();
+
+      sb.Append(PushEnvironment.VectorStartSymbol);
+
+      if (vector.Count > 0) {
+        sb.Append(vector[0]);
+
+        for (var i = 1; i < vector.Count; i++) {
+          sb.Append(PushEnvironment.VectorSeparatorSymbol);
+          sb.Append(vector[i]);
+        }
+      }
+
+      sb.Append(PushEnvironment.VectorEndSymbol);
+
+      var value = sb.ToString();
+      interpreter.PrintStack.Push(value);
+      return true;
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTBOOLEAN", StackTypes.Boolean)]
+  public class BooleanPrintExpression : PrintExpression<bool> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.BooleanStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTCHAR", StackTypes.Char)]
+  public class CharPrintExpression : PrintExpression<char> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.CharStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTEXEC", StackTypes.Exec)]
+  public class ExecPrintExpression : PrintExpression<Expression> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.ExecStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTFLOAT", StackTypes.Float)]
+  public class FloatPrintExpression : PrintExpression<double> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.FloatStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTINTEGER", StackTypes.Integer)]
+  public class IntegerPrintExpression : PrintExpression<long> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.IntegerStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTSTRING", StackTypes.String)]
+  public class StringPrintExpression : PrintExpression<string> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return Eval(interpreter, interpreter.StringStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTINTEGERVECTOR", StackTypes.IntegerVector)]
+  public class IntegerVectorPrintExpression : PrintExpression<long> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return EvalVector(interpreter, interpreter.IntegerVectorStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTFLOATVECTOR", StackTypes.FloatVector)]
+  public class FloatVectorPrintExpression : PrintExpression<double> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return EvalVector(interpreter, interpreter.FloatVectorStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTSTRINGVECTOR", StackTypes.StringVector)]
+  public class StringVectorPrintExpression : PrintExpression<string> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return EvalVector(interpreter, interpreter.StringVectorStack);
+    }
+  }
+
+  [PushExpression(StackTypes.Print, "PRINT.PRINTBOOLEANVECTOR", StackTypes.BooleanVector)]
+  public class BooleanVectorPrintExpression : PrintExpression<bool> {
+    public override bool Eval(IInternalPushInterpreter interpreter) {
+      return EvalVector(interpreter, interpreter.BooleanVectorStack);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/RandExpressions.cs	(revision 14897)
@@ -1,9 +1,7 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Expressions {
   using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
-  using HeuristicLab.Random;
 
   /// <summary>
@@ -16,8 +14,5 @@
         return false;
 
-      var name = interpreter.CustomExpressions.Count == 0 || interpreter.Random.NextDouble() < interpreter.Configuration.ErcOptions.NameErcOptions.NewNameProbability
-                   ? ErcUtils.GetName(interpreter.Configuration.ErcOptions.NameErcOptions, interpreter.Random)
-                   : interpreter.CustomExpressions.Keys.SampleRandom(interpreter.Random);
-
+      var name = interpreter.Configuration.ErcOptions.NameErcOptions.GetErcValue(interpreter.Random);
       interpreter.NameStack.Push(name);
       return true;
@@ -34,5 +29,5 @@
         return false;
 
-      var value = ErcUtils.GetInteger(interpreter.Configuration.ErcOptions.IntegerErcOptions, interpreter.Random);
+      var value = interpreter.Configuration.ErcOptions.IntegerErcOptions.GetErcValue(interpreter.Random);
       interpreter.IntegerStack.Push(value);
       return true;
@@ -49,5 +44,5 @@
         return false;
 
-      var value = ErcUtils.GetDouble(interpreter.Configuration.ErcOptions.FloatErcOptions, interpreter.Random);
+      var value = interpreter.Configuration.ErcOptions.FloatErcOptions.GetErcValue(interpreter.Random);
       interpreter.FloatStack.Push(value);
       return true;
@@ -64,5 +59,5 @@
         return false;
 
-      var value = ErcUtils.GetBoolean(interpreter.Configuration.ErcOptions.BooleanErcOptions, interpreter.Random);
+      var value = interpreter.Configuration.ErcOptions.BooleanErcOptions.GetErcValue(interpreter.Random);
       interpreter.BooleanStack.Push(value);
       return true;
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs	(revision 14897)
@@ -3,9 +3,10 @@
 
 namespace HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator {
+  using Core;
+  using Expressions;
 
-  using HeuristicLab.Core;
-  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Interfaces;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
+  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
+
+  using Stack;
 
   internal static class CodeGeneratorUtils {
@@ -19,5 +20,5 @@
 
       return index >= enabledExpressions.Count
-        ? customExpressions.ElementAt(index - (enabledExpressions.Count - 1)).Value
+        ? customExpressions.Values.ElementAt(index - enabledExpressions.Count)
         : CreateExpressionOrErc(index, random, enabledExpressions, ercOptions);
     }
@@ -55,4 +56,5 @@
     }
 
+    private static readonly Expression Noop = ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
     /// <summary>
     /// Create a ErcExpression whereby the type of the expression conforms to the passed stack type.
@@ -65,41 +67,35 @@
       switch (type) {
         case StackTypes.Integer:
-          if (ercOptions.IntegerErcOptions == null || !ercOptions.IntegerErcOptions.IsEnabled)
-            return ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
-
-          var intValue = ErcUtils.GetInteger(ercOptions.IntegerErcOptions, random);
-
-          return new IntegerPushExpression(intValue);
+          return ercOptions.IntegerErcOptions == null || !ercOptions.IntegerErcOptions.IsEnabled
+             ? Noop
+             : new IntegerPushExpression(ercOptions.IntegerErcOptions.GetErcValue(random));
 
         case StackTypes.Float:
-          if (ercOptions.FloatErcOptions == null || !ercOptions.FloatErcOptions.IsEnabled)
-            return ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
-
-          var doubleValue = ErcUtils.GetDouble(ercOptions.FloatErcOptions, random);
-
-          return new FloatPushExpression(doubleValue);
+          return ercOptions.FloatErcOptions == null || !ercOptions.FloatErcOptions.IsEnabled
+            ? Noop
+            : new FloatPushExpression(ercOptions.FloatErcOptions.GetErcValue(random));
 
         case StackTypes.Boolean:
           return ercOptions.BooleanErcOptions == null || !ercOptions.BooleanErcOptions.IsEnabled
-            ? ExpressionTable.GetStatelessExpression<ExecNoopExpression>()
-            : new BooleanPushExpression(ErcUtils.GetBoolean(ercOptions.BooleanErcOptions, random));
+            ? Noop
+            : new BooleanPushExpression(ercOptions.BooleanErcOptions.GetErcValue(random));
 
         case StackTypes.Name:
           return ercOptions.NameErcOptions == null || !ercOptions.NameErcOptions.IsEnabled
-            ? ExpressionTable.GetStatelessExpression<ExecNoopExpression>()
-            : new NamePushExpression(ErcUtils.GetName(ercOptions.NameErcOptions, random));
+            ? Noop
+            : new NamePushExpression(ercOptions.NameErcOptions.GetErcValue(random));
 
         case StackTypes.String:
           return ercOptions.StringErcOptions == null || !ercOptions.StringErcOptions.IsEnabled
-            ? ExpressionTable.GetStatelessExpression<ExecNoopExpression>()
-            : new StringPushExpression(ErcUtils.GetString(ercOptions.StringErcOptions, random));
+            ? Noop
+            : new StringPushExpression(ercOptions.StringErcOptions.GetErcValue(random));
 
         case StackTypes.Char:
           return ercOptions.CharErcOptions == null || !ercOptions.CharErcOptions.IsEnabled
-            ? ExpressionTable.GetStatelessExpression<ExecNoopExpression>()
-            : new CharPushExpression(ErcUtils.GetChar(ercOptions.CharErcOptions, random));
+            ? Noop
+            : new CharPushExpression(ercOptions.CharErcOptions.GetErcValue(random));
 
         default:
-          return ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
+          return Noop;
       }
     }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/ErcUtils.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/ErcUtils.cs	(revision 14875)
+++ 	(revision )
@@ -1,50 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Generators {
-  using HeuristicLab.Core;
-  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Interfaces;
-
-  internal static class ErcUtils {
-    internal static int GetInteger(IReadOnlyIntegerErcOptions options, IRandom random) {
-      var x = options.Constants.Count == 0
-          ? 1
-          : random.Next(0, options.Constants.Count + 1);
-
-      var value = x < options.Constants.Count
-        ? options.Constants[x]
-        : random.Next(options.Start, options.End);
-
-      return value;
-    }
-
-    internal static double GetDouble(IReadOnlyFloatErcOptions options, IRandom random) {
-      var x = options.Constants.Count == 0 ?
-            1 :
-            random.Next(0, options.Constants.Count + 1);
-
-      var value = x < options.Constants.Count
-        ? options.Constants[x]
-        : random.NextDouble() * (options.End - options.Start) + options.Start;
-
-      return value;
-    }
-
-    internal static bool GetBoolean(IReadOnlyBooleanErcOptions options, IRandom random) {
-      var value = options.GetRandom(random);
-      return value;
-    }
-
-    internal static string GetString(IReadOnlyStringErcOptions options, IRandom random) {
-      var value = StringGenerator.RandomString(options, random);
-      return value;
-    }
-
-    internal static char GetChar(IReadOnlyCharErcOptions options, IRandom random) {
-      var value = StringGenerator.RandomChar(options.Start, options.End + 1, random);
-      return value;
-    }
-
-    internal static string GetName(IReadOnlyNameErcOptions options, IRandom random) {
-      var value = StringGenerator.RandomString(options, random);
-      return value;
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/StringGenerator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/StringGenerator.cs	(revision 14875)
+++ 	(revision )
@@ -1,91 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Generators {
-  using System;
-  using System.Linq;
-
-  using HeuristicLab.Core;
-  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Interfaces;
-  using HeuristicLab.Random;
-
-  public class StringGenerator {
-    public const int DefaultRandomNameLength = 10;
-
-    private static readonly char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
-    private static readonly char[] lowercaseChars = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
-    private static readonly char[] uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
-    private static readonly char[] digitChars = "1234567890".ToCharArray();
-    private const char space = ' ';
-
-    private int index;
-
-    public string GetNext() {
-      var length = this.index < chars.Length ? 1 : (int)Math.Log(this.index, chars.Length) + 1;
-      var result = new char[length];
-      var tmp = this.index;
-      this.index++;
-
-      for (var i = length; i > 0; i--) {
-        var a = (int)Math.Pow(chars.Length, i - 1);
-        var b = tmp / a;
-
-        result[length - i] = chars[b];
-
-        tmp -= a * b;
-      }
-
-      return new string(result);
-    }
-
-    public static string RandomName(IRandom random) {
-      return RandomName(DefaultRandomNameLength, random);
-    }
-
-    public static string RandomString(IReadOnlyStringErcOptions ercOptions, IRandom random) {
-      return RandomString(
-        ercOptions.AllowLowercaseLetters,
-        ercOptions.AllowUppercaseLetters,
-        ercOptions.AllowSpace,
-        ercOptions.SpaceProbability,
-        ercOptions.StringLength,
-        random);
-    }
-
-    public static string RandomName(int length = DefaultRandomNameLength, IRandom random = null) {
-      random = random ?? new FastRandom();
-      var name = new char[length];
-
-      for (var i = 0; i < length; i++)
-        name[i] = chars[random.Next(chars.Length)];
-
-      return new string(name);
-    }
-
-    public static string RandomString(bool allowLowercase, bool allowUppercase, bool allowSpace, double spaceProbability, int length, IRandom random = null) {
-      if (!allowLowercase && !allowUppercase) return string.Empty;
-
-      random = random ?? new FastRandom();
-      var name = new char[length];
-
-      var sourceChars = Enumerable.Empty<char>();
-      if (allowLowercase) sourceChars = sourceChars.Concat(lowercaseChars);
-      if (allowUppercase) sourceChars = sourceChars.Concat(uppercaseChars);
-
-      var chars = sourceChars.ToList();
-
-      for (var i = 0; i < name.Length; i++) {
-        name[i] = allowSpace && spaceProbability >= random.NextDouble()
-          ? space
-          : chars[random.Next(0, chars.Count)];
-      }
-
-      return new string(name);
-    }
-
-    public static char RandomChar(int from, int to, IRandom random = null) {
-      if (from > to) throw new InvalidOperationException();
-
-      random = random ?? new FastRandom();
-
-      return Convert.ToChar(from == to ? from : random.Next(from, to));
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 14897)
@@ -24,7 +24,9 @@
     IPushStack<List<bool>> BooleanVectorStack { get; }
     IPushStack<List<string>> StringVectorStack { get; }
+    IPushStack<string> PrintStack { get; }
     IDictionary<string, Expression> CustomExpressions { get; }
     IReadOnlyPushConfiguration Configuration { get; }
     void Clear();
+    void Reset();
     void Run(string code, bool stepwise = false);
     void Run(Expression expression, bool stepwise = false);
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 14897)
@@ -73,4 +73,8 @@
       };
 
+      PrintStack = new PushStack<string> {
+        IsEnabled = Configuration.EnabledStacks[StackTypes.Print]
+      };
+
       CustomExpressions = new Dictionary<string, Expression>();
       PoolContainer = poolContainer ?? new InterpreterPoolContainer();
@@ -155,4 +159,7 @@
     [PushStack(StackTypes.StringVector)]
     public IPushStack<List<string>> StringVectorStack { get; private set; }
+
+    [PushStack(StackTypes.Print)]
+    public IPushStack<string> PrintStack { get; private set; }
 
     public IDictionary<string, Expression> CustomExpressions { get; private set; }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.Designer.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.Designer.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.Designer.cs	(revision 14897)
@@ -0,0 +1,167 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Views;
+
+  partial class BenchmarkSuitePushSolutionView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (this.components != null)) {
+        this.components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.tabPage1 = new System.Windows.Forms.TabPage();
+      this.pushDebugger = new HeuristicLab.Problems.ProgramSynthesis.Push.Views.PushDebuggerView();
+      this.exampleComboBox = new System.Windows.Forms.ComboBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.tabPage2 = new System.Windows.Forms.TabPage();
+      this.resultsDataGrid = new System.Windows.Forms.DataGridView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.tabPage1.SuspendLayout();
+      this.tabPage2.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.resultsDataGrid)).BeginInit();
+      this.SuspendLayout();
+      //
+      // nameTextBox
+      //
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(755, 20);
+      //
+      // infoLabel
+      //
+      this.infoLabel.Location = new System.Drawing.Point(838, 3);
+      //
+      // tabControl
+      //
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.tabPage1);
+      this.tabControl.Controls.Add(this.tabPage2);
+      this.tabControl.Location = new System.Drawing.Point(6, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(848, 602);
+      this.tabControl.TabIndex = 12;
+      //
+      // tabPage1
+      //
+      this.tabPage1.AutoScroll = true;
+      this.tabPage1.Controls.Add(this.pushDebugger);
+      this.tabPage1.Controls.Add(this.exampleComboBox);
+      this.tabPage1.Controls.Add(this.label1);
+      this.tabPage1.Location = new System.Drawing.Point(4, 22);
+      this.tabPage1.Name = "tabPage1";
+      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage1.Size = new System.Drawing.Size(840, 576);
+      this.tabPage1.TabIndex = 0;
+      this.tabPage1.Text = "Debug";
+      this.tabPage1.UseVisualStyleBackColor = true;
+      //
+      // pushDebugger
+      //
+      this.pushDebugger.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pushDebugger.Caption = "View";
+      this.pushDebugger.Content = null;
+      this.pushDebugger.Location = new System.Drawing.Point(6, 33);
+      this.pushDebugger.Name = "pushDebugger";
+      this.pushDebugger.ReadOnly = false;
+      this.pushDebugger.Size = new System.Drawing.Size(831, 540);
+      this.pushDebugger.TabIndex = 12;
+      //
+      // exampleComboBox
+      //
+      this.exampleComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.exampleComboBox.FormattingEnabled = true;
+      this.exampleComboBox.Location = new System.Drawing.Point(58, 6);
+      this.exampleComboBox.Name = "exampleComboBox";
+      this.exampleComboBox.Size = new System.Drawing.Size(776, 21);
+      this.exampleComboBox.TabIndex = 11;
+      //
+      // label1
+      //
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(50, 13);
+      this.label1.TabIndex = 10;
+      this.label1.Text = "Example:";
+      //
+      // tabPage2
+      //
+      this.tabPage2.Controls.Add(this.resultsDataGrid);
+      this.tabPage2.Location = new System.Drawing.Point(4, 22);
+      this.tabPage2.Name = "tabPage2";
+      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+      this.tabPage2.Size = new System.Drawing.Size(840, 576);
+      this.tabPage2.TabIndex = 1;
+      this.tabPage2.Text = "Results";
+      this.tabPage2.UseVisualStyleBackColor = true;
+      //
+      // resultsDataGrid
+      //
+      this.resultsDataGrid.AllowUserToAddRows = false;
+      this.resultsDataGrid.AllowUserToDeleteRows = false;
+      this.resultsDataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+      this.resultsDataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.resultsDataGrid.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
+      this.resultsDataGrid.Location = new System.Drawing.Point(3, 3);
+      this.resultsDataGrid.Name = "resultsDataGrid";
+      this.resultsDataGrid.ReadOnly = true;
+      this.resultsDataGrid.Size = new System.Drawing.Size(834, 570);
+      this.resultsDataGrid.TabIndex = 0;
+      //
+      // BenchmarkSuitePushSolutionView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "BenchmarkSuitePushSolutionView";
+      this.Size = new System.Drawing.Size(857, 631);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.tabPage1.ResumeLayout(false);
+      this.tabPage1.PerformLayout();
+      this.tabPage2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.resultsDataGrid)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage tabPage1;
+    private System.Windows.Forms.ComboBox exampleComboBox;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TabPage tabPage2;
+    private System.Windows.Forms.DataGridView resultsDataGrid;
+    private PushDebuggerView pushDebugger;
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs	(revision 14897)
@@ -0,0 +1,226 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
+  using System;
+  using System.Globalization;
+  using System.Linq;
+  using System.Windows.Forms;
+  using Core.Views;
+  using HeuristicLab.BenchmarkSuite;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.BenchmarkSuite.Views;
+  using Interpreter;
+  using MainForm;
+  using Problem;
+  using Stack;
+
+  [View("Push Program Debugger")]
+  [Content(typeof(PushSolution), true)]
+  public partial class BenchmarkSuitePushSolutionView : NamedItemView {
+
+    private const string Separator = ", ";
+    private const string EmptySign = "-";
+
+    private const string exampleSplitter = " => ";
+    private const string AbsoluteDiffHeaderText = "Absolute Diff.";
+    private const string RelativeDiffHeaderText = "Relative Diff.";
+    private const string InputHeaderStringFormat = "Input {0} : {1}";
+    private const string EstimatedOutputHeaderStringFormat = "Estimated Output {0} : {1}";
+    private const string OutputHeaderStringFormat = "Output {0} : {1}";
+
+    private PooledPushInterpreter interpreter;
+    private PushInterpreterPool pool;
+
+    public BenchmarkSuitePushSolutionView() {
+      InitializeComponent();
+      Name = "Push Program Debugger";
+      InitEvents();
+    }
+
+    ~BenchmarkSuitePushSolutionView() {
+      this.interpreter.Dispose();
+    }
+
+    private void InitEvents() {
+      this.exampleComboBox.SelectedIndexChanged += this.SelectedExampleIndexChanged;
+      this.pushDebugger.OnReset += this.PushDebuggerReset;
+    }
+
+    private void PushDebuggerReset(object sender, IPushInterpreter interpreter) {
+      if (this.exampleComboBox.SelectedIndex < 0) return;
+
+      var example = Evaluator.Data.Examples[this.exampleComboBox.SelectedIndex];
+
+      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.IntegerVectorStack.Push(example.InputIntegerVector.Select(x => x.ToList()).ToArray());
+      interpreter.FloatVectorStack.Push(example.InputFloatVector.Select(x => x.ToList()).ToArray());
+      interpreter.StringVectorStack.Push(example.InputStringVector.Select(x => x.ToList()).ToArray());
+      interpreter.BooleanVectorStack.Push(example.InputBooleanVector.Select(x => x.ToList()).ToArray());
+    }
+
+    private void SelectedExampleIndexChanged(object sender, EventArgs e) {
+      this.pushDebugger.ResetDebugging();
+    }
+
+    public new PushBenchmarkSuiteSolution Content
+    {
+      get { return (PushBenchmarkSuiteSolution)base.Content; }
+      set
+      {
+        base.Content = value;
+      }
+    }
+
+    public PushBenchmarkSuiteEvaluator Evaluator
+    {
+      get { return (PushBenchmarkSuiteEvaluator)Content.Evaluator; }
+    }
+
+    protected override void OnContentChanged() {
+      if (this.Content == null) return;
+
+      this.Name = "Push Solution";
+      this.nameTextBox.Text = this.Name;
+
+      this.pool = new PushInterpreterPool(this.Content.Config);
+
+      if (this.interpreter != null) {
+        this.interpreter.Dispose();
+      }
+
+      this.interpreter = this.pool.Create(this.Content.Random);
+      this.UpdateExamples(Evaluator.Data);
+
+      if (this.exampleComboBox.SelectedIndex < 0) {
+        this.exampleComboBox.SelectedIndex = 0; // Triggers ResetDebugging via event
+      }
+
+      this.InitResultGrid();
+      this.pushDebugger.Content = this.Content;
+    }
+
+    private void InitResultGrid() {
+      this.resultsDataGrid.Columns.Clear();
+      this.resultsDataGrid.Rows.Clear();
+
+      var cellTemplate = new DataGridViewTextBoxCell();
+      var data = Evaluator.Data;
+
+      for (var i = 0; i < data.InputArgumentTypes.Length; i++) {
+        var headerTypeName = ViewHelper.GetHeaderTypeName(data.InputArgumentTypes[i]);
+        var column = new DataGridViewColumn {
+          HeaderText = string.Format(InputHeaderStringFormat, i + 1, headerTypeName),
+          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
+          CellTemplate = cellTemplate
+        };
+
+        column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
+        this.resultsDataGrid.Columns.Add(column);
+      }
+
+      for (var i = 0; i < data.OutputArgumentTypes.Length; i++) {
+        var headerTypeName = ViewHelper.GetHeaderTypeName(data.OutputArgumentTypes[i]);
+
+        var estimatedOutputColumn = new DataGridViewColumn {
+          HeaderText = string.Format(EstimatedOutputHeaderStringFormat, i + 1, headerTypeName),
+          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
+          CellTemplate = cellTemplate,
+        };
+
+        var outputColumn = new DataGridViewColumn {
+          HeaderText = string.Format(OutputHeaderStringFormat, i + 1, headerTypeName),
+          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
+          CellTemplate = cellTemplate
+        };
+
+        estimatedOutputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
+        outputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
+
+        this.resultsDataGrid.Columns.Add(estimatedOutputColumn);
+        this.resultsDataGrid.Columns.Add(outputColumn);
+      }
+
+      var absoluteDiffColumn = new DataGridViewColumn {
+        HeaderText = AbsoluteDiffHeaderText,
+        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
+        CellTemplate = cellTemplate
+      };
+
+      var relativeDiffColumn = new DataGridViewColumn {
+        HeaderText = RelativeDiffHeaderText,
+        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
+        CellTemplate = cellTemplate,
+      };
+
+      absoluteDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
+      relativeDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
+
+      this.resultsDataGrid.Columns.Add(absoluteDiffColumn);
+      this.resultsDataGrid.Columns.Add(relativeDiffColumn);
+
+      using (var pushInterpreter = this.pool.Create(this.Content.Random)) {
+        for (var i = 0; i < data.Examples.Length; i++) {
+          var example = data.Examples[i];
+          var row = new DataGridViewRow();
+          var absoluteDiff = Evaluator.Evaluate(pushInterpreter, Content.Program, i);
+          var relativeDiff = absoluteDiff / Math.Abs(data.BestResult - data.WorstResult) * 100d;
+
+          row.HeaderCell.Value = row.Index + 1;
+          row.CreateCells(this.resultsDataGrid);
+
+          for (var j = 0; j < data.InputArgumentTypes.Length; j++) {
+            row.Cells[j].Value = ViewHelper.StringifyInput(data.InputArgumentTypes[j], example, Separator);
+          }
+
+          for (var j = 0; j < data.OutputArgumentTypes.Length; j++) {
+            row.Cells[data.InputArgumentTypes.Length + j * 2].Value = ViewHelper.StringifyOutput(data.OutputArgumentTypes[j], example, Separator);
+            row.Cells[data.InputArgumentTypes.Length + j * 2 + 1].Value = this.StringifyResult(data.OutputArgumentTypes[j], pushInterpreter, example, Separator);
+          }
+
+          row.Cells[data.TotalArgumentCount + 1].Value = absoluteDiff;
+          row.Cells[data.TotalArgumentCount + 2].Value = relativeDiff + "%";
+
+          this.resultsDataGrid.Rows.Add(row);
+          pushInterpreter.Reset();
+        }
+      }
+    }
+
+    private string StringifyResult(ExampleArgumentType type, IPushInterpreter interpreter, Example example, string valueSeparator) {
+      switch (type) {
+        case ExampleArgumentType.Integer:
+        case ExampleArgumentType.IntegerVector: return interpreter.IntegerStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.IntegerStack.Peek(this.GetCount(interpreter.IntegerStack, example.OutputInteger)));
+
+        case ExampleArgumentType.Float:
+        case ExampleArgumentType.FloatVector: return interpreter.FloatStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.FloatStack.Peek(this.GetCount(interpreter.FloatStack, example.OutputFloat)).Select(d => d.ToString(CultureInfo.CurrentUICulture)));
+
+        case ExampleArgumentType.Boolean: return interpreter.BooleanStack.IsEmpty ? EmptySign : interpreter.BooleanStack.Top.ToString();
+        case ExampleArgumentType.Char: return interpreter.CharStack.IsEmpty ? EmptySign : interpreter.CharStack.Top.ToString();
+
+        case ExampleArgumentType.String:
+        case ExampleArgumentType.StringVector: return interpreter.StringStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.StringStack.Peek(this.GetCount(interpreter.StringStack, example.OutputString)));
+        default: return string.Empty;
+      }
+    }
+
+    private int GetCount<T>(IPushStack<T> stack, T[] data) {
+      return Math.Max(0, Math.Min(data.Length, stack.Count));
+    }
+
+    private void UpdateExamples(ProblemData data) {
+      this.exampleComboBox.Items.Clear();
+      if (data == null) return;
+
+      var stringRepresentations = data.Examples.Select(e =>
+        string.Join(Separator, e.InputArgs) +
+        exampleSplitter +
+        string.Join(Separator, e.OutputArgs));
+
+      foreach (var str in stringRepresentations) {
+        this.exampleComboBox.Items.Add(str);
+      }
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.resx	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.resx	(revision 14897)
@@ -0,0 +1,129 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>140, 17</value>
+  </metadata>
+</root>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteEvaluator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteEvaluator.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteEvaluator.cs	(revision 14897)
@@ -0,0 +1,294 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
+  using System;
+  using System.Collections.Generic;
+  using Common;
+  using Core;
+  using Expressions;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+
+  using Interpreter;
+  using Problem;
+  using Stack;
+
+  [StorableClass]
+  public class PushBenchmarkSuiteEvaluator : ParameterizedNamedItem, IPushEvaluator {
+
+    private const string DataBoundsParameterName = "DataBounds";
+    private const string DataParameterName = "Data";
+    private const string DataParameterDescription = "Program Synthesis";
+
+    public PushBenchmarkSuiteEvaluator() {
+      Parameters.Add(new FixedValueParameter<DataBounds>(DataBoundsParameterName));
+
+      Parameters.Add(new ValueParameter<ProblemData>(
+        DataParameterName,
+        DataParameterDescription));
+    }
+
+    public PushBenchmarkSuiteEvaluator(ProblemData data) : this() {
+      LoadData(data);
+    }
+
+    [StorableConstructor]
+    public PushBenchmarkSuiteEvaluator(bool deserializing) { }
+
+    public PushBenchmarkSuiteEvaluator(PushBenchmarkSuiteEvaluator origin, Cloner cloner) : base(origin, cloner) {
+      Data = cloner.Clone(origin.Data);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushBenchmarkSuiteEvaluator(this, cloner);
+    }
+
+    public IValueParameter<ProblemData> DataParameter
+    {
+      get { return (IValueParameter<ProblemData>)Parameters[DataParameterName]; }
+    }
+
+    public ProblemData Data
+    {
+      get { return DataParameter.Value; }
+      set { DataParameter.Value = value; }
+    }
+
+    public IValueParameter<DataBounds> DataBoundsParameter
+    {
+      get { return (IValueParameter<DataBounds>)Parameters[DataBoundsParameterName]; }
+    }
+
+    public DataBounds DataBounds
+    {
+      get { return DataBoundsParameter.Value; }
+      set { DataBoundsParameter.Value = value; }
+    }
+
+    public void LoadData(ProblemData data) {
+      this.Data = data;
+
+      DataBounds.TrainingRange.Start = 0;
+      DataBounds.TrainingRange.End = Data.TrainingCount;
+      DataBounds.TestRange.Start = Data.TrainingCount;
+      DataBounds.TestRange.End = Data.TrainingCount + Data.TestCount;
+    }
+
+    public EvaluationResult Evaluate(IPushInterpreter interpreter, PushProgram program, IRandom random, int start, int end) {
+      var length = end - start;
+      if (length <= 0) return null;
+
+      var evaluationResult = new EvaluationResult(length);
+
+      for (var i = start; i < end; i++) {
+        var result = Evaluate(interpreter, program, i);
+        evaluationResult.ExampleQualities[i - start] = result;
+        evaluationResult.TotalQuality += result;
+        interpreter.Reset();
+      }
+
+      evaluationResult.TotalQuality /= length;
+
+      return evaluationResult;
+    }
+
+    public EvaluationResult EvaluateTest(IPushInterpreter interpreter, PushProgram program, IRandom random) {
+      return Evaluate(interpreter, program, random, DataBounds.TestRange.Start, DataBounds.TestRange.End);
+    }
+
+    public EvaluationResult EvaluateTest(IReadOnlyPushConfiguration config, PushProgram program, IRandom random) {
+      var interpreter = new PushInterpreter(config, random);
+      return EvaluateTest(interpreter, program, random);
+    }
+
+    public EvaluationResult EvaluateTest(PushInterpreterPool pool, PushProgram program, IRandom random) {
+      using (var interpreter = pool.Create(random)) {
+        return EvaluateTest(interpreter, program, random);
+      }
+    }
+
+    public EvaluationResult EvaluateTraining(IPushInterpreter interpreter, PushProgram program, IRandom random) {
+      return Evaluate(interpreter, program, random, DataBounds.TrainingRange.Start, DataBounds.TrainingRange.End);
+    }
+
+    public EvaluationResult EvaluateTraining(IReadOnlyPushConfiguration config, PushProgram program, IRandom random) {
+      var interpreter = new PushInterpreter(config, random);
+      return EvaluateTraining(interpreter, program, random);
+    }
+
+    public EvaluationResult EvaluateTraining(PushInterpreterPool pool, PushProgram program, IRandom random) {
+      using (var interpreter = pool.Create(random)) {
+        return EvaluateTraining(interpreter, program, random);
+      }
+    }
+
+    public double Evaluate(IPushInterpreter interpreter, PushProgram program, int exampleIndex) {
+      var example = Data.Examples[exampleIndex];
+
+      interpreter.BooleanStack.Push(example.InputBoolean);
+      interpreter.IntegerStack.Push(example.InputInteger);
+      interpreter.FloatStack.Push(example.InputFloat);
+
+      interpreter.Run(program);
+
+      var result = GetDiff(example.OutputInteger, interpreter.IntegerStack, Data.WorstResult, IntegerDiffer)
+                 + GetDiff(example.OutputFloat, interpreter.FloatStack, Data.WorstResult, FloatDiffer)
+                 + GetDiff(example.OutputBoolean, interpreter.BooleanStack, Data.WorstResult, BooleanDiffer)
+                 + GetDiff(example.OutputString, interpreter.StringStack, Data.WorstResult, StringDiffer)
+                 + GetDiff(example.OutputChar, interpreter.CharStack, Data.WorstResult, CharDiffer)
+                 + GetPrintDiffer(example.OutputPrint, interpreter.PrintStack)
+                 + GetVectorDiff(example.OutputIntegerVector, interpreter.IntegerVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, IntegerDiffer))
+                 + GetVectorDiff(example.OutputFloatVector, interpreter.FloatVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, FloatDiffer))
+                 + GetVectorDiff(example.OutputStringVector, interpreter.StringVectorStack, Data.WorstResult, (a, b) => VectorDiffer(a, b, StringDiffer));
+
+      return result;
+    }
+
+    private static double FloatDiffer(double a, double b) {
+      var result = a - b;
+
+      if (result.IsAlmost(double.MinValue) || double.IsPositiveInfinity(result) || double.IsNaN(result))
+        return double.MaxValue;
+
+      if (result.IsAlmost(double.MaxValue) || double.IsNegativeInfinity(result))
+        return double.MinValue;
+
+      return Math.Abs(result);
+    }
+
+    private static double IntegerDiffer(long a, long b) {
+      var result = a - b;
+
+      return result == long.MinValue ? long.MaxValue : Math.Abs(result);
+    }
+
+    private static double BooleanDiffer(bool a, bool b) {
+      return a && b ? 0 : a || b ? 1 : 2;
+    }
+
+    private static double StringDiffer(string a, string b) {
+      return LevenshteinDistance(a, b);
+    }
+
+    private static double CharDiffer(char a, char b) {
+      return IntegerDiffer(a, b);
+    }
+
+    private static double VectorDiffer<T>(IReadOnlyList<T> estimated, IReadOnlyList<T> outcome, Func<T, T, double> differ) {
+      var length = Math.Min(estimated.Count, outcome.Count);
+      var result = 0d;
+
+      for (var i = 0; i < length; i++) {
+        result += differ(estimated[i], outcome[i]);
+      }
+
+      if (estimated.Count > outcome.Count) {
+        var remainingLength = estimated.Count - length;
+        for (var i = 0; i < remainingLength; i++)
+          result += differ(estimated[i], default(T));
+      }
+
+      return result;
+    }
+
+    private static double GetPrintDiffer(string estimated, IPushStack<string> printStack) {
+      var printResult = string.Join(Environment.NewLine, printStack);
+
+      return LevenshteinDistance(estimated, printResult);
+    }
+
+    private static double GetVectorDiff<T>(IReadOnlyList<IReadOnlyList<T>> estimated, IPushStack<List<T>> resultStack, double worstResult, Func<IReadOnlyList<T>, IReadOnlyList<T>, double> differ)
+      where T : IComparable {
+      if (estimated.Count == 0) return 0d;
+
+      var diff = 0d;
+      var comparableLength = 0;
+
+      if (!resultStack.IsEmpty) {
+        var count = Math.Min(estimated.Count, resultStack.Count);
+        var result = resultStack.Peek(count);
+        comparableLength = Math.Min(estimated.Count, result.Length);
+
+        for (var i = 0; i < comparableLength; i++) {
+          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
+        }
+      }
+
+      var emptyTArray = new T[0];
+      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
+        diff += differ(estimated[i], emptyTArray);
+      }
+
+      return diff;
+    }
+
+    private static double GetDiff<T>(IReadOnlyList<T> estimated, IPushStack<T> resultStack, double worstResult, Func<T, T, double> differ)
+      where T : IComparable {
+      if (estimated.Count == 0) return 0d;
+
+      var diff = 0d;
+      var comparableLength = 0;
+
+      if (!resultStack.IsEmpty) {
+        var count = Math.Min(estimated.Count, resultStack.Count);
+        var result = resultStack.Peek(count);
+        comparableLength = Math.Min(estimated.Count, result.Length);
+
+        for (var i = 0; i < comparableLength; i++) {
+          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
+        }
+      }
+
+      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
+        diff += differ(estimated[i], default(T));
+      }
+
+      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/Problem/BenchmarkSuite/PushBenchmarkSuiteProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteProblem.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteProblem.cs	(revision 14897)
@@ -0,0 +1,68 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
+  using System.Linq;
+  using Common;
+  using Configuration;
+  using Core;
+  using Encodings.IntegerVectorEncoding;
+  using Expressions;
+  using HeuristicLab.BenchmarkSuite.Problems;
+  using Instances;
+  using Persistence.Default.CompositeSerializers.Storable;
+  using Stack;
+
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
+  [Item("Push BenchmarkSuite Problem", "")]
+  public class PushBenchmarkSuiteProblem : PushProblem, IProblemInstanceConsumer<ProblemData> {
+    public PushBenchmarkSuiteProblem() : base(new PushBenchmarkSuiteEvaluator()) {
+      Parameters.Add(PushEvaluator.DataParameter);
+      Parameters.Add(PushEvaluator.DataBoundsParameter);
+    }
+
+    [StorableConstructor]
+    protected PushBenchmarkSuiteProblem(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected PushBenchmarkSuiteProblem(PushProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushBenchmarkSuiteProblem(this, cloner);
+    }
+
+    public new PushBenchmarkSuiteEvaluator PushEvaluator { get { return (PushBenchmarkSuiteEvaluator)base.PushEvaluator; } }
+
+    public void Load(ProblemData data) {
+      PushEvaluator.LoadData(data);
+
+      BestKnownQuality = data.BestResult;
+      MaxPointsInProgram = data.MaxSize;
+      MinPointsInProgram = data.MaxSize;
+      EvalPushLimit = data.EvalLimit;
+      ErcOptions = data.ErcOptions;
+
+      config.SetEnabledStacks((StackTypes)data.EnabledDataTypes);
+
+      // update enabled stack types
+      foreach (var stackType in ExpressionTable.StackTypeToNamesTable.Keys) {
+        var enable = config.EnabledExpressions.Intersect(ExpressionTable.StackTypeToNamesTable[stackType]).Any();
+        config.SetStack(stackType, enable);
+      }
+
+      Encoding.Bounds[0, 0] = 0;
+      Encoding.Bounds[0, 1] = config.EnabledExpressions.Count;
+      Encoding.Length = config.MaxPointsInProgram;
+    }
+
+    protected override PushSolution CreatePushSolution(
+      IntegerVector vector,
+      double bestQuality,
+      IRandom random,
+      IReadOnlyPushConfiguration config,
+      IPushEvaluator evaluator) {
+      return new PushBenchmarkSuiteSolution(vector, bestQuality, random, config, (PushBenchmarkSuiteEvaluator)PushEvaluator.Clone());
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteSolution.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteSolution.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/PushBenchmarkSuiteSolution.cs	(revision 14897)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
+  using Common;
+  using Configuration;
+  using Core;
+  using Encodings.IntegerVectorEncoding;
+  using Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class PushBenchmarkSuiteSolution : PushSolution {
+    public PushBenchmarkSuiteSolution(
+      IntegerVector integerVector,
+      double quality,
+      IRandom random,
+      IReadOnlyPushConfiguration config,
+      PushBenchmarkSuiteEvaluator evaluator,
+      bool simplify = false) : base(integerVector, quality, random, config, evaluator, simplify) {
+    }
+
+    public PushBenchmarkSuiteSolution(PushBenchmarkSuiteSolution origin, Cloner cloner) : base(origin, cloner) { }
+
+    [StorableConstructor]
+    public PushBenchmarkSuiteSolution(bool deserializing) : base(deserializing) { }
+
+    public override PushSolution Simplify() {
+      return new PushBenchmarkSuiteSolution(IntegerVector, Quality, Random, Config, (PushBenchmarkSuiteEvaluator)Evaluator, true);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PushBenchmarkSuiteSolution(this, cloner);
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/EvaluationResult.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/EvaluationResult.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/EvaluationResult.cs	(revision 14897)
@@ -1,20 +1,11 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem
-{
-    public class EvaluationResult
-    {
-      public EvaluationResult(int exampleCount)
-      {
-        ExampleQualities = new double[exampleCount];
-      }
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
+  public class EvaluationResult {
+    public EvaluationResult(int exampleCount) {
+      ExampleQualities = new double[exampleCount];
+    }
 
 
-        public double TotalQuality { get; set; }
-        public double[] ExampleQualities { get; set; }
-    }
+    public double TotalQuality { get; set; }
+    public double[] ExampleQualities { get; set; }
+  }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IPushEvaluator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IPushEvaluator.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IPushEvaluator.cs	(revision 14897)
@@ -0,0 +1,16 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
+
+  public interface IPushEvaluator : IDeepCloneable {
+    EvaluationResult EvaluateTest(IReadOnlyPushConfiguration config, PushProgram program, IRandom random);
+    EvaluationResult EvaluateTest(IPushInterpreter interpreter, PushProgram program, IRandom random);
+    EvaluationResult EvaluateTest(PushInterpreterPool pool, PushProgram program, IRandom random);
+    EvaluationResult EvaluateTraining(IReadOnlyPushConfiguration config, PushProgram program, IRandom random);
+    EvaluationResult EvaluateTraining(IPushInterpreter interpreter, PushProgram program, IRandom random);
+    EvaluationResult EvaluateTraining(PushInterpreterPool pool, PushProgram program, IRandom random);
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IndividualMapper.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IndividualMapper.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/IndividualMapper.cs	(revision 14897)
@@ -43,7 +43,8 @@
 
     private static PushProgram ToPushProgram(this IntegerVector vector, IReadOnlyPushConfiguration config, IRandom random) {
-      var expressions = new Expression[vector.Length];
       var enabledExpressions = config.EnabledExpressions;
       var ercOptions = config.ErcOptions;
+      //var programLength = random.Next(config.MinPointsInProgram, config.MaxPointsInProgram + 1);
+      var expressions = new Expression[vector.Length];
 
       for (var i = 0; i < vector.Length; i++)
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushEvaluator.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushEvaluator.cs	(revision 14875)
+++ 	(revision )
@@ -1,198 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-
-  using HeuristicLab.BenchmarkSuite;
-  using HeuristicLab.BenchmarkSuite.Problems;
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
-
-  public static class PushEvaluator {
-    public static double Evaluate(IPushInterpreter interpreter, PushProgram program, Example example, double worstResult) {
-      interpreter.BooleanStack.Push(example.InputBoolean);
-      interpreter.IntegerStack.Push(example.InputInteger);
-      interpreter.FloatStack.Push(example.InputFloat);
-
-      interpreter.Run(program);
-
-      var result = GetDiff(example.OutputInteger, interpreter.IntegerStack, worstResult, IntegerDiffer)
-                 + GetDiff(example.OutputFloat, interpreter.FloatStack, worstResult, FloatDiffer)
-                 + GetDiff(example.OutputBoolean, interpreter.BooleanStack, worstResult, BooleanDiffer)
-                 + GetDiff(example.OutputString, interpreter.StringStack, worstResult, StringDiffer)
-                 + GetDiff(example.OutputChar, interpreter.CharStack, worstResult, CharDiffer)
-                 + GetVectorDiff(example.OutputIntegerVector, interpreter.IntegerVectorStack, worstResult, (a, b) => VectorDiffer(a, b, IntegerDiffer))
-                 + GetVectorDiff(example.OutputFloatVector, interpreter.FloatVectorStack, worstResult, (a, b) => VectorDiffer(a, b, FloatDiffer))
-                 + GetVectorDiff(example.OutputStringVector, interpreter.StringVectorStack, worstResult, (a, b) => VectorDiffer(a, b, StringDiffer));
-
-      return result;
-    }
-
-    public static EvaluationResult Evaluate(PushProgram program, PushInterpreterPool pool, IRandom random, ProblemData data, int startIndex, int endIndex) {
-      var length = endIndex - startIndex;
-      if (length <= 0) return null;
-
-      var evaluationResult = new EvaluationResult(length);
-
-      using (var interpreter = pool.Create(random)) {
-        for (var i = startIndex; i < endIndex; i++) {
-          var result = Evaluate(interpreter, program, data.Examples[i], data.WorstResult);
-          evaluationResult.ExampleQualities[i - startIndex] = result;
-          evaluationResult.TotalQuality += result;
-          interpreter.Reset();
-        }
-      }
-
-      evaluationResult.TotalQuality /= length;
-
-      return evaluationResult;
-    }
-
-    private static double FloatDiffer(double a, double b) {
-      var result = a - b;
-
-      if (result.IsAlmost(double.MinValue) || double.IsPositiveInfinity(result) || double.IsNaN(result))
-        return double.MaxValue;
-
-      if (result.IsAlmost(double.MaxValue) || double.IsNegativeInfinity(result))
-        return double.MinValue;
-
-      return Math.Abs(result);
-    }
-
-    private static double IntegerDiffer(long a, long b) {
-      var result = a - b;
-
-      return result == long.MinValue ? long.MaxValue : Math.Abs(result);
-    }
-
-    private static double BooleanDiffer(bool a, bool b) {
-      return a && b ? 0 : a || b ? 1 : 2;
-    }
-
-    private static double StringDiffer(string a, string b) {
-      return LevenshteinDistance(a, b);
-    }
-
-    private static double CharDiffer(char a, char b) {
-      return IntegerDiffer(a, b);
-    }
-
-    private static double VectorDiffer<T>(IReadOnlyList<T> a, IReadOnlyList<T> b, Func<T, T, double> differ) {
-      var length = Math.Min(a.Count, b.Count);
-      var result = 0d;
-
-      for (var i = 0; i < length; i++) {
-        result += differ(a[i], b[i]);
-      }
-
-      if (a.Count > b.Count) {
-        var remainingLength = a.Count - length;
-        for (var i = 0; i < remainingLength; i++)
-          result += differ(a[i], default(T));
-      }
-
-      return result;
-    }
-
-    private static double GetVectorDiff<T>(IReadOnlyList<IReadOnlyList<T>> estimated, IPushStack<List<T>> resultStack, double worstResult, Func<IReadOnlyList<T>, IReadOnlyList<T>, double> differ)
-      where T : IComparable {
-      if (estimated.Count == 0) return 0d;
-
-      var diff = 0d;
-      var comparableLength = 0;
-
-      if (!resultStack.IsEmpty) {
-        var count = Math.Min(estimated.Count, resultStack.Count);
-        var result = resultStack.Peek(count);
-        comparableLength = Math.Min(estimated.Count, result.Length);
-
-        for (var i = 0; i < comparableLength; i++) {
-          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
-        }
-      }
-
-      var emptyTArray = new T[0];
-      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
-        diff += differ(estimated[i], emptyTArray);
-      }
-
-      return diff;
-    }
-
-    private static double GetDiff<T>(IReadOnlyList<T> estimated, IPushStack<T> resultStack, double worstResult, Func<T, T, double> differ)
-      where T : IComparable {
-      if (estimated.Count == 0) return 0d;
-
-      var diff = 0d;
-      var comparableLength = 0;
-
-      if (!resultStack.IsEmpty) {
-        var count = Math.Min(estimated.Count, resultStack.Count);
-        var result = resultStack.Peek(count);
-        comparableLength = Math.Min(estimated.Count, result.Length);
-
-        for (var i = 0; i < comparableLength; i++) {
-          diff += Math.Min(differ(estimated[i], result[i]), worstResult);
-        }
-      }
-
-      for (var i = comparableLength; i < estimated.Count - comparableLength; i++) {
-        diff += differ(estimated[i], default(T));
-      }
-
-      return diff;
-    }
-
-    /// <summary>
-    /// https://www.dotnetperls.com/levenshtein
-    /// </summary>
-    /// <param name="s"></param>
-    /// <param name="t"></param>
-    /// <returns></returns>
-    private static int LevenshteinDistance(string s, string t) {
-      if (s == null && t == null) return 0;
-      if (s == null) return t.Length;
-      if (t == null) return s.Length;
-
-      int n = s.Length;
-      int m = t.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 = (t[j - 1] == s[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/Problem/PushProblem.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushProblem.cs	(revision 14897)
@@ -2,7 +2,6 @@
 
 namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-  using System.Collections.Generic;
   using System.Linq;
-  using BenchmarkSuite.Problems;
+
   using Common;
   using Configuration;
@@ -10,9 +9,8 @@
   using Data.Pool;
   using Encodings.IntegerVectorEncoding;
-  using Expressions;
   using HeuristicLab.Data;
   using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
-
-  using Instances;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite;
+
   using Interpreter;
   using Optimization;
@@ -20,14 +18,14 @@
   using Persistence.Default.CompositeSerializers.Storable;
   using Random;
-  using Stack;
 
   [StorableClass]
-  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
-  [Item("Push Problem", "")]
-  public class PushProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding>, IProblemInstanceConsumer<ProblemData> {
+  public abstract class PushProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding> {
     [Storable]
-    private readonly PushConfiguration config;
-    private PushInterpreterPool pool;
-    private readonly ObjectPool<IRandom> randomPool = new ObjectPool<IRandom>(() => new MersenneTwister());
+    protected readonly PushConfiguration config;
+    protected PushInterpreterPool pool;
+    protected readonly ObjectPool<IRandom> randomPool = new ObjectPool<IRandom>(() => new MersenneTwister());
+
+    [Storable]
+    protected readonly IPushEvaluator PushEvaluator;
 
     public const string CaseQualitiesScopeParameterName = "CaseQualities";
@@ -35,6 +33,7 @@
     private const string TestQualityResultName = "Test Quality";
 
-    public PushProblem() {
+    protected PushProblem(PushBenchmarkSuiteEvaluator evaluator) {
       config = new PushConfiguration();
+      PushEvaluator = evaluator;
 
       InitData();
@@ -44,11 +43,12 @@
 
     [StorableConstructor]
-    public PushProblem(bool deserializing)
+    protected PushProblem(bool deserializing)
       : base(deserializing) {
     }
 
-    public PushProblem(PushProblem original, Cloner cloner)
+    protected PushProblem(PushProblem original, Cloner cloner)
       : base(original, cloner) {
       config = cloner.Clone(original.config);
+      PushEvaluator = cloner.Clone(original.PushEvaluator);
 
       InitData();
@@ -78,13 +78,12 @@
     #region Parameters
 
-    private const string DataBoundsParameterName = "DataBounds";
-    private const string DataParameterName = "Data";
-    private const string DataParameterDescription = "Program Synthesis";
     private const string InstructionsParameterName = "Instructions";
     private const string InstructionsParameterDescription = "Enables/Disables Instructions";
     private const string EvalPushLimitParameterName = "EvalPushLimit";
     private const string EvalPushLimitParameterDescription = "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 MinPointsInProgramParameterName = "MinProgramLength";
+    private const string MinProgramLengthParameterDescription = "This is the minimum 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 MaxPointsInProgramParameterName = "MaxProgramLength";
-    private const string MaxProgramLengthParameterDescription = "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.";
+    private const string MaxProgramLengthParameterDescription = "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 TopLevelPushCodeParameterName = "TopLevelPushCode";
     private const string TopLevelPushCodeParameterDescription = "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.";
@@ -98,6 +97,4 @@
 
     private void InitParameters() {
-      Parameters.Add(new FixedValueParameter<DataBounds>(DataBoundsParameterName));
-
       Parameters.Add(new ValueParameter<IEnabledExpressionsConfiguration>(
         InstructionsParameterName,
@@ -105,8 +102,4 @@
         config));
 
-      Parameters.Add(new ValueParameter<ProblemData>(
-        DataParameterName,
-        DataParameterDescription));
-
       Parameters.Add(new ValueParameter<ErcOptions>(ErcOptionsParameterName, config.ErcOptions));
 
@@ -117,8 +110,13 @@
 
       Parameters.Add(new FixedValueParameter<IntValue>(
+        MinPointsInProgramParameterName,
+        MinProgramLengthParameterDescription,
+        new IntValue(config.MinPointsInProgram)) { Hidden = true });
+
+      Parameters.Add(new FixedValueParameter<IntValue>(
         MaxPointsInProgramParameterName,
         MaxProgramLengthParameterDescription,
         new IntValue(config.MaxPointsInProgram)));
-      Encoding.LengthParameter = Parameters[MaxPointsInProgramParameterName] as IFixedValueParameter<IntValue>;
+      Encoding.LengthParameter = MaxPointsInProgramParameter as IFixedValueParameter<IntValue>;
 
       Parameters.Add(new FixedValueParameter<BoolValue>(
@@ -153,16 +151,4 @@
     }
 
-    public IValueParameter<DataBounds> DataBoundsParameter
-    {
-      get { return (IValueParameter<DataBounds>)Parameters[DataBoundsParameterName]; }
-    }
-
-    public DataBounds DataBounds
-    {
-      get { return DataBoundsParameter.Value; }
-      set { DataBoundsParameter.Value = value; }
-    }
-
-
     public IValueParameter<IEnabledExpressionsConfiguration> InstructionsParameter
     {
@@ -174,15 +160,4 @@
       get { return InstructionsParameter.Value; }
       set { InstructionsParameter.Value = value; }
-    }
-
-    public IValueParameter<ProblemData> DataParameter
-    {
-      get { return (IValueParameter<ProblemData>)Parameters[DataParameterName]; }
-    }
-
-    public ProblemData Data
-    {
-      get { return DataParameter.Value; }
-      set { DataParameter.Value = value; }
     }
 
@@ -267,4 +242,26 @@
 
     /// <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>
+    public IValueParameter<IntValue> MinPointsInProgramParameter
+    {
+      get { return (IValueParameter<IntValue>)this.Parameters[MinPointsInProgramParameterName]; }
+    }
+
+    public int MinPointsInProgram
+    {
+      get { return config.MaxPointsInProgram; }
+      set
+      {
+        MinPointsInProgramParameter.Value.Value = value;
+        config.MinPointsInProgram = value;
+      }
+    }
+
+    /// <summary>
     ///     The maximum number of points in an expression produced by the CODE.RAND instruction.
     /// </summary>
@@ -338,8 +335,4 @@
 
     public override bool Maximization { get { return false; } }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new PushProblem(this, cloner);
-    }
 
     public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
@@ -357,15 +350,20 @@
     private void AnalyzeBestTestSolution(IntegerVector bestIndividual, ResultCollection results, IRandom random) {
       var program = bestIndividual.ToPushProgram(config, randomPool);
-      var trainingResult = PushEvaluator.Evaluate(program, pool, random, Data, DataBounds.TestRange.Start, DataBounds.TestRange.End);
+      var testResult = PushEvaluator.EvaluateTest(pool, program, random);
 
       if (!results.ContainsKey(TestQualityResultName)) {
-        results.Add(new Result(TestQualityResultName, new DoubleValue(trainingResult.TotalQuality)));
+        results.Add(new Result(TestQualityResultName, new DoubleValue(testResult.TotalQuality)));
       } else {
-        ((DoubleValue)results[TestQualityResultName].Value).Value = trainingResult.TotalQuality;
+        ((DoubleValue)results[TestQualityResultName].Value).Value = testResult.TotalQuality;
       }
     }
 
     private bool AnalyzeBestTrainingSolution(IntegerVector bestIndividual, double bestQuality, ResultCollection results, IRandom random) {
-      var solution = new PushSolution(bestIndividual, bestQuality, Data, random, config, DataBounds.TrainingRange.Start, DataBounds.TrainingRange.End);
+      var solution = CreatePushSolution(
+        bestIndividual,
+        bestQuality,
+        random,
+        config,
+        PushEvaluator);
 
       if (!results.ContainsKey(BestTrainingSolutionResultName)) {
@@ -385,42 +383,18 @@
     }
 
+    protected abstract PushSolution CreatePushSolution(
+      IntegerVector vector,
+      double bestQuality,
+      IRandom random,
+      IReadOnlyPushConfiguration config,
+      IPushEvaluator evaluator);
+
     public override double Evaluate(Individual individual, IRandom random) {
       var program = individual.ToPushProgram(config, randomPool);
-      var result = PushEvaluator.Evaluate(
-        program,
-        pool,
-        random,
-        Data,
-        DataBounds.TrainingRange.Start,
-        DataBounds.TrainingRange.End);
-
-      individual.SetScopeValue(CaseQualitiesScopeParameterName, new DoubleArray(result.ExampleQualities));
+      var result = PushEvaluator.EvaluateTraining(pool, program, random);
+
+      individual[CaseQualitiesScopeParameterName] = new DoubleArray(result.ExampleQualities);
 
       return result.TotalQuality;
-    }
-
-    public void Load(ProblemData data) {
-      Data = data;
-      BestKnownQuality = data.BestResult;
-      MaxPointsInProgram = data.MaxSize;
-      EvalPushLimit = data.EvalLimit;
-      ErcOptions = data.ErcOptions;
-
-      config.EnabledExpressions = (IList<string>)ExpressionTable.GetExpressionsByStackTypes((StackTypes)data.EnabledDataTypes);
-
-      // update enabled stack types
-      foreach (var stackType in ExpressionTable.StackTypeToNamesTable.Keys) {
-        var enable = config.EnabledExpressions.Intersect(ExpressionTable.StackTypeToNamesTable[stackType]).Any();
-        config.SetStack(stackType, enable);
-      }
-
-      Encoding.Bounds[0, 0] = 0;
-      Encoding.Bounds[0, 1] = config.EnabledExpressions.Count;
-      Encoding.Length = config.MaxPointsInProgram;
-
-      DataBounds.TrainingRange.Start = 0;
-      DataBounds.TrainingRange.End = Data.TrainingCount;
-      DataBounds.TestRange.Start = Data.TrainingCount;
-      DataBounds.TestRange.End = Data.TrainingCount + Data.TestCount;
     }
   }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushSolution.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushSolution.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/PushSolution.cs	(revision 14897)
@@ -1,9 +1,9 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem {
-  using HeuristicLab.BenchmarkSuite.Problems;
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Encodings.IntegerVectorEncoding;
-  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using Common;
+  using Configuration;
+  using Core;
+  using Encodings.IntegerVectorEncoding;
+  using Expressions;
+  using Persistence.Default.CompositeSerializers.Storable;
 
   [StorableClass]
@@ -14,41 +14,40 @@
     public readonly IntegerVector IntegerVector;
     [Storable]
-    public readonly ProblemData Data;
-    [Storable]
     public readonly IRandom Random;
     [Storable]
     public readonly IReadOnlyPushConfiguration Config;
+
     [Storable]
-    public readonly int DataStart;
-    [Storable]
-    public readonly int DataEnd;
-    [Storable]
-    public readonly bool Simplify;
+    public readonly IPushEvaluator Evaluator;
 
-    public PushSolution(IntegerVector integerVector, double quality, ProblemData data, IRandom random, IReadOnlyPushConfiguration config, int dataStart, int dataEnd, bool simplify = false)
+    public readonly PushProgram Program;
+
+    public PushSolution(IntegerVector integerVector, double quality, IRandom random, IReadOnlyPushConfiguration config, IPushEvaluator evaluator, bool simplify = false)
       : base("Solution", "A push solution.") {
       IntegerVector = integerVector;
       Quality = quality;
-      Data = data;
       Random = random;
       Config = config;
-      DataStart = dataStart;
-      DataEnd = dataEnd;
-      Simplify = simplify;
+      Evaluator = evaluator;
+
+      Program = IntegerVector.ToPushProgram(config);
+
+      if (simplify)
+        Program = Simplifier.Simplifier.Simplify(Program, p => Evaluator.EvaluateTraining(config, p, random).TotalQuality);
     }
 
     public PushSolution(PushSolution origin, Cloner cloner) : base(origin, cloner) {
+      Quality = origin.Quality;
       IntegerVector = cloner.Clone(origin.IntegerVector);
-      Quality = origin.Quality;
-      Data = cloner.Clone(origin.Data);
       Random = cloner.Clone(origin.Random);
       Config = cloner.Clone(origin.Config);
-      DataStart = origin.DataStart;
-      DataEnd = origin.DataEnd;
-      Simplify = origin.Simplify;
+    }
+
+    public virtual PushSolution Simplify() {
+      return new PushSolution(IntegerVector, Quality, Random, Config, Evaluator, true);
     }
 
     [StorableConstructor]
-    private PushSolution(bool deserializing) : base(deserializing) { }
+    protected PushSolution(bool deserializing) : base(deserializing) { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Stack/StackTypes.cs	(revision 14897)
@@ -5,5 +5,5 @@
   [Flags]
   public enum StackTypes : ushort {
-    None = 0x00, // Required to specify expression dependencies
+    None = 0x01, // Required to specify expression dependencies
     Integer = 0x02,
     Float = 0x04,
@@ -14,9 +14,9 @@
     Code = 0x80,
     Exec = 0x100,
-    Return = 0x200,
+    Print = 0x200,
     IntegerVector = 0x400,
     FloatVector = 0x800,
     StringVector = 0x1000,
-    BooleanVector = 0x2000
+    BooleanVector = 0x2000,
   }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/ExpressionSelectionView.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/ExpressionSelectionView.resx	(revision 14875)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/ExpressionSelectionView.resx	(revision 14897)
@@ -67,7 +67,7 @@
           <xsd:element name="metadata">
             <xsd:complexType>
-              <xsd:sequence>
+              <xsd:items>
                 <xsd:element name="value" types="xsd:string" minOccurs="0" />
-              </xsd:sequence>
+              </xsd:items>
               <xsd:attribute name="name" use="required" types="xsd:string" />
               <xsd:attribute name="types" types="xsd:string" />
@@ -84,8 +84,8 @@
           <xsd:element name="data">
             <xsd:complexType>
-              <xsd:sequence>
+              <xsd:items>
                 <xsd:element name="value" types="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                 <xsd:element name="comment" types="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
+              </xsd:items>
               <xsd:attribute name="name" types="xsd:string" use="required" msdata:Ordinal="1" />
               <xsd:attribute name="types" types="xsd:string" msdata:Ordinal="3" />
@@ -96,7 +96,7 @@
           <xsd:element name="resheader">
             <xsd:complexType>
-              <xsd:sequence>
+              <xsd:items>
                 <xsd:element name="value" types="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
+              </xsd:items>
               <xsd:attribute name="name" types="xsd:string" use="required" />
             </xsd:complexType>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.Designer.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.Designer.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.Designer.cs	(revision 14897)
@@ -0,0 +1,198 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Views {
+  using System.ComponentModel;
+  using System.Drawing;
+  using System.Windows.Forms;
+
+  partial class PushDebuggerView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (this.components != null)) {
+        this.components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PushDebuggerView));
+      this.execGroupBox = new System.Windows.Forms.GroupBox();
+      this.execList = new System.Windows.Forms.ListBox();
+      this.debugTableLayout = new System.Windows.Forms.TableLayoutPanel();
+      this.stepButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.stepWidthBox = new System.Windows.Forms.NumericUpDown();
+      this.runButton = new System.Windows.Forms.Button();
+      this.skipNoopsCheckBox = new System.Windows.Forms.CheckBox();
+      this.simplifyButton = new System.Windows.Forms.Button();
+      this.execGroupBox.SuspendLayout();
+      this.debugTableLayout.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).BeginInit();
+      this.SuspendLayout();
+      //
+      // execGroupBox
+      //
+      this.execGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.execGroupBox.AutoSize = true;
+      this.execGroupBox.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.execGroupBox.Controls.Add(this.execList);
+      this.execGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.execGroupBox.Name = "execGroupBox";
+      this.execGroupBox.Size = new System.Drawing.Size(244, 460);
+      this.execGroupBox.TabIndex = 3;
+      this.execGroupBox.TabStop = false;
+      this.execGroupBox.Text = "Exec";
+      //
+      // execList
+      //
+      this.execList.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.execList.FormattingEnabled = true;
+      this.execList.Location = new System.Drawing.Point(3, 16);
+      this.execList.Name = "execList";
+      this.execList.Size = new System.Drawing.Size(238, 441);
+      this.execList.TabIndex = 0;
+      //
+      // debugTableLayout
+      //
+      this.debugTableLayout.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.debugTableLayout.AutoScroll = true;
+      this.debugTableLayout.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+      this.debugTableLayout.ColumnCount = 2;
+      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 250F));
+      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
+      this.debugTableLayout.Controls.Add(this.execGroupBox, 0, 0);
+      this.debugTableLayout.Location = new System.Drawing.Point(3, 3);
+      this.debugTableLayout.Name = "debugTableLayout";
+      this.debugTableLayout.RowCount = 1;
+      this.debugTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());
+      this.debugTableLayout.Size = new System.Drawing.Size(872, 466);
+      this.debugTableLayout.TabIndex = 18;
+      //
+      // stepButton
+      //
+      this.stepButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stepButton.Image = ((System.Drawing.Image)(resources.GetObject("stepButton.Image")));
+      this.stepButton.Location = new System.Drawing.Point(109, 475);
+      this.stepButton.Name = "stepButton";
+      this.stepButton.Size = new System.Drawing.Size(28, 26);
+      this.stepButton.TabIndex = 22;
+      this.stepButton.UseVisualStyleBackColor = true;
+      //
+      // resetButton
+      //
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
+      this.resetButton.Location = new System.Drawing.Point(3, 475);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(28, 26);
+      this.resetButton.TabIndex = 23;
+      this.resetButton.UseVisualStyleBackColor = true;
+      //
+      // stepWidthBox
+      //
+      this.stepWidthBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stepWidthBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.stepWidthBox.Location = new System.Drawing.Point(70, 476);
+      this.stepWidthBox.Maximum = new decimal(new int[] {
+            99999,
+            0,
+            0,
+            0});
+      this.stepWidthBox.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.stepWidthBox.Name = "stepWidthBox";
+      this.stepWidthBox.Size = new System.Drawing.Size(40, 24);
+      this.stepWidthBox.TabIndex = 21;
+      this.stepWidthBox.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      //
+      // runButton
+      //
+      this.runButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.runButton.Image = ((System.Drawing.Image)(resources.GetObject("runButton.Image")));
+      this.runButton.Location = new System.Drawing.Point(37, 475);
+      this.runButton.Name = "runButton";
+      this.runButton.Size = new System.Drawing.Size(28, 26);
+      this.runButton.TabIndex = 24;
+      this.runButton.UseVisualStyleBackColor = true;
+      //
+      // skipNoopsCheckBox
+      //
+      this.skipNoopsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.skipNoopsCheckBox.AutoSize = true;
+      this.skipNoopsCheckBox.Checked = true;
+      this.skipNoopsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+      this.skipNoopsCheckBox.Location = new System.Drawing.Point(147, 481);
+      this.skipNoopsCheckBox.Name = "skipNoopsCheckBox";
+      this.skipNoopsCheckBox.Size = new System.Drawing.Size(81, 17);
+      this.skipNoopsCheckBox.TabIndex = 25;
+      this.skipNoopsCheckBox.Text = "Skip NOOP";
+      this.skipNoopsCheckBox.UseVisualStyleBackColor = true;
+      //
+      // simplifyButton
+      //
+      this.simplifyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.simplifyButton.Location = new System.Drawing.Point(813, 475);
+      this.simplifyButton.Name = "simplifyButton";
+      this.simplifyButton.Size = new System.Drawing.Size(62, 26);
+      this.simplifyButton.TabIndex = 26;
+      this.simplifyButton.Text = "Simplify";
+      this.simplifyButton.UseVisualStyleBackColor = true;
+      //
+      // PushDebuggerView
+      //
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.simplifyButton);
+      this.Controls.Add(this.skipNoopsCheckBox);
+      this.Controls.Add(this.runButton);
+      this.Controls.Add(this.stepWidthBox);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.stepButton);
+      this.Controls.Add(this.debugTableLayout);
+      this.Name = "PushDebuggerView";
+      this.Size = new System.Drawing.Size(878, 504);
+      this.execGroupBox.ResumeLayout(false);
+      this.debugTableLayout.ResumeLayout(false);
+      this.debugTableLayout.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private GroupBox execGroupBox;
+    private ListBox execList;
+    private TableLayoutPanel debugTableLayout;
+    private Button stepButton;
+    private Button resetButton;
+    private NumericUpDown stepWidthBox;
+    private Button runButton;
+    private CheckBox skipNoopsCheckBox;
+    private Button simplifyButton;
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.cs	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.cs	(revision 14897)
@@ -0,0 +1,281 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Problems.ProgramSynthesis.Push.Views {
+  using Configuration;
+  using Core.Views;
+  using Expressions;
+  using Interpreter;
+  using MainForm;
+  using Problem;
+  using Stack;
+
+  public partial class PushDebuggerView : ItemView {
+    private readonly IDictionary<StackTypes, ListBox> debugControlDict = new Dictionary<StackTypes, ListBox>();
+
+    private PooledPushInterpreter interpreter;
+    private PooledPushInterpreter interpreter2; // used to determine noops
+    private PushInterpreterPool pool;
+
+    private const string GroupBoxTextStringFormat = "{0}[{1}]";
+
+    public event EventHandler<IPushInterpreter> OnReset;
+
+    public PushDebuggerView() {
+      InitializeComponent();
+      InitEvents();
+    }
+
+    ~PushDebuggerView() {
+      interpreter.Dispose();
+      interpreter2.Dispose();
+    }
+
+    public new PushSolution Content
+    {
+      get { return (PushSolution)base.Content; }
+      set
+      {
+        base.Content = value;
+      }
+    }
+
+    protected override void OnContentChanged() {
+      if (Content == null) return;
+
+      Name = "Push Debugger";
+      pool = new PushInterpreterPool(Content.Config);
+
+      if (interpreter != null) {
+        interpreter.Dispose();
+        interpreter2.Dispose();
+      }
+
+      interpreter = pool.Create(Content.Random);
+      interpreter2 = pool.Create(Content.Random);
+
+
+      InitDebugLists(Content.Config);
+      ClearDebugLists();
+      UpdateExecList();
+      UpdateDebugLists();
+      ResetDebugging();
+    }
+
+    private void InitEvents() {
+      runButton.Click += RunButtonClick;
+      resetButton.Click += ResetButtonClick;
+      stepButton.Click += StepButtonClick;
+      simplifyButton.Click += SimplifyButtonClick;
+    }
+
+    private void RunButtonClick(object sender, EventArgs e) {
+      if (interpreter == null)
+        return;
+
+      interpreter.Resume();
+
+      ResetDebugging();
+      UpdateExecList();
+      UpdateDebugLists();
+      CheckIfButtonsCanBeEnabled();
+    }
+
+    private void StepButtonClick(object sender, EventArgs e) {
+      if (interpreter == null || stepWidthBox.Value <= 0)
+        return;
+
+      var count = Math.Min(stepWidthBox.Value, interpreter.ExecStack.Count);
+
+      if (!interpreter.CanStep)
+        return;
+
+      // skip leading noops
+      if (interpreter2.ExecCounter == (Content.Program.IsProgram ? 1 : 0) &&
+          skipNoopsCheckBox.Checked &&
+          SkipNoops()) {
+        count = 0; // no entries left, cause all were noops
+      }
+
+      for (var i = 0; i < count; i++) {
+        if (skipNoopsCheckBox.Checked) {
+          interpreter.Step();
+
+          if (SkipNoops())
+            break;
+        } else {
+          interpreter.Step();
+          interpreter2.Step();
+        }
+      }
+
+      stepWidthBox.Maximum = Math.Max(1, interpreter.ExecStack.Count);
+
+      UpdateExecList();
+      UpdateDebugLists();
+      CheckIfButtonsCanBeEnabled();
+    }
+
+    private bool SkipNoops() {
+      var skipCount = 0;
+      bool isNoop;
+
+      do {
+        skipCount++;
+        isNoop = !interpreter2.Step();
+      } while (interpreter2.CanStep && isNoop);
+
+      if (isNoop) {
+        interpreter.Step(skipCount);
+      } else if (skipCount > 1) {
+        interpreter.Step(skipCount - 1);
+      }
+
+      return isNoop;
+    }
+
+    private void CheckIfButtonsCanBeEnabled() {
+      runButton.Enabled = interpreter != null && interpreter.CanStep;
+      stepButton.Enabled = interpreter != null && interpreter.CanStep;
+      stepWidthBox.Enabled = interpreter != null && interpreter.CanStep;
+    }
+
+    private void ResetButtonClick(object sender, EventArgs e) {
+      ResetDebugging();
+    }
+
+    private void SimplifyButtonClick(object sender, EventArgs e) {
+      var newContent = Content.Simplify();
+
+      MainFormManager.MainForm.ShowContent(newContent, GetType());
+    }
+
+    public void ResetDebugging() {
+      if (Content == null ||
+          pool == null ||
+          Content.Program == null)
+        return;
+
+      if (interpreter != null) {
+        interpreter.Reset();
+        interpreter2.Reset();
+      }
+
+      if (OnReset != null) {
+        OnReset(this, interpreter);
+        OnReset(this, interpreter2);
+      }
+
+      interpreter.Run(Content.Program, true);
+      interpreter2.Run(Content.Program, true);
+
+      stepWidthBox.Maximum = interpreter.ExecStack.Count;
+
+      UpdateDebugLists();
+      UpdateExecList();
+      CheckIfButtonsCanBeEnabled();
+    }
+
+    private void ClearDebugLists() {
+      foreach (var list in debugControlDict.Values) {
+        list.Items.Clear();
+      }
+    }
+
+    private void UpdateExecList() {
+      execList.Items.Clear();
+      var expressions = interpreter.ExecStack.AsEnumerable()
+        .Reverse()
+        .Select(e => e.StringRepresentation)
+        .ToArray();
+
+      execList.Items.AddRange(expressions);
+      execGroupBox.Text = string.Format(GroupBoxTextStringFormat, Enum.GetName(typeof(StackTypes), StackTypes.Exec), interpreter.ExecStack.Count);
+    }
+
+    private void InitDebugLists(IReadOnlyPushConfiguration config) {
+      debugControlDict.Clear();
+
+      // 2 = ExecList + EmptyColumn which is required to fill empty space
+      while (debugTableLayout.ColumnCount > 2) {
+        debugTableLayout.Controls.RemoveAt(1);
+        debugTableLayout.ColumnCount--;
+      }
+
+      foreach (StackTypes stackType in Enum.GetValues(typeof(StackTypes))) {
+        if (stackType != StackTypes.Exec &&
+            ExpressionTable.GetExpressionsByStackTypes(stackType).Intersect(config.EnabledExpressions).Any()) {
+          var list = CreateDebugList(stackType);
+          debugControlDict.Add(stackType, list);
+        }
+      }
+    }
+
+    private ListBox CreateDebugList(StackTypes type) {
+      var groupBox = new GroupBox {
+        Anchor = AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top,
+        AutoSize = true,
+        AutoSizeMode = AutoSizeMode.GrowAndShrink,
+        Text = Enum.GetName(typeof(StackTypes), type)
+      };
+
+      var list = new ListBox {
+        Dock = DockStyle.Fill,
+        DrawMode = DrawMode.OwnerDrawFixed
+      };
+
+      var stackEntryType = type.GetStackEntryType();
+      if (stackEntryType == typeof(double) ||
+          stackEntryType == typeof(long)) {
+        list.DrawItem += (sender, e) => {
+          if (e.Index <= -1) return;
+          var item = list.Items[e.Index];
+
+          e.DrawBackground();
+          e.DrawFocusRectangle();
+
+          var brush = new SolidBrush(e.ForeColor);
+          var size = e.Graphics.MeasureString(item.ToString(), e.Font);
+
+          e.Graphics.DrawString(
+            item.ToString(),
+            e.Font,
+            brush,
+            e.Bounds.Right - size.Width,
+            e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
+        };
+      }
+
+      groupBox.Controls.Add(list);
+
+      var columnWidth = stackEntryType == typeof(Expression) ? 250 : 150;
+
+      debugTableLayout.ColumnCount++;
+      debugTableLayout.ColumnStyles.Insert(1, new ColumnStyle(SizeType.Absolute, columnWidth));
+      debugTableLayout.Controls.Add(groupBox);
+      debugTableLayout.Controls.SetChildIndex(groupBox, 1);
+
+      return list;
+    }
+
+
+    private void UpdateDebugLists() {
+      ClearDebugLists();
+
+      if (Content == null || interpreter == null)
+        return;
+
+      foreach (var pair in debugControlDict) {
+        var stack = interpreter.GetStackEntriesByType<object>(pair.Key);
+        var name = Enum.GetName(typeof(StackTypes), pair.Key);
+
+        pair.Value.Items.AddRange(stack.Reverse().ToArray());
+        ((GroupBox)pair.Value.Parent).Text = string.Format(GroupBoxTextStringFormat, name, pair.Value.Items.Count);
+      }
+    }
+
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.resx	(revision 14897)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushDebuggerView.resx	(revision 14897)
@@ -0,0 +1,203 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="stepButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
+        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAABFklE
+        QVQ4T2P4//8/Bk7oecKMTRwbxioINEAGiJmwyaFjrIKFs57/j5/8VokYQ7AK5s589j+h+97/uAmvNQh5
+        B6tgxpSn/+ft//0/qOHma6ABtvgMwSoI1PB/9r5f/zu3/v3vVnr5P5Bvj8sQDAEQjux69H/Ktl//S5b+
+        /Z8w/e9/m9yzOA1B4cBwYPPD/61r34M1G5d8+S8dfe2/ceSy/w5FZ+PRDUHRCMMeVff/l8x9B9es6NLz
+        X9pndSA2tRgCIGxfevd/YMszJM0rvbCpA2GsghZ5d/7bFFyBabbBpgaGsQoaZt0Ga5byWu6KTR4ZYxXU
+        SbsBtHmNLzY5dIxVUMp7rZ+09wqciQcZYxUkBWMVJB7/ZwAA4djU9I5dK1UAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <data name="runButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
+        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAsElE
+        QVQ4T2P4//8/RRirYNn+bDds4tgwVsGEGRH/iTUEqyDIAMsyfaIMwSoYNSXo/4Zbi4kyBKtg8ARvkEai
+        DMEq6NPlDDYAhKMWBeA1BEMAhB2bLf5nbIgFa7Zt1v+vU6zwXyKNG0SroatF4cCweY0eimb+BBasmkEY
+        QwCE9UqVidIMwlgFVfKliNIMwlgFpTMEidIMwlgFRZI5idIMwlgFidUMwlgFScFYBYnH/xkAJP3E6UxO
+        vJ8AAAAASUVORK5CYII=
+</value>
+  </data>
+</root>
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.Designer.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.Designer.cs	(revision 14875)
+++ 	(revision )
@@ -1,305 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Views {
-  partial class PushProgramDebuggerView {
-    /// <summary>
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary>
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary>
-    /// Required method for Designer support - do not modify
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PushProgramDebuggerView));
-      this.tabControl = new System.Windows.Forms.TabControl();
-      this.tabPage1 = new System.Windows.Forms.TabPage();
-      this.simplifyButton = new System.Windows.Forms.Button();
-      this.skipNoopsCheckBox = new System.Windows.Forms.CheckBox();
-      this.runButton = new System.Windows.Forms.Button();
-      this.stepWidthBox = new System.Windows.Forms.NumericUpDown();
-      this.resetButton = new System.Windows.Forms.Button();
-      this.stepButton = new System.Windows.Forms.Button();
-      this.exampleComboBox = new System.Windows.Forms.ComboBox();
-      this.label1 = new System.Windows.Forms.Label();
-      this.debugTableLayout = new System.Windows.Forms.TableLayoutPanel();
-      this.execGroupBox = new System.Windows.Forms.GroupBox();
-      this.execList = new System.Windows.Forms.ListBox();
-      this.tabPage2 = new System.Windows.Forms.TabPage();
-      this.resultsDataGrid = new System.Windows.Forms.DataGridView();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.tabControl.SuspendLayout();
-      this.tabPage1.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).BeginInit();
-      this.debugTableLayout.SuspendLayout();
-      this.execGroupBox.SuspendLayout();
-      this.tabPage2.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.resultsDataGrid)).BeginInit();
-      this.SuspendLayout();
-      //
-      // nameTextBox
-      //
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Size = new System.Drawing.Size(889, 20);
-      //
-      // infoLabel
-      //
-      this.infoLabel.Location = new System.Drawing.Point(972, 3);
-      //
-      // tabControl
-      //
-      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.tabControl.Controls.Add(this.tabPage1);
-      this.tabControl.Controls.Add(this.tabPage2);
-      this.tabControl.Location = new System.Drawing.Point(6, 26);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(982, 668);
-      this.tabControl.TabIndex = 12;
-      //
-      // tabPage1
-      //
-      this.tabPage1.AutoScroll = true;
-      this.tabPage1.Controls.Add(this.simplifyButton);
-      this.tabPage1.Controls.Add(this.skipNoopsCheckBox);
-      this.tabPage1.Controls.Add(this.runButton);
-      this.tabPage1.Controls.Add(this.stepWidthBox);
-      this.tabPage1.Controls.Add(this.resetButton);
-      this.tabPage1.Controls.Add(this.stepButton);
-      this.tabPage1.Controls.Add(this.exampleComboBox);
-      this.tabPage1.Controls.Add(this.label1);
-      this.tabPage1.Controls.Add(this.debugTableLayout);
-      this.tabPage1.Location = new System.Drawing.Point(4, 22);
-      this.tabPage1.Name = "tabPage1";
-      this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage1.Size = new System.Drawing.Size(974, 642);
-      this.tabPage1.TabIndex = 0;
-      this.tabPage1.Text = "Debug";
-      this.tabPage1.UseVisualStyleBackColor = true;
-      //
-      // simplifyButton
-      //
-      this.simplifyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-      this.simplifyButton.Location = new System.Drawing.Point(909, 610);
-      this.simplifyButton.Name = "simplifyButton";
-      this.simplifyButton.Size = new System.Drawing.Size(62, 26);
-      this.simplifyButton.TabIndex = 17;
-      this.simplifyButton.Text = "Simplify";
-      this.toolTip.SetToolTip(this.simplifyButton, "Run all instructions");
-      this.simplifyButton.UseVisualStyleBackColor = true;
-      //
-      // skipNoopsCheckBox
-      //
-      this.skipNoopsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.skipNoopsCheckBox.AutoSize = true;
-      this.skipNoopsCheckBox.Checked = true;
-      this.skipNoopsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
-      this.skipNoopsCheckBox.Location = new System.Drawing.Point(150, 616);
-      this.skipNoopsCheckBox.Name = "skipNoopsCheckBox";
-      this.skipNoopsCheckBox.Size = new System.Drawing.Size(81, 17);
-      this.skipNoopsCheckBox.TabIndex = 16;
-      this.skipNoopsCheckBox.Text = "Skip NOOP";
-      this.skipNoopsCheckBox.UseVisualStyleBackColor = true;
-      //
-      // runButton
-      //
-      this.runButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.runButton.Image = ((System.Drawing.Image)(resources.GetObject("runButton.Image")));
-      this.runButton.Location = new System.Drawing.Point(40, 610);
-      this.runButton.Name = "runButton";
-      this.runButton.Size = new System.Drawing.Size(28, 26);
-      this.runButton.TabIndex = 15;
-      this.toolTip.SetToolTip(this.runButton, "Run all instructions");
-      this.runButton.UseVisualStyleBackColor = true;
-      //
-      // stepWidthBox
-      //
-      this.stepWidthBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stepWidthBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-      this.stepWidthBox.Location = new System.Drawing.Point(73, 611);
-      this.stepWidthBox.Maximum = new decimal(new int[] {
-            99999,
-            0,
-            0,
-            0});
-      this.stepWidthBox.Minimum = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-      this.stepWidthBox.Name = "stepWidthBox";
-      this.stepWidthBox.Size = new System.Drawing.Size(40, 24);
-      this.stepWidthBox.TabIndex = 12;
-      this.stepWidthBox.Value = new decimal(new int[] {
-            1,
-            0,
-            0,
-            0});
-      //
-      // resetButton
-      //
-      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
-      this.resetButton.Location = new System.Drawing.Point(6, 610);
-      this.resetButton.Name = "resetButton";
-      this.resetButton.Size = new System.Drawing.Size(28, 26);
-      this.resetButton.TabIndex = 14;
-      this.toolTip.SetToolTip(this.resetButton, "ResetDebugging to start");
-      this.resetButton.UseVisualStyleBackColor = true;
-      //
-      // stepButton
-      //
-      this.stepButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.stepButton.Image = ((System.Drawing.Image)(resources.GetObject("stepButton.Image")));
-      this.stepButton.Location = new System.Drawing.Point(112, 610);
-      this.stepButton.Name = "stepButton";
-      this.stepButton.Size = new System.Drawing.Size(28, 26);
-      this.stepButton.TabIndex = 13;
-      this.toolTip.SetToolTip(this.stepButton, "Step");
-      this.stepButton.UseVisualStyleBackColor = true;
-      //
-      // exampleComboBox
-      //
-      this.exampleComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.exampleComboBox.FormattingEnabled = true;
-      this.exampleComboBox.Location = new System.Drawing.Point(58, 6);
-      this.exampleComboBox.Name = "exampleComboBox";
-      this.exampleComboBox.Size = new System.Drawing.Size(910, 21);
-      this.exampleComboBox.TabIndex = 11;
-      //
-      // label1
-      //
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 9);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(50, 13);
-      this.label1.TabIndex = 10;
-      this.label1.Text = "Example:";
-      //
-      // debugTableLayout
-      //
-      this.debugTableLayout.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.debugTableLayout.AutoScroll = true;
-      this.debugTableLayout.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
-      this.debugTableLayout.ColumnCount = 2;
-      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 250F));
-      this.debugTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
-      this.debugTableLayout.Controls.Add(this.execGroupBox, 0, 0);
-      this.debugTableLayout.Location = new System.Drawing.Point(6, 33);
-      this.debugTableLayout.Name = "debugTableLayout";
-      this.debugTableLayout.RowCount = 1;
-      this.debugTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle());
-      this.debugTableLayout.Size = new System.Drawing.Size(962, 563);
-      this.debugTableLayout.TabIndex = 2;
-      //
-      // execGroupBox
-      //
-      this.execGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-            | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.execGroupBox.AutoSize = true;
-      this.execGroupBox.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
-      this.execGroupBox.Controls.Add(this.execList);
-      this.execGroupBox.Location = new System.Drawing.Point(3, 3);
-      this.execGroupBox.Name = "execGroupBox";
-      this.execGroupBox.Size = new System.Drawing.Size(244, 557);
-      this.execGroupBox.TabIndex = 3;
-      this.execGroupBox.TabStop = false;
-      this.execGroupBox.Text = "Exec";
-      //
-      // execList
-      //
-      this.execList.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.execList.FormattingEnabled = true;
-      this.execList.Location = new System.Drawing.Point(3, 16);
-      this.execList.Name = "execList";
-      this.execList.Size = new System.Drawing.Size(238, 538);
-      this.execList.TabIndex = 0;
-      //
-      // tabPage2
-      //
-      this.tabPage2.Controls.Add(this.resultsDataGrid);
-      this.tabPage2.Location = new System.Drawing.Point(4, 22);
-      this.tabPage2.Name = "tabPage2";
-      this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
-      this.tabPage2.Size = new System.Drawing.Size(974, 608);
-      this.tabPage2.TabIndex = 1;
-      this.tabPage2.Text = "Results";
-      this.tabPage2.UseVisualStyleBackColor = true;
-      //
-      // resultsDataGrid
-      //
-      this.resultsDataGrid.AllowUserToAddRows = false;
-      this.resultsDataGrid.AllowUserToDeleteRows = false;
-      this.resultsDataGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-      this.resultsDataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.resultsDataGrid.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
-      this.resultsDataGrid.Location = new System.Drawing.Point(3, 3);
-      this.resultsDataGrid.Name = "resultsDataGrid";
-      this.resultsDataGrid.ReadOnly = true;
-      this.resultsDataGrid.Size = new System.Drawing.Size(968, 602);
-      this.resultsDataGrid.TabIndex = 0;
-      //
-      // PushProgramDebuggerView
-      //
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.tabControl);
-      this.Name = "PushProgramDebuggerView";
-      this.Size = new System.Drawing.Size(991, 697);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.tabControl.ResumeLayout(false);
-      this.tabPage1.ResumeLayout(false);
-      this.tabPage1.PerformLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.stepWidthBox)).EndInit();
-      this.debugTableLayout.ResumeLayout(false);
-      this.debugTableLayout.PerformLayout();
-      this.execGroupBox.ResumeLayout(false);
-      this.tabPage2.ResumeLayout(false);
-      ((System.ComponentModel.ISupportInitialize)(this.resultsDataGrid)).EndInit();
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.TabControl tabControl;
-    private System.Windows.Forms.TabPage tabPage1;
-    private System.Windows.Forms.CheckBox skipNoopsCheckBox;
-    private System.Windows.Forms.Button runButton;
-    private System.Windows.Forms.NumericUpDown stepWidthBox;
-    private System.Windows.Forms.Button resetButton;
-    private System.Windows.Forms.Button stepButton;
-    private System.Windows.Forms.ComboBox exampleComboBox;
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.TabPage tabPage2;
-    private System.Windows.Forms.DataGridView resultsDataGrid;
-    private System.Windows.Forms.Button simplifyButton;
-    private System.Windows.Forms.GroupBox execGroupBox;
-    private System.Windows.Forms.TableLayoutPanel debugTableLayout;
-    private System.Windows.Forms.ListBox execList;
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.cs	(revision 14875)
+++ 	(revision )
@@ -1,452 +1,0 @@
-﻿using System.Windows.Forms;
-
-using HeuristicLab.Core.Views;
-using HeuristicLab.MainForm;
-
-namespace HeuristicLab.Problems.ProgramSynthesis.Push.Views {
-  using System;
-  using System.Collections.Generic;
-  using System.Drawing;
-  using System.Globalization;
-  using System.Linq;
-
-  using HeuristicLab.BenchmarkSuite;
-  using HeuristicLab.BenchmarkSuite.Problems;
-  using HeuristicLab.BenchmarkSuite.Views;
-  using HeuristicLab.Core;
-  using HeuristicLab.Encodings.IntegerVectorEncoding;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Problem;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
-
-  [View("Push Program Debugger")]
-  [Content(typeof(PushSolution), true)]
-  public partial class PushProgramDebuggerView : NamedItemView {
-    private readonly IDictionary<StackTypes, ListBox> debugControlDict = new Dictionary<StackTypes, ListBox>();
-
-    private const string Separator = ", ";
-    private const string EmptySign = "-";
-
-    private const string exampleSplitter = " => ";
-    private const string AbsoluteDiffHeaderText = "Absolute Diff.";
-    private const string RelativeDiffHeaderText = "Relative Diff.";
-    private const string InputHeaderStringFormat = "Input {0} : {1}";
-    private const string EstimatedOuputHeaderStringFormat = "Estimated Output {0} : {1}";
-    private const string OutputHeaderStringFormat = "Output {0} : {1}";
-    private const string GroupBoxTextStringFormat = "{0}[{1}]";
-
-    private PushProgram program;
-    private PooledPushInterpreter interpreter;
-    private PooledPushInterpreter interpreter2; // used to determine noops
-    private PushInterpreterPool pool;
-
-    public PushProgramDebuggerView() {
-      InitializeComponent();
-
-      Name = "Push Program Debugger";
-
-      InitEvents();
-    }
-
-    ~PushProgramDebuggerView() {
-      interpreter.Dispose();
-      interpreter2.Dispose();
-    }
-
-    private void InitEvents() {
-      exampleComboBox.SelectedIndexChanged += SelectedExampleIndexChanged;
-      runButton.Click += RunButtonClick;
-      resetButton.Click += ResetButtonClick;
-      stepButton.Click += StepButtonClick;
-      simplifyButton.Click += SimplifyButtonClick;
-    }
-
-    private void SimplifyButtonClick(object sender, EventArgs e) {
-      var newContent = new PushSolution(
-                         (IntegerVector)Content.IntegerVector.Clone(),
-                         Content.Quality,
-                         (ProblemData)Content.Data.Clone(),
-                         (IRandom)Content.Random.Clone(),
-                         Content.Config,
-                         Content.DataStart,
-                         Content.DataEnd,
-                         true);
-
-      MainFormManager.MainForm.ShowContent(newContent, GetType());
-    }
-
-    private void RunButtonClick(object sender, EventArgs e) {
-      if (interpreter == null)
-        return;
-
-      interpreter.Resume();
-
-      UpdateExecList();
-      this.UpdateDebugLists();
-      CheckIfButtonsCanBeEnabled();
-    }
-
-    private void StepButtonClick(object sender, EventArgs e) {
-      if (interpreter == null || stepWidthBox.Value <= 0)
-        return;
-
-      var count = Math.Min(stepWidthBox.Value, interpreter.ExecStack.Count);
-
-      if (!interpreter.CanStep)
-        return;
-
-      // skip leading noops
-      if (interpreter2.ExecCounter == (program.IsProgram ? 1 : 0) &&
-          skipNoopsCheckBox.Checked &&
-          SkipNoops()) {
-        count = 0; // no entries left, cause all were noops
-      }
-
-      for (var i = 0; i < count; i++) {
-        if (skipNoopsCheckBox.Checked) {
-          interpreter.Step();
-
-          if (SkipNoops())
-            break;
-        } else {
-          interpreter.Step();
-          interpreter2.Step();
-        }
-      }
-
-      stepWidthBox.Maximum = Math.Max(1, interpreter.ExecStack.Count);
-
-      UpdateExecList();
-      this.UpdateDebugLists();
-      CheckIfButtonsCanBeEnabled();
-    }
-
-    private bool SkipNoops() {
-      var skipCount = 0;
-      bool isNoop;
-
-      do {
-        skipCount++;
-        isNoop = !interpreter2.Step();
-      } while (interpreter2.CanStep && isNoop);
-
-      if (isNoop) {
-        interpreter.Step(skipCount);
-      } else if (skipCount > 1) {
-        interpreter.Step(skipCount - 1);
-      }
-
-      return isNoop;
-    }
-
-    private void CheckIfButtonsCanBeEnabled() {
-      runButton.Enabled = interpreter != null && interpreter.CanStep;
-      stepButton.Enabled = interpreter != null && interpreter.CanStep;
-      stepWidthBox.Enabled = interpreter != null && interpreter.CanStep;
-    }
-
-    private void ResetButtonClick(object sender, EventArgs e) {
-      this.ResetDebugging();
-    }
-
-    private void SelectedExampleIndexChanged(object sender, EventArgs e) {
-      this.ResetDebugging();
-    }
-
-    public new PushSolution Content
-    {
-      get { return (PushSolution)base.Content; }
-      set
-      {
-        base.Content = value;
-      }
-    }
-
-    private void ResetDebugging() {
-      if (Content == null ||
-          pool == null ||
-          program == null ||
-          exampleComboBox.SelectedIndex < 0)
-        return;
-
-      var example = Content.Data.Examples[exampleComboBox.SelectedIndex];
-
-      if (interpreter != null) {
-        interpreter.Reset();
-        interpreter2.Reset();
-      }
-
-      interpreter.BooleanStack.Push(example.InputBoolean);
-      interpreter.IntegerStack.Push(example.InputInteger);
-      interpreter.FloatStack.Push(example.InputFloat);
-
-      interpreter2.BooleanStack.Push(example.InputBoolean);
-      interpreter2.IntegerStack.Push(example.InputInteger);
-      interpreter2.FloatStack.Push(example.InputFloat);
-
-      interpreter.Run(program, true);
-      interpreter2.Run(program, true);
-
-      stepWidthBox.Maximum = interpreter.ExecStack.Count;
-
-      this.UpdateDebugLists();
-      UpdateExecList();
-      CheckIfButtonsCanBeEnabled();
-    }
-
-    protected override void OnContentChanged() {
-      if (Content == null) return;
-
-      Name = "Push Solution";
-      nameTextBox.Text = Name;
-
-      pool = new PushInterpreterPool(Content.Config);
-      program = Content.IntegerVector.ToPushProgram(Content.Config);
-
-      if (interpreter != null) {
-        interpreter.Dispose();
-        interpreter2.Dispose();
-      }
-
-      interpreter = pool.Create(Content.Random);
-      interpreter2 = pool.Create(Content.Random);
-
-      if (Content.Simplify)
-        program = Simplifier.Simplifier.Simplify(program, p => PushEvaluator.Evaluate(p, pool, Content.Random, Content.Data, Content.DataStart, Content.DataEnd).TotalQuality);
-
-      UpdateExamples(Content.Data);
-
-      if (exampleComboBox.SelectedIndex < 0) {
-        exampleComboBox.SelectedIndex = 0; // Triggers ResetDebugging via event
-      } else {
-        ResetDebugging();
-      }
-
-      InitDebugLists(Content.Config);
-      InitResultGrid();
-      this.ClearDebugLists();
-      UpdateExecList();
-      this.UpdateDebugLists();
-    }
-
-    private void InitResultGrid() {
-      resultsDataGrid.Columns.Clear();
-      resultsDataGrid.Rows.Clear();
-
-      var cellTemplate = new DataGridViewTextBoxCell();
-
-      for (var i = 0; i < Content.Data.InputArgumentTypes.Length; i++) {
-        var headerTypeName = ViewHelper.GetHeaderTypeName(Content.Data.InputArgumentTypes[i]);
-        var column = new DataGridViewColumn {
-          HeaderText = string.Format(InputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate
-        };
-
-        column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-        resultsDataGrid.Columns.Add(column);
-      }
-
-      for (var i = 0; i < Content.Data.OutputArgumentTypes.Length; i++) {
-        var headerTypeName = ViewHelper.GetHeaderTypeName(Content.Data.OutputArgumentTypes[i]);
-
-        var estimatedOutputColumn = new DataGridViewColumn {
-          HeaderText = string.Format(EstimatedOuputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate,
-        };
-
-        var outputColumn = new DataGridViewColumn {
-          HeaderText = string.Format(OutputHeaderStringFormat, i + 1, headerTypeName),
-          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
-          CellTemplate = cellTemplate
-        };
-
-        estimatedOutputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-        outputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-
-        resultsDataGrid.Columns.Add(estimatedOutputColumn);
-        resultsDataGrid.Columns.Add(outputColumn);
-      }
-
-      var absoluteDiffColumn = new DataGridViewColumn {
-        HeaderText = AbsoluteDiffHeaderText,
-        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
-        CellTemplate = cellTemplate
-      };
-
-      var relativeDiffColumn = new DataGridViewColumn {
-        HeaderText = RelativeDiffHeaderText,
-        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
-        CellTemplate = cellTemplate,
-      };
-
-      absoluteDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-      relativeDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
-
-      resultsDataGrid.Columns.Add(absoluteDiffColumn);
-      resultsDataGrid.Columns.Add(relativeDiffColumn);
-
-      using (var pushInterpreter = pool.Create(Content.Random)) {
-        foreach (var example in Content.Data.Examples) {
-          var row = new DataGridViewRow();
-          var absoluteDiff = PushEvaluator.Evaluate(pushInterpreter, program, example, Content.Data.WorstResult);
-          var relativeDiff = absoluteDiff / Math.Abs(Content.Data.BestResult - Content.Data.WorstResult) * 100d;
-
-          row.HeaderCell.Value = row.Index + 1;
-          row.CreateCells(resultsDataGrid);
-
-          for (var i = 0; i < Content.Data.InputArgumentTypes.Length; i++) {
-            row.Cells[i].Value = ViewHelper.StringifyInput(Content.Data.InputArgumentTypes[i], example, Separator);
-          }
-
-          for (var i = 0; i < Content.Data.OutputArgumentTypes.Length; i++) {
-            row.Cells[Content.Data.InputArgumentTypes.Length + i * 2].Value = ViewHelper.StringifyOutput(Content.Data.OutputArgumentTypes[i], example, Separator);
-            row.Cells[Content.Data.InputArgumentTypes.Length + i * 2 + 1].Value = StringifyResult(Content.Data.OutputArgumentTypes[i], pushInterpreter, example, Separator);
-          }
-
-          row.Cells[Content.Data.TotalArgumentCount + 1].Value = absoluteDiff;
-          row.Cells[Content.Data.TotalArgumentCount + 2].Value = relativeDiff + "%";
-
-          this.resultsDataGrid.Rows.Add(row);
-          pushInterpreter.Reset();
-        }
-      }
-    }
-
-    private string StringifyResult(ExampleArgumentType type, IPushInterpreter interpreter, Example example, string valueSeparator) {
-      switch (type) {
-        case ExampleArgumentType.Integer:
-        case ExampleArgumentType.IntegerVector: return interpreter.IntegerStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.IntegerStack.Peek(GetCount(interpreter.IntegerStack, example.OutputInteger)));
-
-        case ExampleArgumentType.Float:
-        case ExampleArgumentType.FloatVector: return interpreter.FloatStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.FloatStack.Peek(GetCount(interpreter.FloatStack, example.OutputFloat)).Select(d => d.ToString(CultureInfo.CurrentUICulture)));
-
-        case ExampleArgumentType.Boolean: return interpreter.BooleanStack.IsEmpty ? EmptySign : interpreter.BooleanStack.Top.ToString();
-        case ExampleArgumentType.Char: return interpreter.CharStack.IsEmpty ? EmptySign : interpreter.CharStack.Top.ToString();
-
-        case ExampleArgumentType.String:
-        case ExampleArgumentType.StringVector: return interpreter.StringStack.IsEmpty ? EmptySign : string.Join(valueSeparator, interpreter.StringStack.Peek(GetCount(interpreter.StringStack, example.OutputString)));
-        default: return string.Empty;
-      }
-    }
-
-    private int GetCount<T>(IPushStack<T> stack, T[] data) {
-      return Math.Max(0, Math.Min(data.Length, stack.Count));
-    }
-
-    private void ClearDebugLists() {
-      foreach (var list in debugControlDict.Values) {
-        list.Items.Clear();
-      }
-    }
-
-    private void UpdateExecList() {
-      execList.Items.Clear();
-      var expressions = interpreter.ExecStack.AsEnumerable()
-        .Reverse()
-        .Select(e => e.StringRepresentation)
-        .ToArray();
-
-      execList.Items.AddRange(expressions);
-      execGroupBox.Text = string.Format(GroupBoxTextStringFormat, Enum.GetName(typeof(StackTypes), StackTypes.Exec), interpreter.ExecStack.Count);
-    }
-
-    private void InitDebugLists(IReadOnlyPushConfiguration config) {
-      debugControlDict.Clear();
-
-      // 2 = ExecList + EmptyColumn which is required to fill empty space
-      while (debugTableLayout.ColumnCount > 2) {
-        debugTableLayout.Controls.RemoveAt(1);
-        debugTableLayout.ColumnCount--;
-      }
-
-      foreach (StackTypes stackType in Enum.GetValues(typeof(StackTypes))) {
-        if (stackType != StackTypes.Exec &&
-            ExpressionTable.GetExpressionsByStackTypes(stackType).Intersect(config.EnabledExpressions).Any()) {
-          var list = this.CreateDebugList(stackType);
-          debugControlDict.Add(stackType, list);
-        }
-      }
-    }
-
-    private ListBox CreateDebugList(StackTypes type) {
-      var groupBox = new GroupBox {
-        Anchor = AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top,
-        AutoSize = true,
-        AutoSizeMode = AutoSizeMode.GrowAndShrink,
-        Text = Enum.GetName(typeof(StackTypes), type)
-      };
-
-      var list = new ListBox {
-        Dock = DockStyle.Fill,
-        DrawMode = DrawMode.OwnerDrawFixed
-      };
-
-      var stackEntryType = type.GetStackEntryType();
-      if (stackEntryType == typeof(double) ||
-          stackEntryType == typeof(long)) {
-        list.DrawItem += (sender, e) => {
-          if (e.Index <= -1) return;
-          var item = list.Items[e.Index];
-
-          e.DrawBackground();
-          e.DrawFocusRectangle();
-
-          var brush = new SolidBrush(e.ForeColor);
-          var size = e.Graphics.MeasureString(item.ToString(), e.Font);
-
-          e.Graphics.DrawString(
-            item.ToString(),
-            e.Font,
-            brush,
-            e.Bounds.Right - size.Width,
-            e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
-        };
-      }
-
-      groupBox.Controls.Add(list);
-
-      var columnWidth = stackEntryType == typeof(Expression) ? 250 : 150;
-
-      debugTableLayout.ColumnCount++;
-      debugTableLayout.ColumnStyles.Insert(1, new ColumnStyle(SizeType.Absolute, columnWidth));
-      debugTableLayout.Controls.Add(groupBox);
-      debugTableLayout.Controls.SetChildIndex(groupBox, 1);
-
-      return list;
-    }
-
-
-    private void UpdateDebugLists() {
-      this.ClearDebugLists();
-
-      if (Content == null || interpreter == null)
-        return;
-
-      foreach (var pair in debugControlDict) {
-        var stack = interpreter.GetStackEntriesByType<object>(pair.Key);
-        var name = Enum.GetName(typeof(StackTypes), pair.Key);
-
-        pair.Value.Items.AddRange(stack.Reverse().ToArray());
-        ((GroupBox)pair.Value.Parent).Text = string.Format(GroupBoxTextStringFormat, name, pair.Value.Items.Count);
-      }
-    }
-
-    private void UpdateExamples(ProblemData data) {
-      exampleComboBox.Items.Clear();
-      if (data == null) return;
-
-      var stringRepresentations = data.Examples.Select(e =>
-        string.Join(Separator, e.InputArgs) +
-        exampleSplitter +
-        string.Join(Separator, e.OutputArgs));
-
-      foreach (var str in stringRepresentations) {
-        exampleComboBox.Items.Add(str);
-      }
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.resx
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Views/PushProgramDebuggerView.resx	(revision 14875)
+++ 	(revision )
@@ -1,209 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>140, 17</value>
-  </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="runButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
-        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAsElE
-        QVQ4T2P4//8/RRirYNn+bDds4tgwVsGEGRH/iTUEqyDIAMsyfaIMwSoYNSXo/4Zbi4kyBKtg8ARvkEai
-        DMEq6NPlDDYAhKMWBeA1BEMAhB2bLf5nbIgFa7Zt1v+vU6zwXyKNG0SroatF4cCweY0eimb+BBasmkEY
-        QwCE9UqVidIMwlgFVfKliNIMwlgFpTMEidIMwlgFRZI5idIMwlgFidUMwlgFScFYBYnH/xkAJP3E6UxO
-        vJ8AAAAASUVORK5CYII=
-</value>
-  </data>
-  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        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
-</value>
-  </data>
-  <data name="stepButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6
-        JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAABFklE
-        QVQ4T2P4//8/Bk7oecKMTRwbxioINEAGiJmwyaFjrIKFs57/j5/8VokYQ7AK5s589j+h+97/uAmvNQh5
-        B6tgxpSn/+ft//0/qOHma6ABtvgMwSoI1PB/9r5f/zu3/v3vVnr5P5Bvj8sQDAEQjux69H/Ktl//S5b+
-        /Z8w/e9/m9yzOA1B4cBwYPPD/61r34M1G5d8+S8dfe2/ceSy/w5FZ+PRDUHRCMMeVff/l8x9B9es6NLz
-        X9pndSA2tRgCIGxfevd/YMszJM0rvbCpA2GsghZ5d/7bFFyBabbBpgaGsQoaZt0Ga5byWu6KTR4ZYxXU
-        SbsBtHmNLzY5dIxVUMp7rZ+09wqciQcZYxUkBWMVJB7/ZwAA4djU9I5dK1UAAAAASUVORK5CYII=
-</value>
-  </data>
-</root>
