Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15032)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/Extensions.cs	(revision 15189)
@@ -25,21 +25,29 @@
 
     public static Type GetStackEntryType(this StackTypes stackType) {
+      if (StackProperties.ContainsKey(stackType) &&
+          StackProperties[stackType].PropertyType.IsGenericType) {
+        var genericTypeDef = StackProperties[stackType].PropertyType.GetGenericTypeDefinition();
+        if (genericTypeDef == typeof(IPushStack<>))
+          return genericTypeDef.GetGenericArguments()[0];
+      }
+
       return StackProperties.ContainsKey(stackType)
-        ? StackProperties[stackType].PropertyType.GetGenericArguments().Single()
+        ? StackProperties[stackType]
+            .PropertyType
+            .GetInterfaces()
+            .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPushStack<>))
+            .GetGenericArguments()
+            .First()
         : null;
     }
 
     public static void PrintStacks(this IPushInterpreter interpreter) {
-      var stackTypesType = typeof(StackTypes);
-
-      foreach (StackTypes type in Enum.GetValues(stackTypesType)) {
-        if (!interpreter.Stacks.ContainsKey(type)) continue;
-
-        var stackName = Enum.GetName(stackTypesType, type);
-        var stack = interpreter.Stacks[type];
+      foreach (var pair in interpreter.Stacks) {
+        var stackName = pair.Key.ToString();
+        var stack = interpreter.Stacks[pair.Key];
 
         if (stack.IsEmpty || !stack.IsEnabled) continue;
 
-        var stackString = string.Join(" ", interpreter.StringifyStack(type).Reverse());
+        var stackString = string.Join(" ", interpreter.StringifyStack(pair.Key).Reverse());
         Console.WriteLine("--------- {0} ---------\n{1}\n", stackName, stackString);
       }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs	(revision 15032)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IInternalPushInterpreter.cs	(revision 15189)
@@ -1,6 +1,11 @@
 ﻿namespace HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
+
   public interface IInternalPushInterpreter : IPushInterpreter {
     InterpreterPoolContainer PoolContainer { get; }
     bool IsNameQuoteFlagSet { get; set; }
+    IReadOnlyList<Expression> InputExpressions { get; }
   }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 15032)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/IPushInterpreter.cs	(revision 15189)
@@ -24,5 +24,5 @@
     IPushStack<IReadOnlyList<bool>> BooleanVectorStack { get; }
     IPushStack<IReadOnlyList<string>> StringVectorStack { get; }
-    IPushStack<string> PrintStack { get; }
+    IPrintStack PrintStack { get; }
     IDictionary<string, Expression> CustomExpressions { get; }
     IReadOnlyDictionary<StackTypes, IPushStack> Stacks { get; }
@@ -30,4 +30,14 @@
     void Clear();
     void Reset();
+
+    void SetInput(
+      IReadOnlyList<long> integers = null,
+      IReadOnlyList<double> floats = null,
+      IReadOnlyList<bool> booleans = null,
+      IReadOnlyList<char> chars = null,
+      IReadOnlyList<string> strings = null,
+      IReadOnlyList<IReadOnlyList<long>> integerVectors = null,
+      IReadOnlyList<IReadOnlyList<double>> floatVectors = null,
+      IReadOnlyList<IReadOnlyList<string>> stringVectors = null);
 
     void Run(bool stepwise);
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15032)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreter.cs	(revision 15189)
@@ -2,4 +2,5 @@
   using System;
   using System.Collections.Generic;
+  using System.Linq;
   using System.Runtime.CompilerServices;
   using System.Threading;
@@ -35,5 +36,5 @@
       BooleanVectorStack = new PushStack<IReadOnlyList<bool>>();
       StringVectorStack = new PushStack<IReadOnlyList<string>>();
-      PrintStack = new PushStack<string>();
+      PrintStack = new PrintStack();
 
       Stacks = new Dictionary<StackTypes, IPushStack> {
@@ -53,4 +54,6 @@
       };
 
+      supportedStackTypes = Stacks.Keys.ToArray();
+
       CustomExpressions = new Dictionary<string, Expression>();
       PoolContainer = poolContainer ?? new InterpreterPoolContainer();
@@ -63,4 +66,5 @@
     }
 
+    private readonly StackTypes[] supportedStackTypes;
     public IReadOnlyDictionary<StackTypes, IPushStack> Stacks { get; private set; }
 
@@ -128,9 +132,104 @@
     public IPushStack<IReadOnlyList<string>> StringVectorStack { get; private set; }
     [PushStack(StackTypes.Print)]
-    public IPushStack<string> PrintStack { get; private set; }
+    public IPrintStack PrintStack { get; private set; }
 
     public IDictionary<string, Expression> CustomExpressions { get; private set; }
 
     public bool IsNameQuoteFlagSet { get; set; }
