Index: branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/CrossoverPoint.cs
===================================================================
--- branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/CrossoverPoint.cs	(revision 5549)
+++ 	(revision )
@@ -1,35 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-
-namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
-  internal class CrossoverPoint {
-    public ISymbolicExpressionTreeNode Parent { get; set; }
-    public ISymbolicExpressionTreeNode Child { get; set; }
-    public int SubtreeIndex {
-      get { return Parent.IndexOfSubTree(Child); }
-    }
-    public CrossoverPoint(ISymbolicExpressionTreeNode parent, ISymbolicExpressionTreeNode child) {
-      this.Parent = parent;
-      this.Child = child;
-    }
-  }
-}
Index: branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs
===================================================================
--- branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 5549)
+++ branches/DataAnalysis Refactoring/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Crossovers/SubtreeCrossover.cs	(revision 5686)
@@ -120,5 +120,5 @@
       // check syntax constraints of direct parent - child relation
       if (!parent.Grammar.ContainsSymbol(branch.Symbol) ||
-          !parent.Grammar.IsAllowedChild(parent.Symbol, branch.Symbol, replacedSubtreeIndex)) return false;
+          !parent.Grammar.IsAllowedChildSymbol(parent.Symbol, branch.Symbol, replacedSubtreeIndex)) return false;
 
       bool result = true;
@@ -128,6 +128,6 @@
           result &&
           parent.Grammar.ContainsSymbol(n.Symbol) &&
-          n.SubTrees.Count() >= parent.Grammar.GetMinSubtreeCount(n.Symbol) &&
-          n.SubTrees.Count() <= parent.Grammar.GetMaxSubtreeCount(n.Symbol);
+          n.SubtreesCount >= parent.Grammar.GetMinimumSubtreeCount(n.Symbol) &&
+          n.SubtreesCount <= parent.Grammar.GetMaximumSubtreeCount(n.Symbol);
       });
       return result;
@@ -136,15 +136,15 @@
     private static void SelectCrossoverPoint(IRandom random, ISymbolicExpressionTree parent0, double internalNodeProbability, int maxBranchLength, int maxBranchDepth, out ISymbolicExpressionTreeNode crossoverPoint, out int subtreeIndex) {
       if (internalNodeProbability < 0.0 || internalNodeProbability > 1.0) throw new ArgumentException("internalNodeProbability");
-      List<CrossoverPoint> internalCrossoverPoints = new List<CrossoverPoint>();
-      List<CrossoverPoint> leafCrossoverPoints = new List<CrossoverPoint>();
+      List<CutPoint> internalCrossoverPoints = new List<CutPoint>();
+      List<CutPoint> leafCrossoverPoints = new List<CutPoint>();
       parent0.Root.ForEachNodePostfix((n) => {
-        if (n.SubTrees.Count() > 0 && n != parent0.Root) {
+        if (n.SubTrees.Any() && n != parent0.Root) {
           foreach (var child in n.SubTrees) {
             if (child.GetLength() <= maxBranchLength &&
                 child.GetDepth() <= maxBranchDepth) {
-              if (child.SubTrees.Count() > 0)
-                internalCrossoverPoints.Add(new CrossoverPoint(n, child));
+              if (child.SubTrees.Any())
+                internalCrossoverPoints.Add(new CutPoint(n, child));
               else
-                leafCrossoverPoints.Add(new CrossoverPoint(n, child));
+                leafCrossoverPoints.Add(new CutPoint(n, child));
             }
           }
@@ -158,10 +158,10 @@
           var selectedCrossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
           crossoverPoint = selectedCrossoverPoint.Parent;
-          subtreeIndex = selectedCrossoverPoint.SubtreeIndex;
+          subtreeIndex = selectedCrossoverPoint.ChildIndex;
         } else {
           // otherwise select external node
           var selectedCrossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
           crossoverPoint = selectedCrossoverPoint.Parent;
-          subtreeIndex = selectedCrossoverPoint.SubtreeIndex;
+          subtreeIndex = selectedCrossoverPoint.ChildIndex;
         }
       } else if (leafCrossoverPoints.Count > 0) {
@@ -169,10 +169,10 @@
         var selectedCrossoverPoint = leafCrossoverPoints[random.Next(leafCrossoverPoints.Count)];
         crossoverPoint = selectedCrossoverPoint.Parent;
-        subtreeIndex = selectedCrossoverPoint.SubtreeIndex;
+        subtreeIndex = selectedCrossoverPoint.ChildIndex;
       } else {
         // otherwise select internal crossover point
         var selectedCrossoverPoint = internalCrossoverPoints[random.Next(internalCrossoverPoints.Count)];
         crossoverPoint = selectedCrossoverPoint.Parent;
-        subtreeIndex = selectedCrossoverPoint.SubtreeIndex;
+        subtreeIndex = selectedCrossoverPoint.ChildIndex;
       }
     }
@@ -185,5 +185,5 @@
         // select internal node if possible
         allowedInternalBranches = (from branch in branches
-                                   where branch.SubTrees.Count() > 0
+                                   where branch.SubTrees.Any()
                                    select branch).ToList();
         if (allowedInternalBranches.Count > 0) {
@@ -192,5 +192,5 @@
           // no internal nodes allowed => select leaf nodes
           allowedLeafBranches = (from branch in branches
-                                 where branch.SubTrees.Count() == 0
+                                 where !branch.SubTrees.Any()
                                  select branch).ToList();
           return allowedLeafBranches.SelectRandom(random);
@@ -199,5 +199,5 @@
         // select leaf node if possible
         allowedLeafBranches = (from branch in branches
-                               where branch.SubTrees.Count() == 0
+                               where !branch.SubTrees.Any()
                                select branch).ToList();
         if (allowedLeafBranches.Count > 0) {
@@ -205,5 +205,5 @@
         } else {
           allowedInternalBranches = (from branch in branches
-                                     where branch.SubTrees.Count() > 0
+                                     where branch.SubTrees.Any()
                                      select branch).ToList();
           return allowedInternalBranches.SelectRandom(random);
