Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/DuplicateExpressions.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/DuplicateExpressions.cs	(revision 14395)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/DuplicateExpressions.cs	(revision 14397)
@@ -1,5 +1,4 @@
 ﻿using HeuristicLab.Algorithms.PushGP.Interpreter;
 using HeuristicLab.Algorithms.PushGP.Stack;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Algorithms.PushGP.Expressions
@@ -20,10 +19,6 @@
                 return;
 
-            var clone = this.Clone(stack.Top);
-
-            stack.Push(clone);
+            stack.Push(stack.Top);
         }
-
-        public abstract T Clone(T original);
     }
 
@@ -36,9 +31,4 @@
         {
             this.Eval(interpreter.IntegerStack);
-        }
-
-        public override long Clone(long value)
-        {
-            return value;
         }
     }
@@ -53,9 +43,4 @@
             this.Eval(interpreter.FloatStack);
         }
-
-        public override double Clone(double value)
-        {
-            return value;
-        }
     }
 
@@ -68,9 +53,4 @@
         {
             this.Eval(interpreter.BooleanStack);
-        }
-
-        public override bool Clone(bool value)
-        {
-            return value;
         }
     }
@@ -85,14 +65,8 @@
             this.Eval(interpreter.NameStack);
         }
-
-        public override string Clone(string value)
-        {
-            return string.Copy(value);
-        }
     }
 
     public class ExecDuplicateExpression : DuplicateExpression<Expression>
     {
-        private readonly Cloner cloner = new Cloner();
         public ExecDuplicateExpression() : base("EXEC.DUP")
         { }
@@ -102,15 +76,8 @@
             this.Eval(interpreter.ExecStack);
         }
-
-        public override Expression Clone(Expression original)
-        {
-            return cloner.Clone(original);
-        }
     }
 
     public class CodeDuplicateExpression : DuplicateExpression<Expression>
     {
-        private readonly Cloner cloner = new Cloner();
-
         public CodeDuplicateExpression() : base("CODE.DUP")
         { }
@@ -120,9 +87,4 @@
             this.Eval(interpreter.CodeStack);
         }
-
-        public override Expression Clone(Expression original)
-        {
-            return cloner.Clone(original);
-        }
     }
 }
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/ExecExpressions.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/ExecExpressions.cs	(revision 14395)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/ExecExpressions.cs	(revision 14397)
@@ -1,3 +1,4 @@
-﻿using System.Collections.Generic;
+﻿using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -24,8 +25,13 @@
 
         // copy constructor
-        public ExecExpandExpression(ExecExpandExpression expression, Cloner cloner) : base(expression, cloner)
-        {
-            this.Expressions = expression.Expressions;
-            this.treeIndex = expression.treeIndex;
+        public ExecExpandExpression(ExecExpandExpression original, Cloner cloner) : base(original, cloner)
+        {
+            this.Expressions = new Expression[original.Expressions.Length];
+            Array.Copy(original.Expressions, this.Expressions, original.Expressions.Length);
+
+            if (original.treeIndex != null)
+            {
+                this.treeIndex = original.treeIndex.Select(e => cloner.Clone(e)).ToList();
+            }
         }
 
@@ -69,4 +75,21 @@
         }
 
+        private int GetId()
+        {
+            if (this.Id == default(int))
+            {
+                unchecked
+                {
+                    this.Id = 19;
+                    foreach (var e in Expressions)
+                    {
+                        this.Id *= 31 + e.GetHashCode();
+                    }
+                }
+            }
+
+            return this.Id;
+        }
+
         public override IDeepCloneable Clone(Cloner cloner)
         {
@@ -89,4 +112,9 @@
 
             return this.Expressions.SequenceEqual(other.Expressions);
+        }
+
+        public override int GetHashCode()
+        {
+            return this.GetId();
         }
 
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP.csproj
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP.csproj	(revision 14395)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP.csproj	(revision 14397)
@@ -80,4 +80,6 @@
     <Compile Include="Expressions\Expression.cs" />
     <Compile Include="Expressions\NameExpressions.cs" />
+    <Compile Include="Simplifier\ISimplifier.cs" />
+    <Compile Include="Simplifier\RandomSimplifier.cs" />
     <Compile Include="StateFullExpressionAttribute.cs" />
     <Compile Include="Generators\BooleanGenerator.cs" />
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Interpreter/Configuration.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Interpreter/Configuration.cs	(revision 14395)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Interpreter/Configuration.cs	(revision 14397)
@@ -14,7 +14,7 @@
             this.IsNameStackEnabled = true;
 