+
+    private readonly List<Expression> inputExpressions = new List<Expression>();
+    IReadOnlyList<Expression> IInternalPushInterpreter.InputExpressions { get { return inputExpressions; } }
+
+    public void SetInput(
+      IReadOnlyList<long> integers = null,
+      IReadOnlyList<double> floats = null,
+      IReadOnlyList<bool> booleans = null,
+      IReadOnlyList<char> chars = null,
+      IReadOnlyList<string> strings = null,
+      IReadOnlyList<IReadOnlyList<long>> integerVectors = null,
+      IReadOnlyList<IReadOnlyList<double>> floatVectors = null,
+      IReadOnlyList<IReadOnlyList<string>> stringVectors = null) {
+
+      // Integer
+      if (integers != null && integers.Count > 0) {
+        var integerPushExpressionPool = PoolContainer.GetStatefulExpressionPool<IntegerPushExpression>();
+
+        for (var i = 0; i < integers.Count; i++) {
+          var expression = IntegerPushExpression.Create(integerPushExpressionPool, integers[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Float
+      if (floats != null && floats.Count > 0) {
+        var floatPushExpressionPool = PoolContainer.GetStatefulExpressionPool<FloatPushExpression>();
+
+        for (var i = 0; i < floats.Count; i++) {
+          var expression = FloatPushExpression.Create(floatPushExpressionPool, floats[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Booleans
+      if (booleans != null && booleans.Count > 0) {
+        var booleanPushExpressionPool = PoolContainer.GetStatefulExpressionPool<BooleanPushExpression>();
+
+        for (var i = 0; i < booleans.Count; i++) {
+          var expression = BooleanPushExpression.Create(booleanPushExpressionPool, booleans[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // Char
+      if (chars != null && chars.Count > 0) {
+        var charPushExpressionPool = PoolContainer.GetStatefulExpressionPool<CharPushExpression>();
+
+        for (var i = 0; i < chars.Count; i++) {
+          var expression = CharPushExpression.Create(charPushExpressionPool, chars[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // String
+      if (strings != null && strings.Count > 0) {
+        var stringPushExpressionPool = PoolContainer.GetStatefulExpressionPool<StringPushExpression>();
+
+        for (var i = 0; i < strings.Count; i++) {
+          var expression = StringPushExpression.Create(stringPushExpressionPool, strings[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // IntegerVector
+      if (integerVectors != null && integerVectors.Count > 0) {
+        var integerVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<IntegerVectorPushExpression>();
+
+        for (var i = 0; i < integerVectors.Count; i++) {
+          var expression = IntegerVectorPushExpression.Create(integerVectorPushExpressionPool, integerVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // FloatVector
+      if (floatVectors != null && floatVectors.Count > 0) {
+        var floatVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<FloatVectorPushExpression>();
+
+        for (var i = 0; i < floatVectors.Count; i++) {
+          var expression = FloatVectorPushExpression.Create(floatVectorPushExpressionPool, floatVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+
+      // StringVector
+      if (stringVectors != null && stringVectors.Count > 0) {
+        var stringVectorPushExpressionPool = PoolContainer.GetStatefulExpressionPool<StringVectorPushExpression>();
+
+        for (var i = 0; i < stringVectors.Count; i++) {
+          var expression = StringVectorPushExpression.Create(stringVectorPushExpressionPool, stringVectors[i]);
+          inputExpressions.Add(expression);
+        }
+      }
+    }
+
 
     public Task RunAsync(string code, CancellationToken token = default(CancellationToken)) {
@@ -240,4 +339,5 @@
       currentProgram = null;
 
+      inputExpressions.Clear();
       Clear();
       ConfigureStacks();
@@ -245,6 +345,7 @@
 
     private void ConfigureStacks() {
-      foreach (var pair in this.Stacks) {
-        pair.Value.IsEnabled = Configuration.IsStackEnabled(pair.Key);
+      for (var i = 0u; i < supportedStackTypes.Length; i++) {
+        var key = supportedStackTypes[i];
+        Stacks[key].IsEnabled = Configuration.IsStackEnabled(key);
       }
 
@@ -257,6 +358,8 @@
     /// </summary>
     public void Clear() {
-      foreach (var stack in Stacks)
-        stack.Value.Clear();
+      for (var i = 0u; i < supportedStackTypes.Length; i++) {
+        var key = supportedStackTypes[i];
+        Stacks[key].Clear();
+      }
 
       CustomExpressions.Clear();
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15032)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Interpreter/PushInterpreterPool.cs	(revision 15189)
@@ -47,4 +47,5 @@
       PushProgramPoolProvider.Clear();
       ExpressionListPoolProvider.Clear();
+      pool.Clear();
     }
   }
