diff --git a/src/mhtree/InternalNode.java b/src/mhtree/InternalNode.java
index e628e861e062586fb6fc697b0592aa05cd6decee..060a681f580aa0ff853d403f160ddb083e03bbfe 100644
--- a/src/mhtree/InternalNode.java
+++ b/src/mhtree/InternalNode.java
@@ -22,7 +22,7 @@ public class InternalNode extends Node implements Serializable {
         children = new HashSet<>();
     }
 
-    public void addChildren(Set<Node> children) {
+    public void addChildren(List<Node> children) {
         this.children.addAll(children);
     }
 
@@ -48,10 +48,6 @@ public class InternalNode extends Node implements Serializable {
                 .collect(Collectors.toSet());
     }
 
-    public boolean contains(LocalAbstractObject object) {
-        return children.stream().anyMatch(child -> child.contains(object));
-    }
-
     public int getHeight() {
         return children.stream()
                 .mapToInt(Node::getHeight)
@@ -59,12 +55,12 @@ public class InternalNode extends Node implements Serializable {
                 .getMax() + 1;
     }
 
-    public Set<Node> getNodesOnLevel(int level) {
-        if (getLevel() == level) return Collections.singleton(this);
+    public List<Node> getNodesOnLevel(int level) {
+        if (getLevel() == level) return Collections.singletonList(this);
 
         return children.stream()
                 .map(child -> child.getNodesOnLevel(level))
                 .flatMap(Collection::stream)
-                .collect(Collectors.toSet());
+                .collect(Collectors.toList());
     }
 }
diff --git a/src/mhtree/LeafNode.java b/src/mhtree/LeafNode.java
index 07a610aed3db750ef2841c824ae14a005c64b727..238222be3c93adb08556700536dc0bfc81cc64a3 100644
--- a/src/mhtree/LeafNode.java
+++ b/src/mhtree/LeafNode.java
@@ -9,6 +9,7 @@ import messif.objects.util.AbstractObjectIterator;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 public class LeafNode extends Node implements Serializable {
@@ -41,19 +42,11 @@ public class LeafNode extends Node implements Serializable {
         return objects;
     }
 
-    public boolean contains(LocalAbstractObject object) {
-        for (AbstractObjectIterator<LocalAbstractObject> it = bucket.getAllObjects(); it.hasNext(); )
-            if (object == it.next())
-                return true;
-
-        return false;
-    }
-
     public int getHeight() {
         return 0;
     }
 
-    public Set<Node> getNodesOnLevel(int level) {
-        return Collections.singleton(this);
+    public List<Node> getNodesOnLevel(int level) {
+        return Collections.singletonList(this);
     }
 }
diff --git a/src/mhtree/Node.java b/src/mhtree/Node.java
index a8065c35971d74af980a50d3b31f75f9dd5c55c3..95904be2d8f12e75c196386dad42dfed2f1f56c8 100644
--- a/src/mhtree/Node.java
+++ b/src/mhtree/Node.java
@@ -18,9 +18,8 @@ public abstract class Node implements Serializable {
      * Serialization ID
      */
     private static final long serialVersionUID = 420L;
-    private final ObjectToNodeDistance objectToNodeDistance;
-
     protected final InsertType insertType;
+    private final ObjectToNodeDistance objectToNodeDistance;
     protected HullOptimizedRepresentationV3 hull;
     protected Node parent;
 
@@ -31,7 +30,7 @@ public abstract class Node implements Serializable {
         this.objectToNodeDistance = objectToNodeDistance;
     }
 
-    public static InternalNode createParent(Set<Node> nodes, PrecomputedDistances distances, InsertType insertType, ObjectToNodeDistance objectToNodeDistance) {
+    public static InternalNode createParent(List<Node> nodes, PrecomputedDistances distances, InsertType insertType, ObjectToNodeDistance objectToNodeDistance) {
         List<LocalAbstractObject> objects = nodes.stream()
                 .map(Node::getObjects)
                 .flatMap(Collection::stream)
@@ -41,14 +40,11 @@ public abstract class Node implements Serializable {
     }
 
     public double getDistance(LocalAbstractObject object) {
-        switch (objectToNodeDistance) {
-            case FURTHEST_HULL_OBJECT:
-                return getFurthestDistance(object);
-            case AVERAGE_DISTANCE:
-                return getAverageDistance(object);
-            default:
-                return getNearestDistance(object);
-        }
+        return objectToNodeDistance.getDistance(object, this);
+    }
+
+    public double getNearestDistance(LocalAbstractObject object) {
+        return ObjectToNodeDistance.NEAREST_HULL_OBJECT.getDistance(object, this);
     }
 
     public boolean isCovered(LocalAbstractObject object) {
@@ -80,11 +76,9 @@ public abstract class Node implements Serializable {
 
     public abstract Set<LocalAbstractObject> getObjects();
 
-    public abstract boolean contains(LocalAbstractObject object);
-
     public abstract int getHeight();
 
-    public abstract Set<Node> getNodesOnLevel(int level);
+    public abstract List<Node> getNodesOnLevel(int level);
 
     protected void rebuildHull(LocalAbstractObject object) {
         List<LocalAbstractObject> objects = new ArrayList<>(getObjects());
@@ -104,24 +98,4 @@ public abstract class Node implements Serializable {
 
         rebuildHull(object);
     }
-
-    public double getNearestDistance(LocalAbstractObject object) {
-        return hull.getHull().stream()
-                .mapToDouble(object::getDistance)
-                .min()
-                .orElse(Double.MAX_VALUE);
-    }
-
-    private double getFurthestDistance(LocalAbstractObject object) {
-        return hull.getHull().stream()
-                .mapToDouble(object::getDistance)
-                .max()
-                .orElse(Double.MIN_VALUE);
-    }
-
-    private double getAverageDistance(LocalAbstractObject object) {
-        return hull.getHull().stream()
-                .mapToDouble(object::getDistance)
-                .sum() / hull.getHull().size();
-    }
 }