Index: /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs
===================================================================
--- /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs	(revision 7488)
+++ /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/MultiSymbolicDataAnalysisExpressionCrossover.cs	(revision 7489)
@@ -106,5 +106,5 @@
       var checkedItemList = new CheckedItemList<ISymbolicExpressionTreeCrossover>();
       checkedItemList.AddRange(list.OrderBy(op => op.Name));
-      Operators = checkedItemList.AsReadOnly();
+      Operators = checkedItemList;
       Operators_ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<ISymbolicExpressionTreeCrossover>>(Operators.CheckedItems));
     }
Index: /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionDepthConstrainedCrossover.cs
===================================================================
--- /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionDepthConstrainedCrossover.cs	(revision 7488)
+++ /branches/HeuristicLab.Crossovers/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Crossovers/SymbolicDataAnalysisExpressionDepthConstrainedCrossover.cs	(revision 7489)
@@ -37,6 +37,6 @@
     private enum Ranges { HighLevel, Standard, LowLevel };
     private const string DepthRangeParameterName = "DepthRange";
+
     #region Parameter properties
-
     public ConstrainedValueParameter<StringValue> DepthRangeParameter {
       get { return (ConstrainedValueParameter<StringValue>)Parameters[DepthRangeParameterName]; }
@@ -60,5 +60,4 @@
       DepthRangeParameter.ValidValues.Add(new StringValue(Enum.GetName(typeof(Ranges), Ranges.Standard)));
       DepthRangeParameter.ValidValues.Add(new StringValue(Enum.GetName(typeof(Ranges), Ranges.LowLevel)));
-      Name = "DepthConstrainedCrossover";
     }
     public override IDeepCloneable Clone(Cloner cloner) { return new SymbolicDataAnalysisExpressionDepthConstrainedCrossover<T>(this, cloner); }
@@ -108,5 +107,5 @@
         depthRange.End = depthRange.Start;
 
-      var crossoverPoints0 = (from node in GetNodesAtDepth(parent0.Root, depthRange) select new CutPoint(node.Parent, node)).ToList();
+      var crossoverPoints0 = (from node in GetNodesAtDepth(parent0, depthRange) select new CutPoint(node.Parent, node)).ToList();
 
       if (crossoverPoints0.Count == 0)
@@ -118,5 +117,5 @@
       int length = parent0.Root.GetLength() - crossoverPoint0.Child.GetLength();
 
-      var allowedBranches = (from s in GetNodesAtDepth(parent1.Root, depthRange)
+      var allowedBranches = (from s in GetNodesAtDepth(parent1, depthRange)
                              where
                                crossoverPoint0.IsMatchingPointType(s) &&
@@ -130,23 +129,30 @@
     }
 
-    private static IEnumerable<ISymbolicExpressionTreeNode> GetNodesAtDepth(ISymbolicExpressionTreeNode root, IntRange range) {
-      var list = new List<Tuple<ISymbolicExpressionTreeNode, int>> { new Tuple<ISymbolicExpressionTreeNode, int>(root, 0) };
-      int offset = 0;
-      int level = 0;
-      while (level < range.End) {
-        ++level;
-        int count = list.Count;
-        for (int i = offset; i != count; ++i) {
-          if (list[i].Item1.Subtrees.Any())
-            list.AddRange(from s in list[i].Item1.Subtrees select new Tuple<ISymbolicExpressionTreeNode, int>(s, level));
-        }
-        offset = count;
-      }
-      // taking advantage of the fact that the list is already sorted by level
-      for (int i = list.Count - 1; i >= 0; --i) {
-        if (list[i].Item2 >= range.Start)
-          yield return list[i].Item1;
-        else break;
-      }
+    private static IEnumerable<ISymbolicExpressionTreeNode> GetNodesAtDepth(ISymbolicExpressionTree tree, IntRange depthRange) {
+      var treeDepth = tree.Root.GetDepth();
+      return from node in tree.Root.IterateNodesPostfix()
+             let depth = treeDepth - node.GetDepth()
+             where depthRange.Start <= depth
+             where depth <= depthRange.End
+             select node;
+
+      //var list = new List<Tuple<ISymbolicExpressionTreeNode, int>> { new Tuple<ISymbolicExpressionTreeNode, int>(root, 0) };
+      //int offset = 0;
+      //int level = 0;
+      //while (level < range.End) {
+      //  ++level;
+      //  int count = list.Count;
+      //  for (int i = offset; i != count; ++i) {
+      //    if (list[i].Item1.Subtrees.Any())
+      //      list.AddRange(from s in list[i].Item1.Subtrees select new Tuple<ISymbolicExpressionTreeNode, int>(s, level));
+      //  }
+      //  offset = count;
+      //}
+      //// taking advantage of the fact that the list is already sorted by level
+      //for (int i = list.Count - 1; i >= 0; --i) {
+      //  if (list[i].Item2 >= range.Start)
+      //    yield return list[i].Item1;
+      //  else break;
+      //}
     }
 
