diff --git a/daemon/table/fib-entry.hpp b/daemon/table/fib-entry.hpp
index 8f83266..94f2331 100644
--- a/daemon/table/fib-entry.hpp
+++ b/daemon/table/fib-entry.hpp
@@ -30,10 +30,11 @@
 
 namespace nfd {
 
-class NameTree;
 namespace name_tree {
+class NameTree;
 class Entry;
 } // namespace name_tree
+using name_tree::NameTree;
 
 namespace fib {
 
diff --git a/daemon/table/measurements-entry.hpp b/daemon/table/measurements-entry.hpp
index 8eb40ff..933baef 100644
--- a/daemon/table/measurements-entry.hpp
+++ b/daemon/table/measurements-entry.hpp
@@ -32,11 +32,11 @@
 
 namespace nfd {
 
-class NameTree;
-
 namespace name_tree {
+class NameTree;
 class Entry;
 } // namespace name_tree
+using name_tree::NameTree;
 
 namespace measurements {
 
diff --git a/daemon/table/name-tree-entry.cpp b/daemon/table/name-tree-entry.cpp
index b094e38..c0bc932 100644
--- a/daemon/table/name-tree-entry.cpp
+++ b/daemon/table/name-tree-entry.cpp
@@ -29,8 +29,8 @@
 namespace name_tree {
 
 Node::Node()
-  : m_prev(0)
-  , m_next(0)
+  : m_prev(nullptr)
+  , m_next(nullptr)
 {
 }
 
@@ -38,9 +38,9 @@
 {
   // erase the Name Tree Nodes that were created to
   // resolve hash collisions
-  // So before erasing a single node, make sure its m_next == 0
+  // So before erasing a single node, make sure its m_next == nullptr
   // See eraseEntryIfEmpty in name-tree.cpp
-  if (m_next != 0)
+  if (m_next != nullptr)
     delete m_next;
 }
 
@@ -50,10 +50,6 @@
 {
 }
 
-Entry::~Entry()
-{
-}
-
 bool
 Entry::isEmpty() const
 {
diff --git a/daemon/table/name-tree-entry.hpp b/daemon/table/name-tree-entry.hpp
index 2827926..23acdd0 100644
--- a/daemon/table/name-tree-entry.hpp
+++ b/daemon/table/name-tree-entry.hpp
@@ -34,13 +34,11 @@
 
 namespace nfd {
 
-class NameTree;
-
 namespace name_tree {
 
-// Forward declarations
 class Node;
 class Entry;
+class NameTree;
 
 /**
  * \brief Name Tree Node Class
@@ -68,8 +66,6 @@
   explicit
   Entry(const Name& prefix);
 
-  ~Entry();
-
   const Name&
   getPrefix() const;
 
@@ -85,7 +81,7 @@
   shared_ptr<Entry>
   getParent() const;
 
-  std::vector<shared_ptr<Entry> >&
+  std::vector<shared_ptr<Entry>>&
   getChildren();
 
   bool
diff --git a/daemon/table/name-tree.cpp b/daemon/table/name-tree.cpp
index bcf888e..abc5672 100644
--- a/daemon/table/name-tree.cpp
+++ b/daemon/table/name-tree.cpp
@@ -32,6 +32,7 @@
 #include <type_traits>
 
 namespace nfd {
+namespace name_tree {
 
 NFD_LOG_INIT("NameTree");
 
@@ -46,8 +47,6 @@
 BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<NameTree::const_iterator>));
 #endif // HAVE_IS_DEFAULT_CONSTRUCTIBLE
 
-namespace name_tree {
-
 class Hash32
 {
 public:
@@ -81,12 +80,11 @@
   size_t hashValue = 0;
   size_t hashUpdate = 0;
 
-  for (Name::const_iterator it = prefix.begin(); it != prefix.end(); it++)
-    {
-      const char* wireFormat = reinterpret_cast<const char*>( it->wire() );
-      hashUpdate = CityHash::compute(wireFormat, it->size());
-      hashValue ^= hashUpdate;
-    }
+  for (Name::const_iterator it = prefix.begin(); it != prefix.end(); ++it) {
+    const char* wireFormat = reinterpret_cast<const char*>( it->wire() );
+    hashUpdate = CityHash::compute(wireFormat, it->size());
+    hashValue ^= hashUpdate;
+  }
 
   return hashValue;
 }
@@ -94,7 +92,7 @@
 std::vector<size_t>
 computeHashSet(const Name& prefix)
 {
-  prefix.wireEncode();  // guarantees prefix's wire buffer is not empty
+  prefix.wireEncode(); // guarantees prefix's wire buffer is not empty
 
   size_t hashValue = 0;
   size_t hashUpdate = 0;
@@ -102,156 +100,141 @@
   std::vector<size_t> hashValueSet;
   hashValueSet.push_back(hashValue);
 
-  for (Name::const_iterator it = prefix.begin(); it != prefix.end(); it++)
-    {
-      const char* wireFormat = reinterpret_cast<const char*>( it->wire() );
-      hashUpdate = CityHash::compute(wireFormat, it->size());
-      hashValue ^= hashUpdate;
-      hashValueSet.push_back(hashValue);
-    }
+  for (Name::const_iterator it = prefix.begin(); it != prefix.end(); ++it) {
+    const char* wireFormat = reinterpret_cast<const char*>( it->wire() );
+    hashUpdate = CityHash::compute(wireFormat, it->size());
+    hashValue ^= hashUpdate;
+    hashValueSet.push_back(hashValue);
+  }
 
   return hashValueSet;
 }
 
-} // namespace name_tree
-
 NameTree::NameTree(size_t nBuckets)
   : m_nItems(0)
   , m_nBuckets(nBuckets)
   , m_minNBuckets(nBuckets)
-  , m_enlargeLoadFactor(0.5)       // more than 50% buckets loaded
+  , m_enlargeLoadFactor(0.5) // more than 50% buckets loaded
   , m_enlargeFactor(2)       // double the hash table size
-  , m_shrinkLoadFactor(0.1) // less than 10% buckets loaded
-  , m_shrinkFactor(0.5)     // reduce the number of buckets by half
+  , m_shrinkLoadFactor(0.1)  // less than 10% buckets loaded
+  , m_shrinkFactor(0.5)      // reduce the number of buckets by half
   , m_endIterator(FULL_ENUMERATE_TYPE, *this, m_end)
 {
-  m_enlargeThreshold = static_cast<size_t>(m_enlargeLoadFactor *
-                                          static_cast<double>(m_nBuckets));
-
-  m_shrinkThreshold = static_cast<size_t>(m_shrinkLoadFactor *
-                                          static_cast<double>(m_nBuckets));
+  m_enlargeThreshold = static_cast<size_t>(m_enlargeLoadFactor * static_cast<double>(m_nBuckets));
+  m_shrinkThreshold = static_cast<size_t>(m_shrinkLoadFactor * static_cast<double>(m_nBuckets));
 
   // array of node pointers
-  m_buckets = new name_tree::Node*[m_nBuckets];
+  m_buckets = new Node*[m_nBuckets];
   // Initialize the pointer array
-  for (size_t i = 0; i < m_nBuckets; i++)
-    m_buckets[i] = 0;
+  for (size_t i = 0; i < m_nBuckets; ++i) {
+    m_buckets[i] = nullptr;
+  }
 }
 
 NameTree::~NameTree()
 {
-  for (size_t i = 0; i < m_nBuckets; i++)
-    {
-      if (m_buckets[i] != 0) {
-        delete m_buckets[i];
-      }
+  for (size_t i = 0; i < m_nBuckets; ++i) {
+    if (m_buckets[i] != nullptr) {
+      delete m_buckets[i];
     }
+  }
 
-  delete [] m_buckets;
+  delete[] m_buckets;
 }
 
 // insert() is a private function, and called by only lookup()
-std::pair<shared_ptr<name_tree::Entry>, bool>
+std::pair<shared_ptr<Entry>, bool>
 NameTree::insert(const Name& prefix)
 {
   NFD_LOG_TRACE("insert " << prefix);
 
-  size_t hashValue = name_tree::computeHash(prefix);
+  size_t hashValue = computeHash(prefix);
   size_t loc = hashValue % m_nBuckets;
 
   NFD_LOG_TRACE("Name " << prefix << " hash value = " << hashValue << "  location = " << loc);
 
   // Check if this Name has been stored
-  name_tree::Node* node = m_buckets[loc];
-  name_tree::Node* nodePrev = node;  // initialize nodePrev to node
+  Node* node = m_buckets[loc];
+  Node* nodePrev = node;
 
-  for (node = m_buckets[loc]; node != 0; node = node->m_next)
-    {
-      if (static_cast<bool>(node->m_entry))
-        {
-          if (prefix == node->m_entry->m_prefix)
-            {
-              return std::make_pair(node->m_entry, false); // false: old entry
-            }
-        }
-      nodePrev = node;
+  for (node = m_buckets[loc]; node != nullptr; node = node->m_next) {
+    if (node->m_entry != nullptr) {
+      if (prefix == node->m_entry->m_prefix) {
+         return {node->m_entry, false}; // false: old entry
+      }
     }
+    nodePrev = node;
+  }
 
   NFD_LOG_TRACE("Did not find " << prefix << ", need to insert it to the table");
 
   // If no bucket is empty occupied, we need to create a new node, and it is
   // linked from nodePrev
-  node = new name_tree::Node();
+  node = new Node();
   node->m_prev = nodePrev;
 
-  if (nodePrev == 0)
-    {
-      m_buckets[loc] = node;
-    }
-  else
-    {
-      nodePrev->m_next = node;
-    }
+  if (nodePrev == nullptr) {
+    m_buckets[loc] = node;
+  }
+  else{
+    nodePrev->m_next = node;
+  }
 
   // Create a new Entry
-  shared_ptr<name_tree::Entry> entry(make_shared<name_tree::Entry>(prefix));
+  auto entry = make_shared<Entry>(prefix);
   entry->setHash(hashValue);
   node->m_entry = entry; // link the Entry to its Node
   entry->m_node = node; // link the node to Entry. Used in eraseEntryIfEmpty.
 
-  return std::make_pair(entry, true); // true: new entry
+  return {entry, true}; // true: new entry
 }
 
 // Name Prefix Lookup. Create Name Tree Entry if not found
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::lookup(const Name& prefix)
 {
   NFD_LOG_TRACE("lookup " << prefix);
 
-  shared_ptr<name_tree::Entry> entry;
-  shared_ptr<name_tree::Entry> parent;
+  shared_ptr<Entry> entry;
+  shared_ptr<Entry> parent;
 
-  for (size_t i = 0; i <= prefix.size(); i++)
-    {
-      Name temp = prefix.getPrefix(i);
+  for (size_t i = 0; i <= prefix.size(); ++i) {
+    Name temp = prefix.getPrefix(i);
 
-      // insert() will create the entry if it does not exist.
-      std::pair<shared_ptr<name_tree::Entry>, bool> ret = insert(temp);
-      entry = ret.first;
+    // insert() will create the entry if it does not exist.
+    bool isNew = false;
+    std::tie(entry, isNew) = insert(temp);
 
-      if (ret.second == true)
-        {
-          m_nItems++; // Increase the counter
-          entry->m_parent = parent;
+    if (isNew) {
+      ++m_nItems; // Increase the counter
+      entry->m_parent = parent;
 
-          if (static_cast<bool>(parent))
-            {
-              parent->m_children.push_back(entry);
-            }
-        }
-
-      if (m_nItems > m_enlargeThreshold)
-        {
-          resize(m_enlargeFactor * m_nBuckets);
-        }
-
-      parent = entry;
+      if (parent != nullptr) {
+        parent->m_children.push_back(entry);
+      }
     }
+
+    if (m_nItems > m_enlargeThreshold) {
+      resize(m_enlargeFactor * m_nBuckets);
+    }
+
+    parent = entry;
+  }
   return entry;
 }
 
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::lookup(const fib::Entry& fibEntry) const
 {
-  shared_ptr<name_tree::Entry> nte = this->getEntry(fibEntry);
+  shared_ptr<Entry> nte = this->getEntry(fibEntry);
   BOOST_ASSERT(nte == nullptr || nte->getFibEntry() == &fibEntry);
   return nte;
 }
 
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::lookup(const pit::Entry& pitEntry)
 {
-  shared_ptr<name_tree::Entry> nte = this->getEntry(pitEntry);
+  shared_ptr<Entry> nte = this->getEntry(pitEntry);
   if (nte == nullptr) {
     return nullptr;
   }
@@ -265,128 +248,115 @@
   return this->lookup(pitEntry.getName());
 }
 
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::lookup(const measurements::Entry& measurementsEntry) const
 {
-  shared_ptr<name_tree::Entry> nte = this->getEntry(measurementsEntry);
+  shared_ptr<Entry> nte = this->getEntry(measurementsEntry);
   BOOST_ASSERT(nte == nullptr || nte->getMeasurementsEntry() == &measurementsEntry);
   return nte;
 }
 
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::lookup(const strategy_choice::Entry& strategyChoiceEntry) const
 {
-  shared_ptr<name_tree::Entry> nte = this->getEntry(strategyChoiceEntry);
+  shared_ptr<Entry> nte = this->getEntry(strategyChoiceEntry);
   BOOST_ASSERT(nte == nullptr || nte->getStrategyChoiceEntry() == &strategyChoiceEntry);
   return nte;
 }
 
 // return {false: this entry is not empty, true: this entry is empty and erased}
 bool
-NameTree::eraseEntryIfEmpty(shared_ptr<name_tree::Entry> entry)
+NameTree::eraseEntryIfEmpty(shared_ptr<Entry> entry)
 {
-  BOOST_ASSERT(static_cast<bool>(entry));
+  BOOST_ASSERT(entry != nullptr);
 
   NFD_LOG_TRACE("eraseEntryIfEmpty " << entry->getPrefix());
 
   // first check if this Entry can be erased
-  if (entry->isEmpty())
-    {
-      // update child-related info in the parent
-      shared_ptr<name_tree::Entry> parent = entry->getParent();
+  if (entry->isEmpty()) {
+    // update child-related info in the parent
+    shared_ptr<Entry> parent = entry->getParent();
 
-      if (static_cast<bool>(parent))
-        {
-          std::vector<shared_ptr<name_tree::Entry> >& parentChildrenList =
-            parent->getChildren();
+    if (parent != nullptr) {
+      std::vector<shared_ptr<Entry>>& parentChildrenList = parent->getChildren();
 
-          bool isFound = false;
-          size_t size = parentChildrenList.size();
-          for (size_t i = 0; i < size; i++)
-            {
-              if (parentChildrenList[i] == entry)
-                {
-                  parentChildrenList[i] = parentChildrenList[size - 1];
-                  parentChildrenList.pop_back();
-                  isFound = true;
-                  break;
-                }
-            }
-
-          BOOST_VERIFY(isFound == true);
+      bool isFound = false;
+      size_t size = parentChildrenList.size();
+      for (size_t i = 0; i < size; ++i) {
+        if (parentChildrenList[i] == entry) {
+          parentChildrenList[i] = parentChildrenList[size - 1];
+          parentChildrenList.pop_back();
+          isFound = true;
+          break;
         }
+      }
 
-      // remove this Entry and its Name Tree Node
-      name_tree::Node* node = entry->m_node;
-      name_tree::Node* nodePrev = node->m_prev;
+      BOOST_VERIFY(isFound == true);
+    }
 
-      // configure the previous node
-      if (nodePrev != 0)
-        {
-          // link the previous node to the next node
-          nodePrev->m_next = node->m_next;
-        }
-      else
-        {
-          m_buckets[entry->getHash() % m_nBuckets] = node->m_next;
-        }
+    // remove this Entry and its Name Tree Node
+    Node* node = entry->m_node;
+    Node* nodePrev = node->m_prev;
 
-      // link the previous node with the next node (skip the erased one)
-      if (node->m_next != 0)
-        {
-          node->m_next->m_prev = nodePrev;
-          node->m_next = 0;
-        }
+    // configure the previous node
+    if (nodePrev != nullptr) {
+      // link the previous node to the next node
+      nodePrev->m_next = node->m_next;
+    }
+    else {
+      m_buckets[entry->getHash() % m_nBuckets] = node->m_next;
+    }
 
-      BOOST_ASSERT(node->m_next == 0);
+    // link the previous node with the next node (skip the erased one)
+    if (node->m_next != nullptr) {
+      node->m_next->m_prev = nodePrev;
+      node->m_next = 0;
+    }
 
-      m_nItems--;
-      delete node;
+    BOOST_ASSERT(node->m_next == nullptr);
 
-      if (static_cast<bool>(parent))
-        eraseEntryIfEmpty(parent);
+    --m_nItems;
+    delete node;
 
-      size_t newNBuckets = static_cast<size_t>(m_shrinkFactor *
-                                     static_cast<double>(m_nBuckets));
+    if (parent != nullptr) {
+      eraseEntryIfEmpty(parent);
+    }
 
-      if (newNBuckets >= m_minNBuckets && m_nItems < m_shrinkThreshold)
-        {
-          resize(newNBuckets);
-        }
+    size_t newNBuckets = static_cast<size_t>(m_shrinkFactor * static_cast<double>(m_nBuckets));
 
-      return true;
+    if (newNBuckets >= m_minNBuckets && m_nItems < m_shrinkThreshold) {
+      resize(newNBuckets);
+    }
 
-    } // if this entry is empty
+    return true;
 
-  return false; // if this entry is not empty
+  }
+
+  return false;
 }
 
 // Exact Match
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::findExactMatch(const Name& prefix) const
 {
   NFD_LOG_TRACE("findExactMatch " << prefix);
 
-  size_t hashValue = name_tree::computeHash(prefix);
+  size_t hashValue = computeHash(prefix);
   size_t loc = hashValue % m_nBuckets;
 
-  NFD_LOG_TRACE("Name " << prefix << " hash value = " << hashValue <<
-                "  location = " << loc);
+  NFD_LOG_TRACE("Name " << prefix << " hash value = " << hashValue << "  location = " << loc);
 
-  shared_ptr<name_tree::Entry> entry;
-  name_tree::Node* node = 0;
+  shared_ptr<Entry> entry;
+  Node* node = nullptr;
 
-  for (node = m_buckets[loc]; node != 0; node = node->m_next)
-    {
-      entry = node->m_entry;
-      if (static_cast<bool>(entry))
-        {
-          if (hashValue == entry->getHash() && prefix == entry->getPrefix())
-            {
-              return entry;
-            }
-        } // if entry
-    } // for node
+  for (node = m_buckets[loc]; node != nullptr; node = node->m_next) {
+    entry = node->m_entry;
+    if (entry != nullptr) {
+      if (hashValue == entry->getHash() && prefix == entry->getPrefix()) {
+        return entry;
+      }
+    }
+  }
 
   // if not found, the default value of entry (null pointer) will be returned
   entry.reset();
@@ -394,61 +364,55 @@
 }
 
 // Longest Prefix Match
-shared_ptr<name_tree::Entry>
-NameTree::findLongestPrefixMatch(const Name& prefix, const name_tree::EntrySelector& entrySelector) const
+shared_ptr<Entry>
+NameTree::findLongestPrefixMatch(const Name& prefix, const EntrySelector& entrySelector) const
 {
   NFD_LOG_TRACE("findLongestPrefixMatch " << prefix);
 
-  shared_ptr<name_tree::Entry> entry;
-  std::vector<size_t> hashValueSet = name_tree::computeHashSet(prefix);
+  shared_ptr<Entry> entry;
+  std::vector<size_t> hashValueSet = computeHashSet(prefix);
 
   size_t hashValue = 0;
   size_t loc = 0;
 
-  for (int i = static_cast<int>(prefix.size()); i >= 0; i--)
-    {
-      hashValue = hashValueSet[i];
-      loc = hashValue % m_nBuckets;
+  for (int i = static_cast<int>(prefix.size()); i >= 0; --i) {
+    hashValue = hashValueSet[i];
+    loc = hashValue % m_nBuckets;
 
-      name_tree::Node* node = 0;
-      for (node = m_buckets[loc]; node != 0; node = node->m_next)
-        {
-          entry = node->m_entry;
-          if (static_cast<bool>(entry))
-            {
-              // isPrefixOf() is used to avoid making a copy of the name
-              if (hashValue == entry->getHash() &&
-                  entry->getPrefix().isPrefixOf(prefix) &&
-                  entrySelector(*entry))
-                {
-                  return entry;
-                }
-            } // if entry
-        } // for node
+    Node* node = nullptr;
+    for (node = m_buckets[loc]; node != nullptr; node = node->m_next) {
+      entry = node->m_entry;
+      if (entry != nullptr) {
+        // isPrefixOf() is used to avoid making a copy of the name
+        if (hashValue == entry->getHash() &&
+            entry->getPrefix().isPrefixOf(prefix) &&
+            entrySelector(*entry)) {
+          return entry;
+        }
+      }
     }
+  }
 
-  // if not found, the default value of entry (null pointer) will be returned
-  entry.reset();
-  return entry;
+  return nullptr;
 }
 
-shared_ptr<name_tree::Entry>
-NameTree::findLongestPrefixMatch(shared_ptr<name_tree::Entry> entry,
-                                 const name_tree::EntrySelector& entrySelector) const
+shared_ptr<Entry>
+NameTree::findLongestPrefixMatch(shared_ptr<Entry> entry,
+                                 const EntrySelector& entrySelector) const
 {
-  while (static_cast<bool>(entry))
-    {
-      if (entrySelector(*entry))
-        return entry;
-      entry = entry->getParent();
+  while (entry != nullptr) {
+    if (entrySelector(*entry)) {
+      return entry;
     }
-  return shared_ptr<name_tree::Entry>();
+    entry = entry->getParent();
+  }
+  return nullptr;
 }
 
-shared_ptr<name_tree::Entry>
+shared_ptr<Entry>
 NameTree::findLongestPrefixMatch(const pit::Entry& pitEntry) const
 {
-  shared_ptr<name_tree::Entry> nte = this->getEntry(pitEntry);
+  shared_ptr<Entry> nte = this->getEntry(pitEntry);
   BOOST_ASSERT(nte != nullptr);
   if (nte->getPrefix().size() == pitEntry.getName().size()) {
     return nte;
@@ -456,13 +420,13 @@
 
   BOOST_ASSERT(pitEntry.getName().at(-1).isImplicitSha256Digest());
   BOOST_ASSERT(nte->getPrefix() == pitEntry.getName().getPrefix(-1));
-  shared_ptr<name_tree::Entry> exact = this->findExactMatch(pitEntry.getName());
+  shared_ptr<Entry> exact = this->findExactMatch(pitEntry.getName());
   return exact == nullptr ? nte : exact;
 }
 
 boost::iterator_range<NameTree::const_iterator>
 NameTree::findAllMatches(const Name& prefix,
-                         const name_tree::EntrySelector& entrySelector) const
+                         const EntrySelector& entrySelector) const
 {
   NFD_LOG_TRACE("NameTree::findAllMatches" << prefix);
 
@@ -472,9 +436,9 @@
   // For trie-like design, it could be more efficient by walking down the
   // trie from the root node.
 
-  shared_ptr<name_tree::Entry> entry = findLongestPrefixMatch(prefix, entrySelector);
+  shared_ptr<Entry> entry = findLongestPrefixMatch(prefix, entrySelector);
 
-  if (static_cast<bool>(entry)) {
+  if (entry != nullptr) {
     const_iterator begin(FIND_ALL_MATCHES_TYPE, *this, entry, entrySelector);
     return {begin, end()};
   }
@@ -483,14 +447,14 @@
 }
 
 boost::iterator_range<NameTree::const_iterator>
-NameTree::fullEnumerate(const name_tree::EntrySelector& entrySelector) const
+NameTree::fullEnumerate(const EntrySelector& entrySelector) const
 {
   NFD_LOG_TRACE("fullEnumerate");
 
   // find the first eligible entry
-  for (size_t i = 0; i < m_nBuckets; i++) {
-    for (name_tree::Node* node = m_buckets[i]; node != 0; node = node->m_next) {
-      if (static_cast<bool>(node->m_entry) && entrySelector(*node->m_entry)) {
+  for (size_t i = 0; i < m_nBuckets; ++i) {
+    for (Node* node = m_buckets[i]; node != nullptr; node = node->m_next) {
+      if (node->m_entry != nullptr && entrySelector(*node->m_entry)) {
         const_iterator it(FULL_ENUMERATE_TYPE, *this, node->m_entry, entrySelector);
         return {it, end()};
       }
@@ -503,19 +467,19 @@
 
 boost::iterator_range<NameTree::const_iterator>
 NameTree::partialEnumerate(const Name& prefix,
-                           const name_tree::EntrySubTreeSelector& entrySubTreeSelector) const
+                           const EntrySubTreeSelector& entrySubTreeSelector) const
 {
   // the first step is to process the root node
-  shared_ptr<name_tree::Entry> entry = findExactMatch(prefix);
-  if (!static_cast<bool>(entry)) {
+  shared_ptr<Entry> entry = findExactMatch(prefix);
+  if (entry == nullptr) {
     return {end(), end()};
   }
 
-  std::pair<bool, bool>result = entrySubTreeSelector(*entry);
+  std::pair<bool, bool> result = entrySubTreeSelector(*entry);
   const_iterator it(PARTIAL_ENUMERATE_TYPE,
                     *this,
                     entry,
-                    name_tree::AnyEntry(),
+                    AnyEntry(),
                     entrySubTreeSelector);
 
   it.m_shouldVisitChildren = (result.second && entry->hasChildren());
@@ -536,56 +500,45 @@
 {
   NFD_LOG_TRACE("resize");
 
-  name_tree::Node** newBuckets = new name_tree::Node*[newNBuckets];
+  Node** newBuckets = new Node*[newNBuckets];
   size_t count = 0;
 
   // referenced ccnx hashtb.c hashtb_rehash()
-  name_tree::Node** pp = 0;
-  name_tree::Node* p = 0;
-  name_tree::Node* pre = 0;
-  name_tree::Node* q = 0; // record p->m_next
-  size_t i;
-  uint32_t h;
-  uint32_t b;
+  Node** pp = nullptr;
+  Node* p = nullptr;
+  Node* pre = nullptr;
+  Node* q = nullptr; // record p->m_next
 
-  for (i = 0; i < newNBuckets; i++)
-    {
-      newBuckets[i] = 0;
-    }
+  for (size_t i = 0; i < newNBuckets; ++i) {
+    newBuckets[i] = nullptr;
+  }
 
-  for (i = 0; i < m_nBuckets; i++)
-    {
-      for (p = m_buckets[i]; p != 0; p = q)
-        {
-          count++;
-          q = p->m_next;
-          BOOST_ASSERT(static_cast<bool>(p->m_entry));
-          h = p->m_entry->m_hash;
-          b = h % newNBuckets;
-          pre = 0;
-          for (pp = &newBuckets[b]; *pp != 0; pp = &((*pp)->m_next))
-            {
-              pre = *pp;
-              continue;
-            }
-          p->m_prev = pre;
-          p->m_next = *pp; // Actually *pp always == 0 in this case
-          *pp = p;
-        }
+  for (size_t i = 0; i < m_nBuckets; ++i) {
+    for (p = m_buckets[i]; p != nullptr; p = q) {
+      ++count;
+      q = p->m_next;
+      BOOST_ASSERT(p->m_entry != nullptr);
+      uint32_t h = p->m_entry->m_hash;
+      uint32_t b = h % newNBuckets;
+      pre = nullptr;
+      for (pp = &newBuckets[b]; *pp != nullptr; pp = &((*pp)->m_next)) {
+        pre = *pp;
+      }
+      p->m_prev = pre;
+      p->m_next = *pp; // Actually *pp always == nullptr in this case
+      *pp = p;
     }
+  }
 
   BOOST_ASSERT(count == m_nItems);
 
-  name_tree::Node** oldBuckets = m_buckets;
+  Node** oldBuckets = m_buckets;
   m_buckets = newBuckets;
-  delete [] oldBuckets;
+  delete[] oldBuckets;
 
   m_nBuckets = newNBuckets;
-
-  m_enlargeThreshold = static_cast<size_t>(m_enlargeLoadFactor *
-                                              static_cast<double>(m_nBuckets));
-  m_shrinkThreshold = static_cast<size_t>(m_shrinkLoadFactor *
-                                              static_cast<double>(m_nBuckets));
+  m_enlargeThreshold = static_cast<size_t>(m_enlargeLoadFactor * static_cast<double>(m_nBuckets));
+  m_shrinkThreshold = static_cast<size_t>(m_shrinkLoadFactor * static_cast<double>(m_nBuckets));
 }
 
 // For debugging
@@ -594,51 +547,41 @@
 {
   NFD_LOG_TRACE("dump()");
 
-  name_tree::Node* node = 0;
-  shared_ptr<name_tree::Entry> entry;
+  Node* node = nullptr;
+  shared_ptr<Entry> entry;
 
-  using std::endl;
+  for (size_t i = 0; i < m_nBuckets; ++i) {
+    for (node = m_buckets[i]; node != nullptr; node = node->m_next) {
+      entry = node->m_entry;
 
-  for (size_t i = 0; i < m_nBuckets; i++)
-    {
-      for (node = m_buckets[i]; node != 0; node = node->m_next)
-        {
-          entry = node->m_entry;
+      // if the Entry exist, dump its information
+      if (entry != nullptr) {
+        output << "Bucket" << i << '\t' << entry->m_prefix.toUri() << '\n';
+        output << "\t\tHash " << entry->m_hash << '\n';
 
-          // if the Entry exist, dump its information
-          if (static_cast<bool>(entry))
-            {
-              output << "Bucket" << i << "\t" << entry->m_prefix.toUri() << endl;
-              output << "\t\tHash " << entry->m_hash << endl;
+        if (entry->m_parent != nullptr) {
+          output << "\t\tparent->" << entry->m_parent->m_prefix.toUri();
+        }
+        else {
+          output << "\t\tROOT";
+        }
+        output << '\n';
 
-              if (static_cast<bool>(entry->m_parent))
-                {
-                  output << "\t\tparent->" << entry->m_parent->m_prefix.toUri();
-                }
-              else
-                {
-                  output << "\t\tROOT";
-                }
-              output << endl;
+        if (!entry->m_children.empty()) {
+          output << "\t\tchildren = " << entry->m_children.size() << '\n';
 
-              if (entry->m_children.size() != 0)
-                {
-                  output << "\t\tchildren = " << entry->m_children.size() << endl;
+          for (size_t j = 0; j < entry->m_children.size(); ++j) {
+            output << "\t\t\tChild " << j << " " << entry->m_children[j]->getPrefix() << '\n';
+          }
+        }
 
-                  for (size_t j = 0; j < entry->m_children.size(); j++)
-                    {
-                      output << "\t\t\tChild " << j << " " <<
-                        entry->m_children[j]->getPrefix() << endl;
-                    }
-                }
+      }
 
-            } // if (static_cast<bool>(entry))
+    }
+  }
 
-        } // for node
-    } // for int i
-
-  output << "Bucket count = " << m_nBuckets << endl;
-  output << "Stored item = " << m_nItems << endl;
+  output << "Bucket count = " << m_nBuckets << '\n';
+  output << "Stored item = " << m_nItems << '\n';
   output << "--------------------------\n";
 }
 
@@ -648,15 +591,15 @@
 }
 
 NameTree::const_iterator::const_iterator(NameTree::IteratorType type,
-                            const NameTree& nameTree,
-                            shared_ptr<name_tree::Entry> entry,
-                            const name_tree::EntrySelector& entrySelector,
-                            const name_tree::EntrySubTreeSelector& entrySubTreeSelector)
+                                         const NameTree& nameTree,
+                                         shared_ptr<Entry> entry,
+                                         const EntrySelector& entrySelector,
+                                         const EntrySubTreeSelector& entrySubTreeSelector)
   : m_nameTree(&nameTree)
   , m_entry(entry)
   , m_subTreeRoot(entry)
-  , m_entrySelector(make_shared<name_tree::EntrySelector>(entrySelector))
-  , m_entrySubTreeSelector(make_shared<name_tree::EntrySubTreeSelector>(entrySubTreeSelector))
+  , m_entrySelector(make_shared<EntrySelector>(entrySelector))
+  , m_entrySubTreeSelector(make_shared<EntrySubTreeSelector>(entrySubTreeSelector))
   , m_type(type)
   , m_shouldVisitChildren(true)
 {
@@ -670,162 +613,137 @@
 
   BOOST_ASSERT(m_entry != m_nameTree->m_end);
 
-  if (m_type == FULL_ENUMERATE_TYPE) // fullEnumerate
-    {
-      // process the entries in the same bucket first
-      while (m_entry->m_node->m_next != 0)
-        {
-          m_entry = m_entry->m_node->m_next->m_entry;
-          if ((*m_entrySelector)(*m_entry))
-            {
-              return *this;
-            }
-        }
-
-      // process other buckets
-
-      for (int newLocation = m_entry->m_hash % m_nameTree->m_nBuckets + 1;
-           newLocation < static_cast<int>(m_nameTree->m_nBuckets);
-           ++newLocation)
-        {
-          // process each bucket
-          name_tree::Node* node = m_nameTree->m_buckets[newLocation];
-          while (node != 0)
-            {
-              m_entry = node->m_entry;
-              if ((*m_entrySelector)(*m_entry))
-                {
-                  return *this;
-                }
-              node = node->m_next;
-            }
-        }
-
-      // Reach the end()
-      m_entry = m_nameTree->m_end;
-      return *this;
+  if (m_type == FULL_ENUMERATE_TYPE) {
+    // process the entries in the same bucket first
+    while (m_entry->m_node->m_next != nullptr) {
+      m_entry = m_entry->m_node->m_next->m_entry;
+      if ((*m_entrySelector)(*m_entry)) {
+        return *this;
+      }
     }
 
-  if (m_type == PARTIAL_ENUMERATE_TYPE) // partialEnumerate
-    {
-      // We use pre-order traversal.
-      // if at the root, it could have already been accepted, or this
-      // iterator was just declared, and root doesn't satisfy the
-      // requirement
-      // The if() section handles this special case
-      // Essentially, we need to check root's fist child, and the rest will
-      // be the same as normal process
-      if (m_entry == m_subTreeRoot)
-        {
-          if (m_shouldVisitChildren)
-            {
-              m_entry = m_entry->getChildren()[0];
-              std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
-              m_shouldVisitChildren = (result.second && m_entry->hasChildren());
-              if(result.first)
-                {
-                  return *this;
-                }
-              else
-                {
-                  // the first child did not meet the requirement
-                  // the rest of the process can just fall through the while loop
-                  // as normal
-                }
-            }
-          else
-            {
-              // no children, should return end();
-              // just fall through
-            }
+    // process other buckets
+
+    for (int newLocation = m_entry->m_hash % m_nameTree->m_nBuckets + 1;
+         newLocation < static_cast<int>(m_nameTree->m_nBuckets);
+         ++newLocation) {
+      // process each bucket
+      Node* node = m_nameTree->m_buckets[newLocation];
+      while (node != nullptr) {
+        m_entry = node->m_entry;
+        if ((*m_entrySelector)(*m_entry)) {
+          return *this;
         }
-
-      // The first thing to do is to visit its child, or go to find its possible
-      // siblings
-      while (m_entry != m_subTreeRoot)
-        {
-          if (m_shouldVisitChildren)
-            {
-              // If this subtree should be visited
-              m_entry = m_entry->getChildren()[0];
-              std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
-              m_shouldVisitChildren = (result.second && m_entry->hasChildren());
-              if (result.first) // if this node is acceptable
-                {
-                  return *this;
-                }
-              else
-                {
-                  // do nothing, as this node is essentially ignored
-                  // send this node to the while loop.
-                }
-            }
-          else
-            {
-              // Should try to find its sibling
-              shared_ptr<name_tree::Entry> parent = m_entry->getParent();
-
-              std::vector<shared_ptr<name_tree::Entry> >& parentChildrenList = parent->getChildren();
-              bool isFound = false;
-              size_t i = 0;
-              for (i = 0; i < parentChildrenList.size(); i++)
-                {
-                  if (parentChildrenList[i] == m_entry)
-                    {
-                      isFound = true;
-                      break;
-                    }
-                }
-
-              BOOST_VERIFY(isFound == true);
-              if (i < parentChildrenList.size() - 1) // m_entry not the last child
-                {
-                  m_entry = parentChildrenList[i + 1];
-                  std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
-                  m_shouldVisitChildren = (result.second && m_entry->hasChildren());
-                  if (result.first) // if this node is acceptable
-                    {
-                      return *this;
-                    }
-                  else
-                    {
-                      // do nothing, as this node is essentially ignored
-                      // send this node to the while loop.
-                    }
-                }
-              else
-                {
-                  // m_entry is the last child, no more sibling, should try to find parent's sibling
-                  m_shouldVisitChildren = false;
-                  m_entry = parent;
-                }
-            }
-        }
-
-      m_entry = m_nameTree->m_end;
-      return *this;
+        node = node->m_next;
+      }
     }
 
-  if (m_type == FIND_ALL_MATCHES_TYPE) // findAllMatches
-    {
-      // Assumption: at the beginning, m_entry was initialized with the first
-      // eligible Name Tree entry (i.e., has a PIT entry that can be satisfied
-      // by the Data packet)
+    // Reach the end()
+    m_entry = m_nameTree->m_end;
+    return *this;
+  }
 
-      while (static_cast<bool>(m_entry->getParent()))
-        {
-          m_entry = m_entry->getParent();
-          if ((*m_entrySelector)(*m_entry))
+  if (m_type == PARTIAL_ENUMERATE_TYPE) {
+    // We use pre-order traversal.
+    // if at the root, it could have already been accepted, or this
+    // iterator was just declared, and root doesn't satisfy the
+    // requirement
+    // The if() section handles this special case
+    // Essentially, we need to check root's fist child, and the rest will
+    // be the same as normal process
+    if (m_entry == m_subTreeRoot) {
+      if (m_shouldVisitChildren) {
+        m_entry = m_entry->getChildren()[0];
+        std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
+        m_shouldVisitChildren = (result.second && m_entry->hasChildren());
+        if (result.first) {
+          return *this;
+        }
+        else {
+          // the first child did not meet the requirement
+          // the rest of the process can just fall through the while loop as normal
+        }
+      }
+      else {
+        // no children, should return end();
+        // just fall through
+      }
+    }
+
+    // The first thing to do is to visit its child, or go to find its possible siblings
+    while (m_entry != m_subTreeRoot) {
+      if (m_shouldVisitChildren) {
+        // If this subtree should be visited
+        m_entry = m_entry->getChildren()[0];
+        std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
+        m_shouldVisitChildren = (result.second && m_entry->hasChildren());
+        if (result.first) { // if this node is acceptable
+          return *this;
+        }
+        else {
+          // do nothing, as this node is essentially ignored
+          // send this node to the while loop.
+        }
+      }
+      else {
+        // Should try to find its sibling
+        shared_ptr<Entry> parent = m_entry->getParent();
+
+        std::vector<shared_ptr<Entry>>& parentChildrenList = parent->getChildren();
+        bool isFound = false;
+        size_t i = 0;
+        for (i = 0; i < parentChildrenList.size(); ++i) {
+          if (parentChildrenList[i] == m_entry) {
+            isFound = true;
+            break;
+          }
+        }
+
+        BOOST_VERIFY(isFound == true);
+        if (i < parentChildrenList.size() - 1) { // m_entry not the last child
+          m_entry = parentChildrenList[i + 1];
+          std::pair<bool, bool> result = ((*m_entrySubTreeSelector)(*m_entry));
+          m_shouldVisitChildren = (result.second && m_entry->hasChildren());
+          if (result.first) { // if this node is acceptable
             return *this;
+          }
+          else {
+            // do nothing, as this node is essentially ignored
+            // send this node to the while loop.
+          }
         }
-
-      // Reach to the end (Root)
-      m_entry = m_nameTree->m_end;
-      return *this;
+        else {
+          // m_entry is the last child, no more sibling, should try to find parent's sibling
+          m_shouldVisitChildren = false;
+          m_entry = parent;
+        }
+      }
     }
 
+    m_entry = m_nameTree->m_end;
+    return *this;
+  }
+
+  if (m_type == FIND_ALL_MATCHES_TYPE) {
+    // Assumption: at the beginning, m_entry was initialized with the first
+    // eligible Name Tree entry (i.e., has a PIT entry that can be satisfied
+    // by the Data packet)
+
+    while (m_entry->getParent() != nullptr) {
+      m_entry = m_entry->getParent();
+      if ((*m_entrySelector)(*m_entry)) {
+        return *this;
+      }
+    }
+
+    // Reach to the end (Root)
+    m_entry = m_nameTree->m_end;
+    return *this;
+  }
+
   BOOST_ASSERT(false); // unknown type
   return *this;
 }
 
+} // namespace name_tree
 } // namespace nfd
diff --git a/daemon/table/name-tree.hpp b/daemon/table/name-tree.hpp
index b047696..460e497 100644
--- a/daemon/table/name-tree.hpp
+++ b/daemon/table/name-tree.hpp
@@ -32,49 +32,46 @@
 namespace nfd {
 namespace name_tree {
 
-/**
- * \brief Compute the hash value of the given name prefix's WIRE FORMAT
+/** \brief Compute the hash value of the given name prefix's WIRE FORMAT
  */
 size_t
 computeHash(const Name& prefix);
 
-/**
- * \brief Incrementally compute hash values
- * \return Return a vector of hash values, starting from the root prefix
+/** \brief Incrementally compute hash values
+ *  \return Return a vector of hash values, starting from the root prefix
  */
 std::vector<size_t>
 computeHashSet(const Name& prefix);
 
-/// a predicate to accept or reject an Entry in find operations
-typedef function<bool (const Entry& entry)> EntrySelector;
-
-/**
- * \brief a predicate to accept or reject an Entry and its children
- * \return .first indicates whether entry should be accepted;
- *         .second indicates whether entry's children should be visited
+/** \brief a predicate to accept or reject an Entry in find operations
  */
-typedef function<std::pair<bool,bool> (const Entry& entry)> EntrySubTreeSelector;
+typedef function<bool(const Entry& entry)> EntrySelector;
 
-struct AnyEntry {
+/** \brief a predicate to accept or reject an Entry and its children
+ *  \return .first indicates whether entry should be accepted;
+ *          .second indicates whether entry's children should be visited
+ */
+typedef function<std::pair<bool,bool>(const Entry& entry)> EntrySubTreeSelector;
+
+struct AnyEntry
+{
   bool
-  operator()(const Entry& entry)
+  operator()(const Entry& entry) const
   {
     return true;
   }
 };
 
-struct AnyEntrySubTree {
+struct AnyEntrySubTree
+{
   std::pair<bool, bool>
-  operator()(const Entry& entry)
+  operator()(const Entry& entry) const
   {
-    return std::make_pair(true, true);
+    return {true, true};
   }
 };
 
-} // namespace name_tree
-
-/**
- * \brief Class Name Tree
+/** \brief shared name-based index for FIB, PIT, Measurements, and StrategyChoice
  */
 class NameTree : noncopyable
 {
@@ -87,16 +84,15 @@
   ~NameTree();
 
 public: // information
-  /**
-   * \brief Get the number of occupied entries in the Name Tree
+  /** \brief Get the number of occupied entries in the Name Tree
    */
   size_t
   size() const;
 
-  /**
-   * \brief Get the number of buckets in the Name Tree (NPHT)
-   * \details The number of buckets is the one that used to create the hash
-   * table, i.e., m_nBuckets.
+  /** \brief Get the number of buckets in the Name Tree (NPHT)
+   *
+   *  The number of buckets is the one that used to create the hash
+   *  table, i.e., m_nBuckets.
    */
   size_t
   getNBuckets() const;
@@ -104,97 +100,91 @@
   /** \return Name Tree Entry on which a table entry is attached
    */
   template<typename ENTRY>
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   getEntry(const ENTRY& tableEntry) const;
 
-  /**
-   * \brief Dump all the information stored in the Name Tree for debugging.
+  /** \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
-   * Entries will be created.
-   * \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.
+  /** \brief Look for the Name Tree Entry that contains this name prefix.
+   *
+   *  Starts from the shortest name prefix, and then increase the
+   *  number of name components by one each time. All non-existing Name Tree
+   *  Entries will be created.
+   *
+   *  \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>
+  shared_ptr<Entry>
   lookup(const Name& prefix);
 
   /** \brief get NameTree entry from FIB entry
    *
    *  This is equivalent to .lookup(fibEntry.getPrefix())
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   lookup(const fib::Entry& fibEntry) const;
 
   /** \brief get NameTree entry from PIT entry
    *
    *  This is equivalent to .lookup(pitEntry.getName()).
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   lookup(const pit::Entry& pitEntry);
 
   /** \brief get NameTree entry from Measurements entry
    *
    *  This is equivalent to .lookup(measurementsEntry.getName())
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   lookup(const measurements::Entry& measurementsEntry) const;
 
   /** \brief get NameTree entry from StrategyChoice entry
    *
    *  This is equivalent to .lookup(strategyChoiceEntry.getName())
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   lookup(const strategy_choice::Entry& strategyChoiceEntry) 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.
+  /** \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);
+  eraseEntryIfEmpty(shared_ptr<Entry> entry);
 
 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
+  /** \brief Exact match lookup for the given name prefix.
+   *  \return nullptr if this prefix is not found; otherwise return the Name Tree Entry address
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<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
-   * by one each time, until an Entry is found.
+  /** \brief Longest prefix matching for the given name
+   *
+   *  Starts from the full name string, reduce the number of name component
+   *  by one each time, until an Entry is found.
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   findLongestPrefixMatch(const Name& prefix,
-                         const name_tree::EntrySelector& entrySelector =
-                         name_tree::AnyEntry()) const;
+                         const EntrySelector& entrySelector = AnyEntry()) const;
 
-  shared_ptr<name_tree::Entry>
-  findLongestPrefixMatch(shared_ptr<name_tree::Entry> entry,
-                         const name_tree::EntrySelector& entrySelector =
-                         name_tree::AnyEntry()) const;
+  shared_ptr<Entry>
+  findLongestPrefixMatch(shared_ptr<Entry> entry,
+                         const EntrySelector& entrySelector = AnyEntry()) const;
 
   /** \brief longest prefix matching for Interest name of the PIT entry
    *
    *  This is equivalent to .findLongestPrefixMatch(pitEntry.getName(), AnyEntry()).
    */
-  shared_ptr<name_tree::Entry>
+  shared_ptr<Entry>
   findLongestPrefixMatch(const pit::Entry& pitEntry) const;
 
   /** \brief Enumerate all the name prefixes that satisfy the prefix and entrySelector
@@ -204,7 +194,7 @@
    *  Example:
    *  \code{.cpp}
    *  auto&& allMatches = nt.findAllMatches(Name("/A/B/C"));
-   *  for (const name_tree::Entry& nte : allMatches) {
+   *  for (const Entry& nte : allMatches) {
    *    ...
    *  }
    *  \endcode
@@ -213,7 +203,7 @@
    */
   boost::iterator_range<const_iterator>
   findAllMatches(const Name& prefix,
-                 const name_tree::EntrySelector& entrySelector = name_tree::AnyEntry()) const;
+                 const EntrySelector& entrySelector = AnyEntry()) const;
 
 public: // enumeration
   /** \brief Enumerate all entries, optionally filtered by an EntrySelector.
@@ -223,7 +213,7 @@
    *  Example:
    *  \code{.cpp}
    *  auto&& enumerable = nt.fullEnumerate();
-   *  for (const name_tree::Entry& nte : enumerable) {
+   *  for (const Entry& nte : enumerable) {
    *    ...
    *  }
    *  \endcode
@@ -231,7 +221,7 @@
    *  \note The returned iterator may get invalidated when NameTree is modified
    */
   boost::iterator_range<const_iterator>
-  fullEnumerate(const name_tree::EntrySelector& entrySelector = name_tree::AnyEntry()) const;
+  fullEnumerate(const EntrySelector& entrySelector = AnyEntry()) const;
 
   /** \brief Enumerate all entries under a prefix, optionally filtered by an EntrySubTreeSelector.
    *  \return an unspecified type that have .begin() and .end() methods
@@ -240,7 +230,7 @@
    *  Example:
    *  \code{.cpp}
    *  auto&& enumerable = nt.partialEnumerate(Name("/A/B/C"));
-   *  for (const name_tree::Entry& nte : enumerable) {
+   *  for (const Entry& nte : enumerable) {
    *    ...
    *  }
    *  \endcode
@@ -249,8 +239,7 @@
    */
   boost::iterator_range<const_iterator>
   partialEnumerate(const Name& prefix,
-                   const name_tree::EntrySubTreeSelector& entrySubTreeSelector =
-                         name_tree::AnyEntrySubTree()) const;
+                   const EntrySubTreeSelector& entrySubTreeSelector = AnyEntrySubTree()) const;
 
   /** \brief Get an iterator pointing to the first NameTree entry
    *  \note Iteration order is implementation-specific and is undefined
@@ -272,7 +261,7 @@
     FIND_ALL_MATCHES_TYPE
   };
 
-  class const_iterator : public std::iterator<std::forward_iterator_tag, const name_tree::Entry>
+  class const_iterator : public std::iterator<std::forward_iterator_tag, const Entry>
   {
   public:
     friend class NameTree;
@@ -280,17 +269,15 @@
     const_iterator();
 
     const_iterator(NameTree::IteratorType type,
-      const NameTree& nameTree,
-      shared_ptr<name_tree::Entry> entry,
-      const name_tree::EntrySelector& entrySelector = name_tree::AnyEntry(),
-      const name_tree::EntrySubTreeSelector& entrySubTreeSelector = name_tree::AnyEntrySubTree());
+                   const NameTree& nameTree,
+                   shared_ptr<Entry> entry,
+                   const EntrySelector& entrySelector = AnyEntry(),
+                   const EntrySubTreeSelector& entrySubTreeSelector = AnyEntrySubTree());
 
-    ~const_iterator();
-
-    const name_tree::Entry&
+    const Entry&
     operator*() const;
 
-    shared_ptr<name_tree::Entry>
+    shared_ptr<Entry>
     operator->() const;
 
     const_iterator
@@ -306,56 +293,53 @@
     operator!=(const const_iterator& other) const;
 
   private:
-    const NameTree*                             m_nameTree;
-    shared_ptr<name_tree::Entry>                m_entry;
-    shared_ptr<name_tree::Entry>                m_subTreeRoot;
-    shared_ptr<name_tree::EntrySelector>        m_entrySelector;
-    shared_ptr<name_tree::EntrySubTreeSelector> m_entrySubTreeSelector;
-    NameTree::IteratorType                      m_type;
-    bool                                        m_shouldVisitChildren;
+    const NameTree* m_nameTree;
+    shared_ptr<Entry> m_entry;
+    shared_ptr<Entry> m_subTreeRoot;
+    shared_ptr<EntrySelector> m_entrySelector;
+    shared_ptr<EntrySubTreeSelector> m_entrySubTreeSelector;
+    NameTree::IteratorType m_type;
+    bool m_shouldVisitChildren;
   };
 
 private:
-  /**
-   * \brief Create a Name Tree Entry if it does not exist, or return the existing
-   * Name Tree Entry address.
-   * \details Called by lookup() only.
-   * \return The first item is the Name Tree Entry address, the second item is
-   * a bool value indicates whether this is an old entry (false) or a new
-   * entry (true).
+  /** \brief Create a Name Tree Entry if it does not exist, or return the existing
+   *         Name Tree Entry address.
+   *
+   *  Called by lookup() only.
+   *
+   *  \return The first item is the Name Tree Entry address, the second item is
+   *          a bool value indicates whether this is an old entry (false) or a new
+   *          entry (true).
    */
-  std::pair<shared_ptr<name_tree::Entry>, bool>
+  std::pair<shared_ptr<Entry>, bool>
   insert(const Name& prefix);
 
-  /**
-   * \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 Resize the hash table size when its load factor reaches a threshold.
+   *
+   *  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
-  double                        m_enlargeLoadFactor;
-  size_t                        m_enlargeThreshold;
-  int                           m_enlargeFactor;
-  double                        m_shrinkLoadFactor;
-  size_t                        m_shrinkThreshold;
-  double                        m_shrinkFactor;
-  name_tree::Node**             m_buckets; // Name Tree Buckets in the NPHT
-  shared_ptr<name_tree::Entry>  m_end;
-  const_iterator                m_endIterator;
+  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
+  double m_enlargeLoadFactor;
+  size_t m_enlargeThreshold;
+  int m_enlargeFactor;
+  double m_shrinkLoadFactor;
+  size_t m_shrinkThreshold;
+  double m_shrinkFactor;
+  Node** m_buckets; ///< Name Tree Buckets in the NPHT
+  shared_ptr<Entry> m_end;
+  const_iterator m_endIterator;
 };
 
-inline NameTree::const_iterator::~const_iterator()
-{
-}
-
 inline size_t
 NameTree::size() const
 {
@@ -369,7 +353,7 @@
 }
 
 template<typename ENTRY>
-inline shared_ptr<name_tree::Entry>
+inline shared_ptr<Entry>
 NameTree::getEntry(const ENTRY& tableEntry) const
 {
   return tableEntry.m_nameTreeEntry.lock();
@@ -387,13 +371,13 @@
   return m_endIterator;
 }
 
-inline const name_tree::Entry&
+inline const Entry&
 NameTree::const_iterator::operator*() const
 {
   return *m_entry;
 }
 
-inline shared_ptr<name_tree::Entry>
+inline shared_ptr<Entry>
 NameTree::const_iterator::operator->() const
 {
   return m_entry;
@@ -419,6 +403,10 @@
   return m_entry != other.m_entry;
 }
 
+} // namespace name_tree
+
+using name_tree::NameTree;
+
 } // namespace nfd
 
 #endif // NFD_DAEMON_TABLE_NAME_TREE_HPP
diff --git a/daemon/table/pit-entry.hpp b/daemon/table/pit-entry.hpp
index 282d1df..5f77a4d 100644
--- a/daemon/table/pit-entry.hpp
+++ b/daemon/table/pit-entry.hpp
@@ -32,11 +32,11 @@
 
 namespace nfd {
 
-class NameTree;
-
 namespace name_tree {
+class NameTree;
 class Entry;
 } // namespace name_tree
+using name_tree::NameTree;
 
 namespace pit {
 
diff --git a/daemon/table/strategy-choice-entry.hpp b/daemon/table/strategy-choice-entry.hpp
index 9261039..e02a5ab 100644
--- a/daemon/table/strategy-choice-entry.hpp
+++ b/daemon/table/strategy-choice-entry.hpp
@@ -30,13 +30,14 @@
 
 namespace nfd {
 
-class NameTree;
-namespace name_tree {
-class Entry;
-} // namespace name_tree
 namespace fw {
 class Strategy;
 } // namespace fw
+namespace name_tree {
+class NameTree;
+class Entry;
+} // namespace name_tree
+using name_tree::NameTree;
 
 namespace strategy_choice {
 
diff --git a/tests/daemon/table/name-tree.t.cpp b/tests/daemon/table/name-tree.t.cpp
index a79e2d5..394f4d1 100644
--- a/tests/daemon/table/name-tree.t.cpp
+++ b/tests/daemon/table/name-tree.t.cpp
@@ -24,61 +24,62 @@
  */
 
 #include "table/name-tree.hpp"
-#include <unordered_set>
 
 #include "tests/test-common.hpp"
 
 namespace nfd {
+namespace name_tree {
 namespace tests {
 
-using name_tree::Entry;
+using namespace nfd::tests;
 
-BOOST_FIXTURE_TEST_SUITE(TableNameTree, BaseFixture)
+BOOST_AUTO_TEST_SUITE(Table)
+BOOST_FIXTURE_TEST_SUITE(TestNameTree, BaseFixture)
 
 BOOST_AUTO_TEST_CASE(Hash)
 {
   Name root("/");
   root.wireEncode();
-  size_t hashValue = name_tree::computeHash(root);
-  BOOST_CHECK_EQUAL(hashValue, static_cast<size_t>(0));
+  size_t hashValue = computeHash(root);
+  BOOST_CHECK_EQUAL(hashValue, 0);
 
   Name prefix("/nohello/world/ndn/research");
   prefix.wireEncode();
-  std::vector<size_t> hashSet = name_tree::computeHashSet(prefix);
+  std::vector<size_t> hashSet = computeHashSet(prefix);
   BOOST_CHECK_EQUAL(hashSet.size(), prefix.size() + 1);
 }
 
-BOOST_AUTO_TEST_CASE(Entry)
+BOOST_AUTO_TEST_CASE(NameTreeEntry)
 {
   Name prefix("ndn:/named-data/research/abc/def/ghi");
 
-  shared_ptr<name_tree::Entry> npe = make_shared<name_tree::Entry>(prefix);
+  auto npe = make_shared<Entry>(prefix);
   BOOST_CHECK_EQUAL(npe->getPrefix(), prefix);
 
   // examine all the get methods
 
   size_t hash = npe->getHash();
-  BOOST_CHECK_EQUAL(hash, static_cast<size_t>(0));
+  BOOST_CHECK_EQUAL(hash, 0);
 
-  shared_ptr<name_tree::Entry> parent = npe->getParent();
-  BOOST_CHECK(!static_cast<bool>(parent));
+  shared_ptr<Entry> parent = npe->getParent();
+  BOOST_CHECK(parent == nullptr);
 
-  std::vector<shared_ptr<name_tree::Entry> >& childList = npe->getChildren();
-  BOOST_CHECK_EQUAL(childList.size(), static_cast<size_t>(0));
+  std::vector<shared_ptr<Entry>>& childList = npe->getChildren();
+  BOOST_CHECK_EQUAL(childList.size(), 0);
 
   fib::Entry* fib = npe->getFibEntry();
   BOOST_CHECK(fib == nullptr);
 
-  const std::vector< shared_ptr<pit::Entry> >& pitList = npe->getPitEntries();
-  BOOST_CHECK_EQUAL(pitList.size(), static_cast<size_t>(0));
+  const std::vector<shared_ptr<pit::Entry>>& pitList = npe->getPitEntries();
+  BOOST_CHECK_EQUAL(pitList.size(), 0);
 
   // examine all the set method
 
-  npe->setHash(static_cast<size_t>(12345));
-  BOOST_CHECK_EQUAL(npe->getHash(), static_cast<size_t>(12345));
+  npe->setHash(12345);
+  BOOST_CHECK_EQUAL(npe->getHash(), 12345);
 
   Name parentName("ndn:/named-data/research/abc/def");
-  parent = make_shared<name_tree::Entry>(parentName);
+  parent = make_shared<Entry>(parentName);
   npe->setParent(parent);
   BOOST_CHECK_EQUAL(npe->getParent(), parent);
 
@@ -93,8 +94,8 @@
 
   // Insert a PIT
 
-  shared_ptr<pit::Entry> pitEntry(make_shared<pit::Entry>(*makeInterest(prefix)));
-  shared_ptr<pit::Entry> pitEntry2(make_shared<pit::Entry>(*makeInterest(parentName)));
+  auto pitEntry = make_shared<pit::Entry>(*makeInterest(prefix));
+  auto pitEntry2 = make_shared<pit::Entry>(*makeInterest(parentName));
 
   npe->insertPitEntry(pitEntry);
   BOOST_CHECK_EQUAL(npe->getPitEntries().size(), 1);
@@ -118,19 +119,19 @@
   BOOST_CHECK_EQUAL(nt.getNBuckets(), nBuckets);
 
   Name nameABC("ndn:/a/b/c");
-  shared_ptr<name_tree::Entry> npeABC = nt.lookup(nameABC);
+  shared_ptr<Entry> npeABC = nt.lookup(nameABC);
   BOOST_CHECK_EQUAL(nt.size(), 4);
 
   Name nameABD("/a/b/d");
-  shared_ptr<name_tree::Entry> npeABD = nt.lookup(nameABD);
+  shared_ptr<Entry> npeABD = nt.lookup(nameABD);
   BOOST_CHECK_EQUAL(nt.size(), 5);
 
   Name nameAE("/a/e/");
-  shared_ptr<name_tree::Entry> npeAE = nt.lookup(nameAE);
+  shared_ptr<Entry> npeAE = nt.lookup(nameAE);
   BOOST_CHECK_EQUAL(nt.size(), 6);
 
   Name nameF("/f");
-  shared_ptr<name_tree::Entry> npeF = nt.lookup(nameF);
+  shared_ptr<Entry> npeF = nt.lookup(nameF);
   BOOST_CHECK_EQUAL(nt.size(), 7);
 
   // validate lookup() and findExactMatch()
@@ -147,12 +148,12 @@
   BOOST_CHECK_EQUAL(nt.size(), 7);
 
   Name name0("/does/not/exist");
-  shared_ptr<name_tree::Entry> npe0 = nt.findExactMatch(name0);
-  BOOST_CHECK(!static_cast<bool>(npe0));
+  shared_ptr<Entry> npe0 = nt.findExactMatch(name0);
+  BOOST_CHECK(npe0 == nullptr);
 
 
   // Longest Prefix Matching
-  shared_ptr<name_tree::Entry> temp;
+  shared_ptr<Entry> temp;
   Name nameABCLPM("/a/b/c/def/asdf/nlf");
   temp = nt.findLongestPrefixMatch(nameABCLPM);
   BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameABC));
@@ -183,19 +184,17 @@
 
   bool eraseResult = false;
   temp = nt.findExactMatch(nameABC);
-  if (static_cast<bool>(temp))
-    eraseResult = nt.
-  eraseEntryIfEmpty(temp);
+  if (temp != nullptr)
+    eraseResult = nt.eraseEntryIfEmpty(temp);
   BOOST_CHECK_EQUAL(nt.size(), 6);
-  BOOST_CHECK(!static_cast<bool>(nt.findExactMatch(nameABC)));
+  BOOST_CHECK(nt.findExactMatch(nameABC) == nullptr);
   BOOST_CHECK_EQUAL(eraseResult, true);
 
   eraseResult = false;
   temp = nt.findExactMatch(nameABCLPM);
-  if (static_cast<bool>(temp))
-    eraseResult = nt.
-  eraseEntryIfEmpty(temp);
-  BOOST_CHECK(!static_cast<bool>(temp));
+  if (temp != nullptr)
+    eraseResult = nt.eraseEntryIfEmpty(temp);
+  BOOST_CHECK(temp == nullptr);
   BOOST_CHECK_EQUAL(nt.size(), 6);
   BOOST_CHECK_EQUAL(eraseResult, false);
 
@@ -206,12 +205,11 @@
 
   eraseResult = false;
   temp = nt.findExactMatch(nameABC);
-  if (static_cast<bool>(temp))
-    eraseResult = nt.
-  eraseEntryIfEmpty(temp);
+  if (temp != nullptr)
+    eraseResult = nt.eraseEntryIfEmpty(temp);
   BOOST_CHECK_EQUAL(nt.size(), 6);
   BOOST_CHECK_EQUAL(eraseResult, true);
-  BOOST_CHECK(!static_cast<bool>(nt.findExactMatch(nameABC)));
+  BOOST_CHECK(nt.findExactMatch(nameABC) == nullptr);
 
   BOOST_CHECK_EQUAL(nt.getNBuckets(), 16);
 
@@ -226,16 +224,14 @@
   // try to erase /a/b/c, should return false
   temp = nt.findExactMatch(nameABC);
   BOOST_CHECK_EQUAL(temp->getPrefix(), nameABC);
-  eraseResult = nt.
-  eraseEntryIfEmpty(temp);
+  eraseResult = nt.eraseEntryIfEmpty(temp);
   BOOST_CHECK_EQUAL(eraseResult, false);
   temp = nt.findExactMatch(nameABC);
   BOOST_CHECK_EQUAL(temp->getPrefix(), nameABC);
 
   temp = nt.findExactMatch(nameABD);
-  if (static_cast<bool>(temp))
-    nt.
-  eraseEntryIfEmpty(temp);
+  if (temp != nullptr)
+    nt.eraseEntryIfEmpty(temp);
   BOOST_CHECK_EQUAL(nt.size(), 8);
 }
 
@@ -257,7 +253,7 @@
   template<typename Enumerable>
   EnumerationVerifier(Enumerable&& enumerable)
   {
-    for (const name_tree::Entry& entry : enumerable) {
+    for (const Entry& entry : enumerable) {
       const Name& name = entry.getPrefix();
       BOOST_CHECK_MESSAGE(m_names.insert(name).second, "duplicate Name " << name);
     }
@@ -314,6 +310,7 @@
   static const size_t N_BUCKETS = 16;
   NameTree nt;
 };
+
 const size_t EnumerationFixture::N_BUCKETS;
 
 BOOST_FIXTURE_TEST_CASE(IteratorFullEnumerate, EnumerationFixture)
@@ -372,7 +369,7 @@
   this->insertAbAc();
 
   // Accept "root" nameA only
-  auto&& enumerable = nt.partialEnumerate("/a", [] (const name_tree::Entry& entry) {
+  auto&& enumerable = nt.partialEnumerate("/a", [] (const Entry& entry) {
     return std::make_pair(entry.getPrefix() == "/a", true);
   });
 
@@ -386,7 +383,7 @@
   this->insertAbAc();
 
   // Accept anything except "root" nameA
-  auto&& enumerable = nt.partialEnumerate("/a", [] (const name_tree::Entry& entry) {
+  auto&& enumerable = nt.partialEnumerate("/a", [] (const Entry& entry) {
     return std::make_pair(entry.getPrefix() != "/a", true);
   });
 
@@ -402,7 +399,7 @@
 
   // No NameA
   // No SubTree from NameAB
-  auto&& enumerable = nt.partialEnumerate("/a", [] (const name_tree::Entry& entry) {
+  auto&& enumerable = nt.partialEnumerate("/a", [] (const Entry& entry) {
       return std::make_pair(entry.getPrefix() != "/a", entry.getPrefix() != "/a/b");
     });
 
@@ -420,7 +417,7 @@
 
   // No NameA
   // No SubTree from NameAC
-  auto&& enumerable = nt.partialEnumerate("/a", [] (const name_tree::Entry& entry) {
+  auto&& enumerable = nt.partialEnumerate("/a", [] (const Entry& entry) {
       return std::make_pair(entry.getPrefix() != "/a", entry.getPrefix() != "/a/c");
     });
 
@@ -437,7 +434,7 @@
   this->insertAb1Ab2Ac1Ac2();
 
   // No Subtree from NameA
-  auto&& enumerable = nt.partialEnumerate("/a", [] (const name_tree::Entry& entry) {
+  auto&& enumerable = nt.partialEnumerate("/a", [] (const Entry& entry) {
       return std::make_pair(true, entry.getPrefix() != "/a");
     });
 
@@ -465,7 +462,7 @@
   nt.lookup("/F");
 
   auto&& enumerable = nt.partialEnumerate("/A",
-    [] (const name_tree::Entry& entry) -> std::pair<bool, bool> {
+    [] (const Entry& entry) -> std::pair<bool, bool> {
       bool visitEntry = false;
       bool visitChildren = false;
 
@@ -517,7 +514,7 @@
 
   Name prefix("/a/b/c/d/e/f/g/h"); // requires 9 buckets
 
-  shared_ptr<name_tree::Entry> entry = nameTree.lookup(prefix);
+  shared_ptr<Entry> entry = nameTree.lookup(prefix);
   BOOST_CHECK_EQUAL(nameTree.size(), 9);
   BOOST_CHECK_EQUAL(nameTree.getNBuckets(), 32);
 
@@ -583,7 +580,9 @@
   BOOST_CHECK(seenNames.size() == 7);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_SUITE_END() // TestNameTree
+BOOST_AUTO_TEST_SUITE_END() // Table
 
 } // namespace tests
+} // namespace name_tree
 } // namespace nfd
