Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs	(revision 14746)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PooledPushInterpreter.cs	(revision 14747)
@@ -4,4 +4,6 @@
   using HeuristicLab.Core;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
 
   public class PooledPushInterpreter : PushInterpreter, IDisposable {
@@ -9,6 +11,6 @@
     private readonly PushInterpreterPool pool;
 
-    public PooledPushInterpreter(PushInterpreterPool pool, PushConfiguration config, IRandom random = null)
-      : base(config, random) {
+    public PooledPushInterpreter(PushInterpreterPool pool, PushConfiguration config, ManagedPoolProvider<PushProgram> pushProgramPoolProvider, IRandom random = null)
+      : base(config, random, pushProgramPoolProvider) {
       this.pool = pool;
     }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 14746)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 14747)
@@ -19,5 +19,5 @@
     private Task currentTask;
 
-    public PushInterpreter(IReadonlyPushConfiguration config = null, IRandom random = null) {
+    public PushInterpreter(IReadonlyPushConfiguration config = null, IRandom random = null, ManagedPoolProvider<PushProgram> pushProgramPoolProvider = null) {
       Random = random ?? new FastRandom();
 
@@ -45,4 +45,11 @@
 
       CustomExpressions = new Dictionary<string, Expression>();
+
+      PushProgramPoolProvider = pushProgramPoolProvider ?? new ManagedPoolProvider<PushProgram>(1024);
+
+      if (pushProgramPoolProvider == null)
+      {
+        PushProgramPoolProvider.InitDummyPartition(() => new PushProgram());
+      }
     }
 
@@ -86,5 +93,6 @@
     }
 
-    public IManagedPool<PushProgram> PushProgramPool { get; set; }
+    private readonly ManagedPoolProvider<PushProgram> PushProgramPoolProvider;
+    public IManagedPool<PushProgram> PushProgramPool { get; private set; }
 
     public IReadonlyPushConfiguration Configuration { get; protected set; }
@@ -127,17 +135,19 @@
 
     public void Run(Expression program, bool stepwise = false) {
-      IsPaused = stepwise;
-
-      /* Push top expression so the loop is able to enter
-       * If the top expression is a single statement then the loop has nothing to do
-       * Otherwise the expand expression will be evaluated and pushes code onto the EXEC stack */
-      ExecStack.Push(program);
-
-      if (Configuration.TopLevelPushCode) CodeStack.Insert(0, program);
-
-      // run top expression
-      DoStep();
-
-      Interpret();
+      using (PushProgramPool = PushProgramPoolProvider.CreatePool()) {
+        IsPaused = stepwise;
+
+        /* Push top expression so the loop is able to enter
+         * If the top expression is a single statement then the loop has nothing to do
+         * Otherwise the expand expression will be evaluated and pushes code onto the EXEC stack */
+        ExecStack.Push(program);
+
+        if (Configuration.TopLevelPushCode) CodeStack.Insert(0, program);
+
+        // run top expression
+        DoStep();
+
+        Interpret();
+      }
     }
 
@@ -146,4 +156,6 @@
 
       IsAborted = true;
+
+      if (PushProgramPool != null) PushProgramPool.Dispose();
 
       if (currentTask != null) await currentTask;
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 14746)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 14747)
@@ -1,21 +1,25 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter {
   using System;
-
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
   using HeuristicLab.Core;
   using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
   using HeuristicLab.Random;
 
   public class PushInterpreterPool {
     private readonly ObjectPool<PooledPushInterpreter> pool;
+    private ManagedPoolProvider<PushProgram> pushProgramPoolProvider;
 
     public PushInterpreterPool(PushConfiguration config = null)
-      : this(Environment.ProcessorCount * 2, config) {
+      : this(Environment.ProcessorCount * 2, 1024, null, config) {
     }
 
-    public PushInterpreterPool(int size, PushConfiguration config = null) {
-      this.PushGpConfiguration = config ?? new PushConfiguration();
+    public PushInterpreterPool(int size, int pushProgramPoolPartitionSize, int? maxPartitionCount = null, PushConfiguration config = null) {
+      PushGpConfiguration = config ?? new PushConfiguration();
 
-      this.pool = new ObjectPool<PooledPushInterpreter>(() => new PooledPushInterpreter(this, this.PushGpConfiguration), size);
+      pushProgramPoolProvider = new ManagedPoolProvider<PushProgram>(pushProgramPoolPartitionSize, maxPartitionCount);
+      pushProgramPoolProvider.InitDummyPartition(() => new PushProgram());
+
+      pool = new ObjectPool<PooledPushInterpreter>(() => new PooledPushInterpreter(this, PushGpConfiguration, pushProgramPoolProvider), size);
     }
 
