Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15017)
@@ -34,9 +34,13 @@
 
       foreach (StackTypes type in Enum.GetValues(stackTypesType)) {
+        if (!interpreter.Stacks.ContainsKey(type)) continue;
+
         var stackName = Enum.GetName(stackTypesType, type);
         var stack = interpreter.Stacks[type];
 
-        if (stack.IsEmpty || !stack.IsEnabled) return;
-        Console.WriteLine("--------- {0} ---------\n{1}\n", stackName, stack);
+        if (stack.IsEmpty || !stack.IsEnabled) continue;
+
+        var stackString = string.Join(" ", interpreter.StringifyStack(type).Reverse());
+        Console.WriteLine("--------- {0} ---------\n{1}\n", stackName, stackString);
       }
 
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 15017)
@@ -20,8 +20,8 @@
     IPushStack<char> CharStack { get; }
     IPushStack<string> StringStack { get; }
-    IPushStack<List<long>> IntegerVectorStack { get; }
-    IPushStack<List<double>> FloatVectorStack { get; }
-    IPushStack<List<bool>> BooleanVectorStack { get; }
-    IPushStack<List<string>> StringVectorStack { get; }
+    IPushStack<IReadOnlyList<long>> IntegerVectorStack { get; }
+    IPushStack<IReadOnlyList<double>> FloatVectorStack { get; }
+    IPushStack<IReadOnlyList<bool>> BooleanVectorStack { get; }
+    IPushStack<IReadOnlyList<string>> StringVectorStack { get; }
     IPushStack<string> PrintStack { get; }
     IDictionary<string, Expression> CustomExpressions { get; }
@@ -30,4 +30,6 @@
     void Clear();
     void Reset();
+
+    void Run(bool stepwise);
     void Run(string code, bool stepwise = false);
     void Run(Expression expression, bool stepwise = false);
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/InterpreterPoolContainer.cs	(revision 15017)
@@ -8,5 +8,4 @@
   public class InterpreterPoolContainer {
     private readonly ManagedPoolProvider<PushProgram> pushProgramPoolProvider;
-    private readonly ManagedPoolProvider<LoopState> loopStatePoolProvider;
     private readonly ManagedPoolProvider<PooledList<Expression>> expressionListPoolProvider;
 
@@ -19,5 +18,4 @@
     public InterpreterPoolContainer(int partitionSize = 512, int maxPartitionCount = 1024) {
       pushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(partitionSize, () => new PushProgram(), maxPartitionCount);
-      loopStatePoolProvider = new ManagedPoolProvider<LoopState>(partitionSize, () => new LoopState(), maxPartitionCount);
       expressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(partitionSize, () => new PooledList<Expression>(), maxPartitionCount);
 
@@ -27,8 +25,6 @@
     public InterpreterPoolContainer(
       ManagedPoolProvider<PushProgram> pushProgramPoolProvider,
-      ManagedPoolProvider<LoopState> loopStatePoolProvider,
       ManagedPoolProvider<PooledList<Expression>> expressionListPoolProvider) {
       this.pushProgramPoolProvider = pushProgramPoolProvider;
-      this.loopStatePoolProvider = loopStatePoolProvider;
       this.expressionListPoolProvider = expressionListPoolProvider;
 
@@ -43,14 +39,4 @@
         if (pushProgramPool == null) pushProgramPool = pushProgramPoolProvider.CreatePool();
         return pushProgramPool;
-      }
-    }
-
-    private IManagedPool<LoopState> loopStatePool;
-    public IManagedPool<LoopState> LoopStatePool
-    {
-      get
-      {
-        if (loopStatePool == null) loopStatePool = loopStatePoolProvider.CreatePool();
-        return loopStatePool;
       }
     }
@@ -96,9 +82,4 @@
       }
 
-      if (loopStatePool != null) {
-        loopStatePool.Dispose();
-        loopStatePool = null;
-      }
-
       if (expressionListPool != null) {
         expressionListPool.Dispose();
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15017)
@@ -5,18 +5,12 @@
   using System.Threading;
   using System.Threading.Tasks;
+  using Attributes;
   using Configuration;
   using Core;
   using Expressions;
-
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Attributes;
-
   using Parser;
   using Random;
   using Stack;
 
