diff --git a/daemon/table/fib.cpp b/daemon/table/fib.cpp
index 3672b66..660ae72 100644
--- a/daemon/table/fib.cpp
+++ b/daemon/table/fib.cpp
@@ -144,8 +144,11 @@
 Fib::removeNextHopFromAllEntries(shared_ptr<Face> face)
 {
   for (NameTree::const_iterator it = m_nameTree.fullEnumerate(
-       &predicate_NameTreeEntry_hasFibEntry); it != m_nameTree.end(); ++it) {
+       &predicate_NameTreeEntry_hasFibEntry); it != m_nameTree.end();) {
     shared_ptr<fib::Entry> entry = it->getFibEntry();
+
+    ++it; // need to be advance before `erase`, otherwise the iterator can be invalidated
+
     entry->removeNextHop(face);
     if (!entry->hasNextHops()) {
       this->erase(*entry);
diff --git a/daemon/table/name-tree.hpp b/daemon/table/name-tree.hpp
index 027f852..0832a31 100644
--- a/daemon/table/name-tree.hpp
+++ b/daemon/table/name-tree.hpp
@@ -86,6 +86,7 @@
 
   ~NameTree();
 
+public: // information
   /**
    * \brief Get the number of occupied entries in the Name Tree
    */
@@ -101,6 +102,13 @@
   getNBuckets() const;
 
   /**
+   * \brief Dump all the information stored in the Name Tree for debugging.
+   */
+  void
+  dump(std::ostream& output) const;
+
+public: // mutation
+  /**
    * \brief Look for the Name Tree Entry that contains this name prefix.
    * \details Starts from the shortest name prefix, and then increase the
    * number of name components by one each time. All non-existing Name Tree
@@ -108,28 +116,48 @@
    * \param prefix The querying name prefix.
    * \return The pointer to the Name Tree Entry that contains this full name
    * prefix.
+   * \note Existing iterators are unaffected.
    */
   shared_ptr<name_tree::Entry>
   lookup(const Name& prefix);
 
   /**
-   * \brief Exact match lookup for the given name prefix.
-   * \return a null shared_ptr if this prefix is not found;
-   * otherwise return the Name Tree Entry address
-   */
-  shared_ptr<name_tree::Entry>
-  findExactMatch(const Name& prefix) const;
-
-  /**
    * \brief Delete a Name Tree Entry if this entry is empty.
    * \param entry The entry to be deleted if empty.
    * \note This function must be called after a table entry is detached from Name Tree
    *       entry. The function deletes a Name Tree entry if nothing is attached to it and
    *       it has no children, then repeats the same process on its ancestors.
+   * \note Existing iterators, except those pointing to deleted entries, are unaffected.
    */
   bool
   eraseEntryIfEmpty(shared_ptr<name_tree::Entry> entry);
 
+public: // shortcut access
+  /// get NameTree entry from attached FIB entry
+  shared_ptr<name_tree::Entry>
+  get(const fib::Entry& fibEntry) const;
+
+  /// get NameTree entry from attached PIT entry
+  shared_ptr<name_tree::Entry>
+  get(const pit::Entry& pitEntry) const;
+
+  /// get NameTree entry from attached Measurements entry
+  shared_ptr<name_tree::Entry>
+  get(const measurements::Entry& measurementsEntry) const;
+
+  /// get NameTree entry from attached StrategyChoice entry
+  shared_ptr<name_tree::Entry>
+  get(const strategy_choice::Entry& strategyChoiceEntry) const;
+
+public: // matching
+  /**
+   * \brief Exact match lookup for the given name prefix.
+   * \return a null shared_ptr if this prefix is not found;
+   * otherwise return the Name Tree Entry address
+   */
+  shared_ptr<name_tree::Entry>
+  findExactMatch(const Name& prefix) const;
+
   /**
    * \brief Longest prefix matching for the given name
    * \details Starts from the full name string, reduce the number of name component
@@ -146,15 +174,13 @@
                          name_tree::AnyEntry()) const;
 
   /**
-   * \brief Resize the hash table size when its load factor reaches a threshold.
-   * \details As we are currently using a hand-written hash table implementation
-   * for the Name Tree, the hash table resize() function should be kept in the
-   * name-tree.hpp file.
-   * \param newNBuckets The number of buckets for the new hash table.
+   * \brief Enumerate all the name prefixes that satisfy the prefix and entrySelector
    */
-  void
-  resize(size_t newNBuckets);
+  const_iterator
+  findAllMatches(const Name& prefix,
+                 const name_tree::EntrySelector& entrySelector = name_tree::AnyEntry()) const;
 
+public: // enumeration
   /**
    * \brief Enumerate all the name prefixes stored in the Name Tree.
    */
@@ -169,39 +195,13 @@
                    const name_tree::EntrySubTreeSelector& entrySubTreeSelector =
                          name_tree::AnyEntrySubTree()) const;
 
-  /**
-   * \brief Enumerate all the name prefixes that satisfy the prefix and entrySelector
-   */
-  const_iterator
-  findAllMatches(const Name& prefix,
-                 const name_tree::EntrySelector& entrySelector = name_tree::AnyEntry()) const;
-
-  /**
-   * \brief Dump all the information stored in the Name Tree for debugging.
-   */
-  void
-  dump(std::ostream& output) const;
-
-  shared_ptr<name_tree::Entry>
-  get(const fib::Entry& fibEntry) const;
-
-  shared_ptr<name_tree::Entry>
-  get(const pit::Entry& pitEntry) const;
-
-  shared_ptr<name_tree::Entry>
-  get(const measurements::Entry& measurementsEntry) const;
-
-  shared_ptr<name_tree::Entry>
-  get(const strategy_choice::Entry& strategeChoiceEntry) const;
-
   const_iterator
   begin() const;
 
   const_iterator
   end() const;
 
-  enum IteratorType
-  {
+  enum IteratorType {
     FULL_ENUMERATE_TYPE,
     PARTIAL_ENUMERATE_TYPE,
     FIND_ALL_MATCHES_TYPE
@@ -249,6 +249,17 @@
   };
 
 private:
+  /**
+   * \brief Resize the hash table size when its load factor reaches a threshold.
+   * \details As we are currently using a hand-written hash table implementation
+   * for the Name Tree, the hash table resize() function should be kept in the
+   * name-tree.hpp file.
+   * \param newNBuckets The number of buckets for the new hash table.
+   */
+  void
+  resize(size_t newNBuckets);
+
+private:
   size_t                        m_nItems;  // Number of items being stored
   size_t                        m_nBuckets; // Number of hash buckets
   size_t                        m_minNBuckets; // Minimum number of hash buckets
@@ -309,9 +320,9 @@
 }
 
 inline shared_ptr<name_tree::Entry>
-NameTree::get(const strategy_choice::Entry& strategeChoiceEntry) const
+NameTree::get(const strategy_choice::Entry& strategyChoiceEntry) const
 {
-  return strategeChoiceEntry.m_nameTreeEntry;
+  return strategyChoiceEntry.m_nameTreeEntry;
 }
 
 inline NameTree::const_iterator
