diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c9ccb97..d396d912 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 ## [Unreleased]
 ### Changed
+- Avoid unnecessary find() when removing a node. [#5](https://github.com/tzaeschke/phtree-cpp/issues/5)
 - Avoid unnecessary key copy when inserting a node. [#4](https://github.com/tzaeschke/phtree-cpp/issues/4)
 - for_each(callback, filter) was traversing too many nodes. [#2](https://github.com/tzaeschke/phtree-cpp/issues/2)
 - Build improvements for bazel/cmake
diff --git a/phtree/v16/iterator_base.h b/phtree/v16/iterator_base.h
index 50ac8708..b8c68486 100644
--- a/phtree/v16/iterator_base.h
+++ b/phtree/v16/iterator_base.h
@@ -135,8 +135,8 @@ class IteratorBase {
      * The parent entry contains the parent node. The parent node is the node ABOVE the current node
      * which contains the current entry.
      */
-    const EntryT* GetCurrentNodeEntry() const {
-        return current_node_;
+    EntryT* GetCurrentNodeEntry() const {
+        return const_cast<EntryT*>(current_node_);
     }
 
     const EntryT* GetParentNodeEntry() const {
diff --git a/phtree/v16/node.h b/phtree/v16/node.h
index 318a1d0f..24be9849 100644
--- a/phtree/v16/node.h
+++ b/phtree/v16/node.h
@@ -63,17 +63,15 @@ namespace {
  * @param parent_node Current owner of the child node.
  */
 template <dimension_t DIM, typename T, typename SCALAR>
-void MergeIntoParent(Node<DIM, T, SCALAR>& child_node, Node<DIM, T, SCALAR>& parent) {
+void MergeIntoParent(Node<DIM, T, SCALAR>& child_node, Entry<DIM, T, SCALAR>& parent_entry) {
     assert(child_node.GetEntryCount() == 1);
+    assert(&parent_entry.GetNode() == &child_node);
     // At this point we have found an entry that needs to be removed. We also know that we need to
     // remove the child node because it contains at most one other entry and it is not the root
     // node.
     auto map_entry = child_node.Entries().begin();
     auto& entry = map_entry->second;
 
-    auto hc_pos_in_parent = CalcPosInArray(entry.GetKey(), parent.GetPostfixLen());
-    auto& parent_entry = parent.Entries().find(hc_pos_in_parent)->second;
-
     if (entry.IsNode()) {
         // connect sub to parent
         auto& sub2 = entry.GetNode();
@@ -202,18 +200,18 @@ class Node {
      * @param found This is and output parameter and will be set to 'true' if a value was removed.
      * @return A child node if the provided key leads to a child node.
      */
-    Node* Erase(const KeyT& key, Node* parent, bool& found) {
+    EntryT* Erase(const KeyT& key, EntryT* parent_entry, bool& found) {
         hc_pos_t hc_pos = CalcPosInArray(key, GetPostfixLen());
         auto it = entries_.find(hc_pos);
         if (it != entries_.end() && DoesEntryMatch(it->second, key)) {
             if (it->second.IsNode()) {
-                return &it->second.GetNode();
+                return &it->second;
             }
             entries_.erase(it);
 
             found = true;
-            if (parent && GetEntryCount() == 1) {
-                MergeIntoParent(*this, *parent);
+            if (parent_entry != nullptr && GetEntryCount() == 1) {
+                MergeIntoParent(*this, *parent_entry);
                 // WARNING: (this) is deleted here, do not refer to it beyond this point.
             }
         }
diff --git a/phtree/v16/phtree_v16.h b/phtree/v16/phtree_v16.h
index e2b37aaf..34c134b3 100644
--- a/phtree/v16/phtree_v16.h
+++ b/phtree/v16/phtree_v16.h
@@ -57,7 +57,6 @@ class PhTreeV16 {
     using ScalarExternal = typename CONVERT::ScalarExternal;
     using ScalarInternal = typename CONVERT::ScalarInternal;
     using KeyT = typename CONVERT::KeyInternal;
-    using NodeT = Node<DIM, T, ScalarInternal>;
     using EntryT = Entry<DIM, T, ScalarInternal>;
 
   public:
@@ -216,13 +215,16 @@ class PhTreeV16 {
      * @return '1' if a value was found, otherwise '0'.
      */
     size_t erase(const KeyT& key) {
-        auto* current_node = &root_.GetNode();
-        NodeT* parent_node = nullptr;
+        auto* current_entry = &root_;
+        // We do not pass in the root entry as parent of a node because we do not want the
+        // root entry to be modified. The reason is simply that a lot of the code in this class
+        // becomes a lot simpler if we can assume the root entry to contain a node.
+        EntryT* non_root_current_entry = nullptr;
         bool found = false;
-        while (current_node) {
-            auto* child_node = current_node->Erase(key, parent_node, found);
-            parent_node = current_node;
-            current_node = child_node;
+        while (current_entry) {
+            auto* child_entry = current_entry->GetNode().Erase(key, non_root_current_entry, found);
+            current_entry = child_entry;
+            non_root_current_entry = child_entry;
         }
         num_entries_ -= found;
         return found;
@@ -245,18 +247,17 @@ class PhTreeV16 {
         if (iterator.Finished()) {
             return 0;
         }
-        if (!iterator.GetParentNodeEntry()) {
-            // Why may there be no parent?
-            // - we are in the root node
-            // - the iterator did not set this value
-            // In either case, we need to start searching from the top.
-            return erase(iterator.GetCurrentResult()->GetKey());
+         if (!iterator.GetCurrentNodeEntry() || iterator.GetCurrentNodeEntry() == &root_) {
+             // There may be no entry because not every iterator sets it.
+             // Also, do _not_ use the root entry, see erase(key).
+             // Start searching from the top.
+             return erase(iterator.GetCurrentResult()->GetKey());
         }
         bool found = false;
         assert(iterator.GetCurrentNodeEntry() && iterator.GetCurrentNodeEntry()->IsNode());
         iterator.GetCurrentNodeEntry()->GetNode().Erase(
             iterator.GetCurrentResult()->GetKey(),
-            &iterator.GetParentNodeEntry()->GetNode(),
+            iterator.GetCurrentNodeEntry(),
             found);
 
         num_entries_ -= found;