-            this.EvalPushLimit = 1024;
-            this.MaxPointsInProgram = 4096;
-            this.MaxPointsInRandomExpression = 4096;
+            this.EvalPushLimit = 4096;
+            this.MaxPointsInProgram = 128;
+            this.MaxPointsInRandomExpression = 1024;
 
             this.TopLevelPushCode = true;
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/ISimplifier.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/ISimplifier.cs	(revision 14397)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/ISimplifier.cs	(revision 14397)
@@ -0,0 +1,9 @@
+﻿using HeuristicLab.Algorithms.PushGP.Expressions;
+
+namespace HeuristicLab.Algorithms.PushGP.Simplifier
+{
+    public interface ISimplifier
+    {
+        Expression Simplify(Expression program);
+    }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/RandomSimplifier.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/RandomSimplifier.cs	(revision 14397)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Simplifier/RandomSimplifier.cs	(revision 14397)
@@ -0,0 +1,27 @@
+﻿using HeuristicLab.Algorithms.PushGP.Expressions;
+using HeuristicLab.Core;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.PushGP.Simplifier
+{
+    public class RandomSimplifier : ISimplifier
+    {
+        private IRandom rand = new FastRandom();
+        public int Trys { get; set; }
+
+        public Expression Simplify(Expression program)
+        {
+            if (program.GetType() != typeof(ExecExpandExpression))
+                return program;
+
+            var clone = program.Clone() as ExecExpandExpression;
+
+            for (var i = 0; i < this.Trys; i++)
+            {
+                var index = rand.Next(0, clone.TotalCount - 1);
+            }
+
+            return clone;
+        }
+    }
+}
Index: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Tests/Benchmark/Problem/CountOdds.cs
===================================================================
--- branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Tests/Benchmark/Problem/CountOdds.cs	(revision 14395)
+++ branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Tests/Benchmark/Problem/CountOdds.cs	(revision 14397)
@@ -3,4 +3,6 @@
 using System.Diagnostics;
 using System.Linq;
+using System.Threading.Tasks;
+using HeuristicLab.Algorithms.PushGP.Expressions;
 using HeuristicLab.Algorithms.PushGP.Interpreter;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -21,17 +23,21 @@
         public void RandomWalk()
         {
-            var interpreter = new PushGPInterpreter(new Configuration
+            var limit = 1000;
+            var iterations = 20000;
+            var best = double.MaxValue;
+            Expression bestProgram = null;
+            var lockObj = new object();
+            var globalExecCounter = 0;
+
+
+            Parallel.For(0, iterations, async i =>
             {
-                EvalPushLimit = 10000
-            });
+                var interpreter = new PushGPInterpreter(new Configuration
+                {
+                    EvalPushLimit = 10000
+                });
 
-            var limit = 1000;
-            var iterations = 3000;
-            var best = double.MaxValue;
-
-            for (var i = 0; i < iterations; i++)
-            {
+                var execCounter = 0;
                 var program = interpreter.CodeGenerator.RandomProgram(limit);
-
                 var results = new List<long>();
 
@@ -43,5 +49,5 @@
                     }
 
-                    interpreter.Interpret(program);
+                    await interpreter.InterpretAsync(program);
 
                     if (!interpreter.IntegerStack.IsEmpty)
@@ -51,21 +57,28 @@
                         results.Add(Math.Min(value, 1000));
                     }
+
+                    execCounter += interpreter.ExecCounter;
+                    interpreter.Clear();
                 }
 
-
                 if (!results.Any())
-                    continue;
+                    return;
 
                 var avg = results.Average();
 
-                if (avg < best)
+                lock (lockObj)
                 {
-                    best = avg;
+                    if (avg < best)
+                    {
+                        best = avg;
+                        bestProgram = program;
+                        globalExecCounter += execCounter;
+                    }
                 }
-
-                interpreter.Clear();
-            }
+            });
 
             Debug.WriteLine("Best: {0}", best);
+            Debug.WriteLine("Program: {0}", bestProgram);
+            Debug.WriteLine("ExecCounter: {0}", globalExecCounter);
         }
     }
