Index: branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 12440)
+++ branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 12515)
@@ -135,5 +135,7 @@
       parent0.Root.ForEachNodePostfix((n) => {
         if (n.SubtreeCount > 0 && n != parent0.Root) {
-          foreach (var child in n.Subtrees) {
+          //avoid linq to reduce memory pressure
+          for (int i = 0; i < n.SubtreeCount; i++) {
+            var child = n.GetSubtree(i);
             if (child.GetLength() <= maxBranchLength &&
                 child.GetDepth() <= maxBranchDepth) {
Index: branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 12440)
+++ branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SymbolicExpressionTreeCrossover.cs	(revision 12515)
@@ -68,4 +68,17 @@
 
     public abstract ISymbolicExpressionTree Crossover(IRandom random, ISymbolicExpressionTree parent0, ISymbolicExpressionTree parent1);
+
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.4
+      #region Backwards compatible code, remove with 3.5
+      if (Parameters.ContainsKey("Child")) {
+        var oldChildParameter = (ILookupParameter<ISymbolicExpressionTree>)Parameters["Child"];
+        Parameters.Remove("Child");
+        SymbolicExpressionTreeParameter.ActualName = oldChildParameter.ActualName;
+      }
+      #endregion
+    }
   }
 }
Index: branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/SymbolicExpressionGrammarBase.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/SymbolicExpressionGrammarBase.cs	(revision 12440)
+++ branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/SymbolicExpressionGrammarBase.cs	(revision 12515)
@@ -338,7 +338,11 @@
         List<string> temp;
         if (allowedChildSymbols.TryGetValue(parent.Name, out temp)) {
-          if (temp.SelectMany(s => GetSymbol(s).Flatten()).Any(s => s.Name == child.Name)) {
-            cachedIsAllowedChildSymbol.Add(key, true);
-            return true;
+          for (int i = 0; i < temp.Count; i++) {
+            var symbol = GetSymbol(temp[i]);
+            foreach (var s in symbol.Flatten())
+              if (s.Name == child.Name) {
+                cachedIsAllowedChildSymbol.Add(key, true);
+                return true;
+              }
           }
         }
@@ -365,7 +369,11 @@
         List<string> temp;
         if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, argumentIndex), out temp)) {
-          if (temp.SelectMany(s => GetSymbol(s).Flatten()).Any(s => s.Name == child.Name)) {
-            cachedIsAllowedChildSymbolIndex.Add(key, true);
-            return true;
+          for (int i = 0; i < temp.Count; i++) {
+            var symbol = GetSymbol(temp[i]);
+            foreach (var s in symbol.Flatten())
+              if (s.Name == child.Name) {
+                cachedIsAllowedChildSymbolIndex.Add(key, true);
+                return true;
+              }
           }
         }
Index: branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs	(revision 12440)
+++ branches/HiveStatistics/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionTreeNode.cs	(revision 12515)
@@ -175,5 +175,5 @@
 
     public IEnumerable<ISymbolicExpressionTreeNode> IterateNodesBreadth() {
-      var list = new List<ISymbolicExpressionTreeNode>() { this };
+      var list = new List<ISymbolicExpressionTreeNode>(GetLength()) { this };
       int i = 0;
       while (i != list.Count) {
@@ -193,7 +193,8 @@
     public void ForEachNodePrefix(Action<ISymbolicExpressionTreeNode> a) {
       a(this);
-      if (Subtrees != null) {
-        foreach (var subtree in Subtrees) {
-          subtree.ForEachNodePrefix(a);
+      if (subtrees != null) {
+        //avoid linq to reduce memory pressure
+        for (int i = 0; i < subtrees.Count; i++) {
+          subtrees[i].ForEachNodePrefix(a);
         }
       }
@@ -207,7 +208,8 @@
 
     public void ForEachNodePostfix(Action<ISymbolicExpressionTreeNode> a) {
-      if (Subtrees != null) {
-        foreach (var subtree in Subtrees) {
-          subtree.ForEachNodePostfix(a);
+      if (subtrees != null) {
+        //avoid linq to reduce memory pressure
+        for (int i = 0; i < subtrees.Count; i++) {
+          subtrees[i].ForEachNodePostfix(a);
         }
       }