-#if DEBUG
-  using System.Diagnostics;
-  using System.Linq;
-#endif
 
   public class PushInterpreter : IInternalPushInterpreter, IDisposable {
@@ -24,6 +18,5 @@
 
     public PushInterpreter(IReadOnlyPushConfiguration config = null, IRandom random = null, InterpreterPoolContainer poolContainer = null) {
-      Random = random ?? new FastRandom();
-
+      Random = random ?? new MersenneTwister();
       Configuration = config ?? new PushConfiguration();
 
@@ -59,17 +52,17 @@
       };
 
-      IntegerVectorStack = new PushStack<List<long>> {
+      IntegerVectorStack = new PushStack<IReadOnlyList<long>> {
         IsEnabled = Configuration.EnabledStacks[StackTypes.IntegerVector]
       };
 
-      FloatVectorStack = new PushStack<List<double>> {
+      FloatVectorStack = new PushStack<IReadOnlyList<double>> {
         IsEnabled = Configuration.EnabledStacks[StackTypes.FloatVector]
       };
 
-      BooleanVectorStack = new PushStack<List<bool>> {
+      BooleanVectorStack = new PushStack<IReadOnlyList<bool>> {
         IsEnabled = Configuration.EnabledStacks[StackTypes.BooleanVector]
       };
 
-      StringVectorStack = new PushStack<List<string>> {
+      StringVectorStack = new PushStack<IReadOnlyList<string>> {
         IsEnabled = Configuration.EnabledStacks[StackTypes.StringVector]
       };
@@ -88,9 +81,9 @@
         { StackTypes.String, StringStack },
         { StackTypes.Name, NameStack },
+        { StackTypes.Print, PrintStack },
         { StackTypes.IntegerVector, IntegerVectorStack },
         { StackTypes.FloatVector, FloatVectorStack },
         { StackTypes.BooleanVector, BooleanVectorStack },
         { StackTypes.StringVector, StringVectorStack },
-        { StackTypes.Print, PrintStack },
       };
 
@@ -160,11 +153,11 @@
     public IPushStack<string> StringStack { get; private set; }
     [PushStack(StackTypes.IntegerVector)]
-    public IPushStack<List<long>> IntegerVectorStack { get; private set; }
+    public IPushStack<IReadOnlyList<long>> IntegerVectorStack { get; private set; }
     [PushStack(StackTypes.FloatVector)]
-    public IPushStack<List<double>> FloatVectorStack { get; private set; }
+    public IPushStack<IReadOnlyList<double>> FloatVectorStack { get; private set; }
     [PushStack(StackTypes.BooleanVector)]
-    public IPushStack<List<bool>> BooleanVectorStack { get; private set; }
+    public IPushStack<IReadOnlyList<bool>> BooleanVectorStack { get; private set; }
     [PushStack(StackTypes.StringVector)]
-    public IPushStack<List<string>> StringVectorStack { get; private set; }
+    public IPushStack<IReadOnlyList<string>> StringVectorStack { get; private set; }
     [PushStack(StackTypes.Print)]
     public IPushStack<string> PrintStack { get; private set; }
@@ -186,4 +179,8 @@
       var program = PushParser.Parse(code);
       Run(program, stepwise);
+    }
+
+    public void Run(bool stepwise) {
+      Run(PushProgram.Empty, stepwise);
     }
 
@@ -322,27 +319,4 @@
     }
 
-#if DEBUG
-    private Expression last;
-    private bool DoStep() {
-      double[] bk;
-      if (!FloatStack.IsEmpty) {
-        bk = FloatStack.Peek(Math.Min(FloatStack.Count, 3));
-      }
-
-      var expression = ExecStack.Pop();
-      var succ = expression.TryEval(this);
-
-      if ((ExecStack.Count > 0 && ExecStack.Top == null) ||
-          (CodeStack.Count > 0 && CodeStack.Top == null) ||
-          FloatStack.Any(x => double.IsNaN(x) || double.IsInfinity(x)) ||
-          StringStack.Count > 0 && StringStack.Any(x => x == null)) {
-        Debugger.Break();
-      }
-
-      ExecCounter++;
-      last = expression;
-      return succ;
-    }
-#else
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
     private bool DoStep() {
@@ -350,5 +324,4 @@
       return ExecStack.Pop().TryEval(this);
     }
-#endif
 
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15017)
@@ -11,5 +11,4 @@
 
     public readonly ManagedPoolProvider<PushProgram> PushProgramPoolProvider;
-    public readonly ManagedPoolProvider<LoopState> LoopStatePoolProvider;
     public readonly ManagedPoolProvider<PooledList<Expression>> ExpressionListPoolProvider;
 
@@ -19,17 +18,16 @@
 
     public PushInterpreterPool(int size, int poolPartitionSize, int? maxPartitionCount = null, IReadOnlyPushConfiguration config = null) {
-      PushGpConfiguration = config ?? new PushConfiguration();
+      PushConfiguration = config ?? new PushConfiguration();
 
       PushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(poolPartitionSize, () => new PushProgram(), maxPartitionCount);
-      LoopStatePoolProvider = new ManagedPoolProvider<LoopState>(poolPartitionSize, () => new LoopState(), maxPartitionCount);
-      ExpressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(poolPartitionSize * 2, () => new PooledList<Expression>(), maxPartitionCount);
+      ExpressionListPoolProvider = new ManagedPoolProvider<PooledList<Expression>>(poolPartitionSize, () => new PooledList<Expression>(), maxPartitionCount);
 
       pool = new ObjectPool<PooledPushInterpreter>(() => {
-        var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, LoopStatePoolProvider, ExpressionListPoolProvider);
-        return new PooledPushInterpreter(this, PushGpConfiguration, poolContainer);
+        var poolContainer = new InterpreterPoolContainer(PushProgramPoolProvider, ExpressionListPoolProvider);
+        return new PooledPushInterpreter(this, PushConfiguration, poolContainer);
       }, size);
     }
 
-    public IReadOnlyPushConfiguration PushGpConfiguration { get; private set; }
+    public IReadOnlyPushConfiguration PushConfiguration { get; private set; }
 
     public PooledPushInterpreter Create(IRandom random = null) {
@@ -41,5 +39,11 @@
 
     public void Free(PooledPushInterpreter interpreter) {
+      interpreter.Random = null;
       pool.Free(interpreter);
+    }
+
+    public void Clear() {
+      PushProgramPoolProvider.Clear();
+      ExpressionListPoolProvider.Clear();
     }
   }
