**breaking** route: consolidate routing tlv into route

refs: #5116

Plus some misc improvements

Change-Id: Id0902fec65160b4368b1b5066f460433aced98ed
diff --git a/src/adjacent.cpp b/src/adjacent.cpp
index 9e85d4a..fae92d5 100644
--- a/src/adjacent.cpp
+++ b/src/adjacent.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,11 +16,11 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "adjacent.hpp"
 #include "logger.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 namespace nlsr {
 
diff --git a/src/adjacent.hpp b/src/adjacent.hpp
index 178ae78..a540a5c 100644
--- a/src/adjacent.hpp
+++ b/src/adjacent.hpp
@@ -1,7 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
  * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California
+ *                           Regents of the University of California,
+ *                           Arizona Board of Regents.
  *
  * This file is part of NLSR (Named-data Link State Routing).
  * See AUTHORS.md for complete list of NLSR authors and contributors.
diff --git a/src/communication/sync-logic-handler.cpp b/src/communication/sync-logic-handler.cpp
index 9dd2659..99bdeac 100644
--- a/src/communication/sync-logic-handler.cpp
+++ b/src/communication/sync-logic-handler.cpp
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "sync-logic-handler.hpp"
 #include "common.hpp"
@@ -28,9 +28,6 @@
 
 namespace nlsr {
 
-const std::string NLSR_COMPONENT = "nlsr";
-const std::string LSA_COMPONENT = "LSA";
-
 INIT_LOGGER(SyncLogicHandler);
 
 SyncLogicHandler::SyncLogicHandler(ndn::Face& face, const IsLsaNew& isLsaNew,
@@ -49,12 +46,11 @@
   m_coorLsaUserPrefix = ndn::Name(m_confParam.getSyncUserPrefix())
                          .append(boost::lexical_cast<std::string>(Lsa::Type::COORDINATE));
 
-  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF ||
-      m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
+  if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_ON) {
     m_syncLogic.addUserNode(m_adjLsaUserPrefix);
   }
-  else if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON ||
-           m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
+
+  if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
     m_syncLogic.addUserNode(m_coorLsaUserPrefix);
   }
 }
@@ -64,8 +60,8 @@
 {
   NLSR_LOG_DEBUG("Update Name: " << updateName << " Seq no: " << highSeq);
 
-  int32_t nlsrPosition = util::getNameComponentPosition(updateName, nlsr::NLSR_COMPONENT);
-  int32_t lsaPosition = util::getNameComponentPosition(updateName, nlsr::LSA_COMPONENT);
+  int32_t nlsrPosition = util::getNameComponentPosition(updateName, NLSR_COMPONENT);
+  int32_t lsaPosition = util::getNameComponentPosition(updateName, LSA_COMPONENT);
 
   if (nlsrPosition < 0 || lsaPosition < 0) {
     NLSR_LOG_WARN("Received malformed sync update");
diff --git a/src/communication/sync-logic-handler.hpp b/src/communication/sync-logic-handler.hpp
index 47f6c9a..7deb06a 100644
--- a/src/communication/sync-logic-handler.hpp
+++ b/src/communication/sync-logic-handler.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_SYNC_LOGIC_HANDLER_HPP
 #define NLSR_SYNC_LOGIC_HANDLER_HPP
@@ -114,8 +114,8 @@
   SyncProtocolAdapter m_syncLogic;
 
 private:
-  static const std::string NLSR_COMPONENT;
-  static const std::string LSA_COMPONENT;
+  const std::string NLSR_COMPONENT = "nlsr";
+  const std::string LSA_COMPONENT = "LSA";
 };
 
 } // namespace nlsr
diff --git a/src/conf-file-processor.hpp b/src/conf-file-processor.hpp
index e33b50b..f7270ba 100644
--- a/src/conf-file-processor.hpp
+++ b/src/conf-file-processor.hpp
@@ -1,7 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2019,  The University of Memphis,
- *                           Regents of the University of California
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
+ *                           Regents of the University of California,
+ *                           Arizona Board of Regents.
  *
  * This file is part of NLSR (Named-data Link State Routing).
  * See AUTHORS.md for complete list of NLSR authors and contributors.
@@ -16,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_CONF_FILE_PROCESSOR_HPP
 #define NLSR_CONF_FILE_PROCESSOR_HPP
@@ -39,12 +40,7 @@
  * set all the parameters in NLSR to the received values. There are
  * defaults for any unconfigured settings.
  *
- * This is currently called by the wrapper class NlsrRunner to
- * populate the NLSR object with its configuration before NLSR is
- * started.
- *
  * \sa nlsr::ConfParameter
- * \sa NlsrRunner::run
  */
 class ConfFileProcessor
 {
diff --git a/src/lsa/adj-lsa.cpp b/src/lsa/adj-lsa.cpp
index e2d0a2b..e7dbf95 100644
--- a/src/lsa/adj-lsa.cpp
+++ b/src/lsa/adj-lsa.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,10 +17,10 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "adj-lsa.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 namespace nlsr {
 
@@ -141,4 +141,4 @@
   return os;
 }
 
-} // namespace nlsr
\ No newline at end of file
+} // namespace nlsr
diff --git a/src/lsa/coordinate-lsa.cpp b/src/lsa/coordinate-lsa.cpp
index a73ab76..b195e39 100644
--- a/src/lsa/coordinate-lsa.cpp
+++ b/src/lsa/coordinate-lsa.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,10 +17,10 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "coordinate-lsa.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 #include <boost/lexical_cast.hpp>
 
@@ -156,4 +156,4 @@
   return os;
 }
 
-} // namespace nlsr
\ No newline at end of file
+} // namespace nlsr
diff --git a/src/lsa/lsa.cpp b/src/lsa/lsa.cpp
index c0d6435..73ddbe7 100644
--- a/src/lsa/lsa.cpp
+++ b/src/lsa/lsa.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,13 +17,13 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "lsa.hpp"
 #include "nlsr.hpp"
 #include "name-prefix-list.hpp"
 #include "adjacent.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 namespace nlsr {
 
diff --git a/src/lsa/name-lsa.cpp b/src/lsa/name-lsa.cpp
index 37b7408..f73014b 100644
--- a/src/lsa/name-lsa.cpp
+++ b/src/lsa/name-lsa.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,10 +17,10 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "name-lsa.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 namespace nlsr {
 
diff --git a/src/lsdb.cpp b/src/lsdb.cpp
index e3fe9d3..9913751 100644
--- a/src/lsdb.cpp
+++ b/src/lsdb.cpp
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "lsdb.hpp"
 
@@ -368,9 +368,9 @@
 void
 Lsdb::writeNameLsdbLog()
 {
-  NLSR_LOG_DEBUG("---------------Name LSDB-------------------");
+  NLSR_LOG_TRACE("---------------Name LSDB-------------------");
   for (const auto& nlsa : m_nameLsdb) {
-    NLSR_LOG_DEBUG(nlsa);
+    NLSR_LOG_TRACE(nlsa);
   }
 }
 
@@ -1247,9 +1247,9 @@
     return;
   }
 
-  NLSR_LOG_DEBUG("---------------Adj LSDB-------------------");
+  NLSR_LOG_TRACE("---------------Adj LSDB-------------------");
   for (const auto& adj : m_adjLsdb) {
-    NLSR_LOG_DEBUG(adj);
+    NLSR_LOG_TRACE(adj);
   }
 }
 
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index 73a1ac5..b2c6118 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -42,16 +42,14 @@
 Nlsr::Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam)
   : m_face(face)
   , m_scheduler(face.getIoService())
-  , m_keyChain(keyChain)
   , m_confParam(confParam)
   , m_adjacencyList(confParam.getAdjacencyList())
   , m_namePrefixList(confParam.getNamePrefixList())
-  , m_validator(m_confParam.getValidator())
-  , m_fib(m_face, m_scheduler, m_adjacencyList, m_confParam, m_keyChain)
+  , m_fib(m_face, m_scheduler, m_adjacencyList, m_confParam, keyChain)
   , m_routingTable(m_scheduler, m_fib, m_lsdb, m_namePrefixTable, m_confParam)
   , m_namePrefixTable(m_fib, m_routingTable, m_routingTable.afterRoutingChange)
-  , m_lsdb(m_face, m_keyChain, m_confParam, m_namePrefixTable, m_routingTable)
-  , m_helloProtocol(m_face, m_keyChain, confParam, m_routingTable, m_lsdb)
+  , m_lsdb(m_face, keyChain, m_confParam, m_namePrefixTable, m_routingTable)
+  , m_helloProtocol(m_face, keyChain, confParam, m_routingTable, m_lsdb)
   , m_onNewLsaConnection(m_lsdb.getSync().onNewLsa->connect(
       [this] (const ndn::Name& updateName, uint64_t sequenceNumber,
               const ndn::Name& originRouter) {
@@ -69,10 +67,10 @@
                                ndn::time::milliseconds::max(), ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
         }
       }))
-  , m_dispatcher(m_face, m_keyChain)
+  , m_dispatcher(m_face, keyChain)
   , m_datasetHandler(m_dispatcher, m_lsdb, m_routingTable)
-  , m_controller(m_face, m_keyChain)
-  , m_faceDatasetController(m_face, m_keyChain)
+  , m_controller(m_face, keyChain)
+  , m_faceDatasetController(m_face, keyChain)
   , m_prefixUpdateProcessor(m_dispatcher,
       m_confParam.getPrefixUpdateValidator(),
       m_namePrefixList,
diff --git a/src/nlsr.hpp b/src/nlsr.hpp
index 02e3625..9d7f032 100644
--- a/src/nlsr.hpp
+++ b/src/nlsr.hpp
@@ -61,8 +61,6 @@
 
 namespace nlsr {
 
-static ndn::Name DEFAULT_BROADCAST_PREFIX("/ndn/broadcast");
-
 class Nlsr
 {
 public:
@@ -208,12 +206,9 @@
 private:
   ndn::Face& m_face;
   ndn::Scheduler m_scheduler;
-  ndn::security::KeyChain& m_keyChain;
   ConfParameter& m_confParam;
   AdjacencyList& m_adjacencyList;
   NamePrefixList& m_namePrefixList;
-  bool m_isDaemonProcess;
-  ndn::security::ValidatorConfig& m_validator;
   std::vector<ndn::Name> m_strategySetOnRouters;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
@@ -248,8 +243,6 @@
 
 private:
   ndn::nfd::FaceMonitor m_faceMonitor;
-
-  friend class NlsrRunner;
 };
 
 } // namespace nlsr
diff --git a/src/publisher/dataset-interest-handler.cpp b/src/publisher/dataset-interest-handler.cpp
index a574622..24c6e1a 100644
--- a/src/publisher/dataset-interest-handler.cpp
+++ b/src/publisher/dataset-interest-handler.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "dataset-interest-handler.hpp"
 #include "nlsr.hpp"
@@ -40,8 +40,7 @@
                                                const RoutingTable& rt)
   : m_dispatcher(dispatcher)
   , m_lsdb(lsdb)
-  , m_routingTableEntries(rt.getRoutingTableEntry())
-  , m_dryRoutingTableEntries(rt.getDryRoutingTableEntry())
+  , m_routingTable(rt)
 {
   setDispatcher(m_dispatcher);
 }
@@ -93,51 +92,12 @@
   context.end();
 }
 
-
-std::vector<tlv::RoutingTable>
-DatasetInterestHandler::getTlvRTEntries()
-{
-  std::vector<tlv::RoutingTable> rtable;
-  for (const auto& rte : m_routingTableEntries) {
-    tlv::RoutingTable tlvRoutingTable;
-    std::shared_ptr<tlv::Destination> tlvDes = tlv::makeDes(rte);
-    tlvRoutingTable.setDestination(*tlvDes);
-    for (const auto& nh : rte.getNexthopList().getNextHops()) {
-      tlv::NextHop tlvNexthop;
-      tlvNexthop.setUri(nh.getConnectingFaceUri());
-      tlvNexthop.setCost(nh.getRouteCost());
-      tlvRoutingTable.addNexthops(tlvNexthop);
-    }
-    rtable.push_back(tlvRoutingTable);
-  }
-  if (!m_dryRoutingTableEntries.empty()) {
-    for (const auto& dryRte : m_dryRoutingTableEntries) {
-      tlv::RoutingTable tlvRoutingTable;
-      std::shared_ptr<tlv::Destination> tlvDes = tlv::makeDes(dryRte);
-      tlvRoutingTable.setDestination(*tlvDes);
-      for (const auto& nh : dryRte.getNexthopList().getNextHops()) {
-        tlv::NextHop tlvNexthop;
-        tlvNexthop.setUri(nh.getConnectingFaceUri());
-        tlvNexthop.setCost(nh.getRouteCost());
-        tlvRoutingTable.addNexthops(tlvNexthop);
-      }
-      rtable.push_back(tlvRoutingTable);
-    }
-  }
-  return rtable;
-}
-
 void
 DatasetInterestHandler::publishRtStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
                                         ndn::mgmt::StatusDatasetContext& context)
 {
-  NLSR_LOG_DEBUG("Received interest:  " << interest);
-  tlv::RoutingTableStatus rtStatus;
-  for (const tlv::RoutingTable& rt : getTlvRTEntries()) {
-    rtStatus.addRoutingTable(rt);
-  }
-  const ndn::Block& wire = rtStatus.wireEncode();
-  context.append(wire);
+  NLSR_LOG_DEBUG("Received interest: " << interest);
+  context.append(m_routingTable.wireEncode());
   context.end();
 }
 
diff --git a/src/publisher/dataset-interest-handler.hpp b/src/publisher/dataset-interest-handler.hpp
index 28a6c4c..b39ac25 100644
--- a/src/publisher/dataset-interest-handler.hpp
+++ b/src/publisher/dataset-interest-handler.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
  /*! \file dataset-interest-handler.hpp
 
@@ -37,9 +37,6 @@
 #include "lsdb.hpp"
 #include "logger.hpp"
 
-#include "tlv/routing-table-status.hpp"
-#include "tlv/routing-table-entry.hpp"
-
 #include <ndn-cxx/mgmt/dispatcher.hpp>
 #include <ndn-cxx/face.hpp>
 #include <boost/noncopyable.hpp>
@@ -79,11 +76,6 @@
   void
   setDispatcher(ndn::mgmt::Dispatcher& dispatcher);
 
-  /*! \brief generate a TLV-format of routing table entry
-   */
-  std::vector<tlv::RoutingTable>
-  getTlvRTEntries();
-
   /*! \brief provide routing-table dataset
   */
   void
@@ -111,9 +103,7 @@
 private:
   ndn::mgmt::Dispatcher& m_dispatcher;
   const Lsdb& m_lsdb;
-
-  const std::list<RoutingTableEntry>& m_routingTableEntries;
-  const std::list<RoutingTableEntry>& m_dryRoutingTableEntries;
+  const RoutingTable& m_routingTable;
 };
 
 } // namespace nlsr
diff --git a/src/route/fib-entry.cpp b/src/route/fib-entry.cpp
index 0091245..bc11634 100644
--- a/src/route/fib-entry.cpp
+++ b/src/route/fib-entry.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "fib-entry.hpp"
 #include "logger.hpp"
@@ -30,7 +30,7 @@
 {
   NLSR_LOG_DEBUG("Name Prefix: " << m_name);
   NLSR_LOG_DEBUG("Seq No: " << m_seqNo);
-  m_nexthopList.writeLog();
+  NLSR_LOG_DEBUG(m_nexthopList);
 }
 
 } // namespace nlsr
diff --git a/src/route/fib.hpp b/src/route/fib.hpp
index 3e4ef68..27891eb 100644
--- a/src/route/fib.hpp
+++ b/src/route/fib.hpp
@@ -87,9 +87,6 @@
    * strictly necessary, because eventually those prefix registrations
    * will expire, but cleaning up after ourselves improves
    * performance.
-   *
-   * \sa NlsrRunner::run
-   *
    */
   void
   clean();
@@ -212,8 +209,6 @@
    * an entry is removed. Typically this happens when NLSR is
    * terminated or crashes, and we don't want the scheduler to crash
    * because it's referencing memory that has no valid function.
-   *
-   * \sa NlsrRunner::run
    */
   void
   cancelEntryRefresh(const FibEntry& entry);
diff --git a/src/route/map-entry.hpp b/src/route/map-entry.hpp
deleted file mode 100644
index e4c998c..0000000
--- a/src/route/map-entry.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  The University of Memphis,
- *                           Regents of the University of California
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- **/
-
-#ifndef NLSR_MAP_ENTRY_HPP
-#define NLSR_MAP_ENTRY_HPP
-
-#include <boost/cstdint.hpp>
-#include <ndn-cxx/name.hpp>
-
-namespace nlsr {
-
-class MapEntry
-{
-public:
-  MapEntry()
-    : m_router()
-    , m_mappingNumber(-1)
-  {
-  }
-
-  ~MapEntry()
-  {
-  }
-
-  MapEntry(const ndn::Name& rtr, int32_t mn)
-  {
-    m_router = rtr;
-    m_mappingNumber = mn;
-  }
-
-  const ndn::Name&
-  getRouter() const
-  {
-    return m_router;
-  }
-
-  int32_t
-  getMappingNumber() const
-  {
-    return m_mappingNumber;
-  }
-
-  void
-  reset();
-
-private:
-  ndn::Name m_router;
-  int32_t m_mappingNumber;
-};
-
-} // namespace nlsr
-
-#endif // NLSR_MAP_ENTRY_HPP
diff --git a/src/route/map.cpp b/src/route/map.cpp
index 3f6513c..0aab84f 100644
--- a/src/route/map.cpp
+++ b/src/route/map.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "map.hpp"
 #include "nlsr.hpp"
@@ -32,7 +32,7 @@
 void
 Map::addEntry(const ndn::Name& rtrName)
 {
-  MapEntry me(rtrName, m_mappingIndex);
+  MapEntry me {rtrName, m_mappingIndex};
   if (addEntry(me)) {
     m_mappingIndex++;
   }
@@ -48,43 +48,25 @@
 Map::getRouterNameByMappingNo(int32_t mn) const
 {
   auto&& mappingNumberView = m_entries.get<detail::byMappingNumber>();
-  auto iterator = mappingNumberView.find(mn);
-  if (iterator == mappingNumberView.end()) {
-    return {};
-  }
-  else {
-    return {iterator->getRouter()};
-  }
+  auto it = mappingNumberView.find(mn);
+  return it == mappingNumberView.end() ? ndn::nullopt : ndn::optional<ndn::Name>(it->router);
 }
 
 ndn::optional<int32_t>
 Map::getMappingNoByRouterName(const ndn::Name& rName)
 {
   auto&& routerNameView = m_entries.get<detail::byRouterName>();
-  auto iterator = routerNameView.find(rName);
-  if (iterator == routerNameView.end()) {
-    return {};
-  }
-  else {
-    return {iterator->getMappingNumber()};
-  }
-}
-
-void
-Map::reset()
-{
-  m_entries = detail::entryContainer{};
-  m_mappingIndex = 0;
+  auto it = routerNameView.find(rName);
+  return it == routerNameView.end() ? ndn::nullopt : ndn::optional<int32_t>(it->mappingNumber);
 }
 
 void
 Map::writeLog()
 {
   NLSR_LOG_DEBUG("---------------Map----------------------");
-  auto&& routerNameView = m_entries.get<detail::byRouterName>();
-  for (auto entry = routerNameView.begin(); entry != routerNameView.end(); entry++) {
-    NLSR_LOG_DEBUG("MapEntry: ( Router: " << entry->getRouter() << " Mapping No: "
-               << entry->getMappingNumber() << " )");
+  for (const auto& entry : m_entries.get<detail::byRouterName>()) {
+    NLSR_LOG_DEBUG("MapEntry: ( Router: " << entry.router << " Mapping No: " <<
+                    entry.mappingNumber << " )");
   }
 }
 
diff --git a/src/route/map.hpp b/src/route/map.hpp
index c9511bf..ae92d25 100644
--- a/src/route/map.hpp
+++ b/src/route/map.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,24 +16,25 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_MAP_HPP
 #define NLSR_MAP_HPP
 
 #include "common.hpp"
-#include "map-entry.hpp"
-
-#include <list>
-#include <boost/cstdint.hpp>
 
 #include <boost/multi_index_container.hpp>
 #include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/mem_fun.hpp>
+#include <boost/multi_index/member.hpp>
 #include <boost/multi_index/tag.hpp>
 
 namespace nlsr {
 
+struct MapEntry {
+  ndn::Name router;
+  int32_t mappingNumber = -1;
+};
+
 namespace detail {
 
   using namespace boost::multi_index;
@@ -44,10 +45,10 @@
     MapEntry,
     indexed_by<
       hashed_unique<tag<byRouterName>,
-                    const_mem_fun<MapEntry, const ndn::Name&, &MapEntry::getRouter>,
+                    member<MapEntry, ndn::Name, &MapEntry::router>,
                     std::hash<ndn::Name>>,
       hashed_unique<tag<byMappingNumber>,
-                    const_mem_fun<MapEntry, int32_t, &MapEntry::getMappingNumber>>
+                    member<MapEntry, int32_t, &MapEntry::mappingNumber>>
       >
     >;
 
@@ -107,9 +108,6 @@
   ndn::optional<int32_t>
   getMappingNoByRouterName(const ndn::Name& rName);
 
-  void
-  reset();
-
   size_t
   getMapSize() const
   {
diff --git a/src/route/name-prefix-table-entry.cpp b/src/route/name-prefix-table-entry.cpp
index 9890101..368cc08 100644
--- a/src/route/name-prefix-table-entry.cpp
+++ b/src/route/name-prefix-table-entry.cpp
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "name-prefix-table-entry.hpp"
 
@@ -32,7 +32,7 @@
 void
 NamePrefixTableEntry::generateNhlfromRteList()
 {
-  m_nexthopList.reset();
+  m_nexthopList.clear();
   for (auto iterator = m_rteList.begin(); iterator != m_rteList.end(); ++iterator) {
     for (auto nhItr = (*iterator)->getNexthopList().getNextHops().begin();
          nhItr != (*iterator)->getNexthopList().getNextHops().end();
@@ -76,18 +76,6 @@
   // be updated there.
 }
 
-void
-NamePrefixTableEntry::writeLog()
-{
-  NLSR_LOG_DEBUG("Name: " << m_namePrefix);
-  for (auto it = m_rteList.begin(); it != m_rteList.end(); ++it) {
-    NLSR_LOG_DEBUG("Destination: " << (*it)->getDestination());
-    NLSR_LOG_DEBUG("Nexthops: ");
-    (*it)->getNexthopList().writeLog();
-  }
-  m_nexthopList.writeLog();
-}
-
 bool
 operator==(const NamePrefixTableEntry& lhs, const NamePrefixTableEntry& rhs)
 {
@@ -104,8 +92,10 @@
 operator<<(std::ostream& os, const NamePrefixTableEntry& entry)
 {
   os << "Name: " << entry.getNamePrefix() << "\n";
+
   for (const auto& entryPtr : entry.getRteList()) {
-    os << "Destination: " << entryPtr->getDestination() << "\n";
+    os << "  Destination: " << entryPtr->getDestination() << "\n";
+    os << entryPtr->getNexthopList();
   }
   return os;
 }
diff --git a/src/route/name-prefix-table-entry.hpp b/src/route/name-prefix-table-entry.hpp
index 828d64a..c298e97 100644
--- a/src/route/name-prefix-table-entry.hpp
+++ b/src/route/name-prefix-table-entry.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -17,13 +17,12 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_NAME_PREFIX_TABLE_ENTRY_HPP
 #define NLSR_NAME_PREFIX_TABLE_ENTRY_HPP
 
 #include "routing-table-pool-entry.hpp"
-
 #include "test-access-control.hpp"
 
 #include <list>
@@ -64,7 +63,7 @@
   {
     if (m_rteList.size() > 0) {
       for (auto it = m_rteList.begin(); it != m_rteList.end(); ++it) {
-        (*it)->getNexthopList().reset();
+        (*it)->getNexthopList().clear();
       }
     }
   }
@@ -112,7 +111,6 @@
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   std::list<std::shared_ptr<RoutingTablePoolEntry>> m_rteList;
   NexthopList m_nexthopList;
-
 };
 
 bool
diff --git a/src/route/name-prefix-table.cpp b/src/route/name-prefix-table.cpp
index b38bbea..55f0c54 100644
--- a/src/route/name-prefix-table.cpp
+++ b/src/route/name-prefix-table.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "name-prefix-table.hpp"
 
@@ -228,7 +228,7 @@
     }
     else if (sourceEntry == entries.end()) {
       NLSR_LOG_DEBUG("Routing entry: " << poolEntry->getDestination() << " now has no next-hops.");
-      poolEntry->getNexthopList().reset();
+      poolEntry->getNexthopList().clear();
       for (const auto& nameEntry : poolEntry->namePrefixTableEntries) {
         auto nameEntryFullPtr = nameEntry.second.lock();
         addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination());
diff --git a/src/route/nexthop-list.cpp b/src/route/nexthop-list.cpp
index 8b9366e..7ab1352 100644
--- a/src/route/nexthop-list.cpp
+++ b/src/route/nexthop-list.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -17,17 +17,16 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "nexthop-list.hpp"
 #include "common.hpp"
 #include "nexthop.hpp"
-#include "logger.hpp"
+
+#include <ndn-cxx/util/ostream-joiner.hpp>
 
 namespace nlsr {
 
-INIT_LOGGER(route.NexthopList);
-
 static bool
 nexthopAddCompare(const NextHop& nh1, const NextHop& nh2)
 {
@@ -71,21 +70,16 @@
 std::ostream&
 operator<<(std::ostream& os, const NexthopList& nhl)
 {
-  NexthopList& ucnhl = const_cast<NexthopList&>(nhl);
-  os << "NexthopList(\nNext hops: ";
-  for (auto&& nh : ucnhl.getNextHops()) {
-    os << nh;
-  }
-  os << ")";
+  os << "    ";
+  std::copy(nhl.cbegin(), nhl.cend(), ndn::make_ostream_joiner(os, "\n    "));
   return os;
 }
 
 void
 NexthopList::addNextHop(const NextHop& nh)
 {
-  std::set<NextHop, NextHopComparator>::iterator it = std::find_if(m_nexthopList.begin(),
-                                                 m_nexthopList.end(),
-                                                 std::bind(&nexthopAddCompare, _1, nh));
+  auto it = std::find_if(m_nexthopList.begin(), m_nexthopList.end(),
+                         std::bind(&nexthopAddCompare, _1, nh));
   if (it == m_nexthopList.end()) {
     m_nexthopList.insert(nh);
   }
@@ -98,23 +92,11 @@
 void
 NexthopList::removeNextHop(const NextHop& nh)
 {
-  std::set<NextHop, NextHopComparator>::iterator it = std::find_if(m_nexthopList.begin(),
-                                                 m_nexthopList.end(),
-                                                 std::bind(&nexthopRemoveCompare, _1, nh));
+  auto it = std::find_if(m_nexthopList.begin(), m_nexthopList.end(),
+                         std::bind(&nexthopRemoveCompare, _1, nh));
   if (it != m_nexthopList.end()) {
     m_nexthopList.erase(it);
   }
 }
 
-void
-NexthopList::writeLog() const
-{
-  int i = 1;
-
-  for (const auto& nexthop : m_nexthopList) {
-    NLSR_LOG_DEBUG("Nexthop " << i++ << ": " << nexthop.getConnectingFaceUri() <<
-                   " Route Cost: " << nexthop.getRouteCost());
-  }
-}
-
 } // namespace nlsr
diff --git a/src/route/nexthop-list.hpp b/src/route/nexthop-list.hpp
index e405889..537448e 100644
--- a/src/route/nexthop-list.hpp
+++ b/src/route/nexthop-list.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_NEXTHOP_LIST_HPP
 #define NLSR_NEXTHOP_LIST_HPP
@@ -47,13 +47,7 @@
 class NexthopList
 {
 public:
-  NexthopList()
-  {
-  }
-
-  ~NexthopList()
-  {
-  }
+  NexthopList() = default;
 
   /*! \brief Adds a next hop to the list.
     \param nh The next hop.
@@ -80,7 +74,7 @@
   }
 
   void
-  reset()
+  clear()
   {
     m_nexthopList.clear();
   }
@@ -93,6 +87,7 @@
 
   typedef std::set<NextHop, NextHopComparator>::iterator iterator;
   typedef std::set<NextHop, NextHopComparator>::const_iterator const_iterator;
+  typedef std::set<NextHop, NextHopComparator>::reverse_iterator reverse_iterator;
 
   iterator
   begin()
@@ -118,8 +113,17 @@
     return m_nexthopList.end();
   }
 
-  void
-  writeLog() const;
+  reverse_iterator
+  rbegin() const
+  {
+    return m_nexthopList.rbegin();
+  }
+
+  reverse_iterator
+  rend() const
+  {
+    return m_nexthopList.rend();
+  }
 
 private:
   std::set<NextHop, NextHopComparator> m_nexthopList;
diff --git a/src/route/nexthop.cpp b/src/route/nexthop.cpp
index 14bfb43..11399aa 100644
--- a/src/route/nexthop.cpp
+++ b/src/route/nexthop.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -16,29 +16,91 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- *
- **/
+ */
 
 #include "nexthop.hpp"
+#include "tlv-nlsr.hpp"
+
+#include <ndn-cxx/encoding/block-helpers.hpp>
 
 namespace nlsr {
 
+template<ndn::encoding::Tag TAG>
+size_t
+NextHop::wireEncode(ndn::EncodingImpl<TAG>& block) const
+{
+  size_t totalLength = 0;
+
+  totalLength += ndn::encoding::prependDoubleBlock(block, ndn::tlv::nlsr::CostDouble, m_routeCost);
+  totalLength += ndn::encoding::prependStringBlock(block, ndn::tlv::nlsr::Uri, m_connectingFaceUri);
+
+  totalLength += block.prependVarNumber(totalLength);
+  totalLength += block.prependVarNumber(ndn::tlv::nlsr::NextHop);
+
+  return totalLength;
+}
+
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(NextHop);
+
+const ndn::Block&
+NextHop::wireEncode() const
+{
+  if (m_wire.hasWire()) {
+    return m_wire;
+  }
+
+  ndn::EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  ndn::EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  m_wire = buffer.block();
+
+  return m_wire;
+}
+
+void
+NextHop::wireDecode(const ndn::Block& wire)
+{
+  m_connectingFaceUri = "";
+  m_routeCost = 0;
+
+  m_wire = wire;
+
+  if (m_wire.type() != ndn::tlv::nlsr::NextHop) {
+    std::stringstream error;
+    error << "Expected NextHop Block, but Block is of a different type: #"
+          << m_wire.type();
+    BOOST_THROW_EXCEPTION(Error(error.str()));
+  }
+
+  m_wire.parse();
+
+  ndn::Block::element_const_iterator val = m_wire.elements_begin();
+
+  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Uri) {
+    m_connectingFaceUri.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
+    ++val;
+  }
+  else {
+    BOOST_THROW_EXCEPTION(Error("Missing required Uri field"));
+  }
+
+  m_routeCost = ndn::encoding::readDouble(*val);
+}
+
 bool
 operator==(const NextHop& lhs, const NextHop& rhs)
 {
-  return ((lhs.getRouteCostAsAdjustedInteger() == rhs.getRouteCostAsAdjustedInteger())
-          &&
-          (lhs.getConnectingFaceUri() == rhs.getConnectingFaceUri()));
+  return (lhs.getRouteCostAsAdjustedInteger() == rhs.getRouteCostAsAdjustedInteger()) &&
+         (lhs.getConnectingFaceUri() == rhs.getConnectingFaceUri());
 }
 
 std::ostream&
 operator<<(std::ostream& os, const NextHop& hop)
 {
-  os << "Nexthop("
-     << "face-uri: " << hop.getConnectingFaceUri()
-     << ", cost: " << hop.getRouteCost() << ")";
-
+  os << "NextHop(Uri: " << hop.getConnectingFaceUri() << ", Cost: " << hop.getRouteCost() << ")";
   return os;
 }
 
diff --git a/src/route/nexthop.hpp b/src/route/nexthop.hpp
index e24df7b..7f91cfe 100644
--- a/src/route/nexthop.hpp
+++ b/src/route/nexthop.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,22 +16,36 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_ROUTE_NEXTHOP_HPP
 #define NLSR_ROUTE_NEXTHOP_HPP
 
 #include "test-access-control.hpp"
 
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/encoding/encoding-buffer.hpp>
+#include <ndn-cxx/encoding/tlv.hpp>
+
 #include <iostream>
 #include <cmath>
 #include <boost/cstdint.hpp>
 
 namespace nlsr {
 
+/*! \brief Data abstraction for Nexthop
+ *
+ *   NextHop := NEXTHOP-TYPE TLV-LENGTH
+ *                Uri
+ *                Cost
+ *
+ * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_Dataset
+ */
 class NextHop
 {
 public:
+  using Error = ndn::tlv::Error;
+
   NextHop()
     : m_connectingFaceUri()
     , m_routeCost(0)
@@ -40,10 +54,15 @@
   }
 
   NextHop(const std::string& cfu, double rc)
-    : m_isHyperbolic(false)
+    : m_connectingFaceUri(cfu)
+    , m_routeCost(rc)
+    , m_isHyperbolic(false)
   {
-    m_connectingFaceUri = cfu;
-    m_routeCost = rc;
+  }
+
+  NextHop(const ndn::Block& block)
+  {
+    wireDecode(block);
   }
 
   const std::string&
@@ -96,11 +115,23 @@
     return m_isHyperbolic;
   }
 
+  template<ndn::encoding::Tag TAG>
+  size_t
+  wireEncode(ndn::EncodingImpl<TAG>& block) const;
+
+  const ndn::Block&
+  wireEncode() const;
+
+  void
+  wireDecode(const ndn::Block& wire);
+
 private:
   std::string m_connectingFaceUri;
   double m_routeCost;
   bool m_isHyperbolic;
 
+  mutable ndn::Block m_wire;
+
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   /*! \brief Used to adjust floating point route costs to integers
       Since NFD uses integer route costs in the FIB, hyperbolic paths with similar route costs
@@ -115,6 +146,8 @@
   static const uint64_t HYPERBOLIC_COST_ADJUSTMENT_FACTOR = 1000;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(NextHop);
+
 bool
 operator==(const NextHop& lhs, const NextHop& rhs);
 
diff --git a/src/route/routing-table-entry.cpp b/src/route/routing-table-entry.cpp
index 750dc79..7320d91 100644
--- a/src/route/routing-table-entry.cpp
+++ b/src/route/routing-table-entry.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2017,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -16,19 +16,96 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "routing-table-entry.hpp"
 #include "nexthop-list.hpp"
+#include "tlv-nlsr.hpp"
 
 namespace nlsr {
 
+template<ndn::encoding::Tag TAG>
+size_t
+RoutingTableEntry::wireEncode(ndn::EncodingImpl<TAG>& block) const
+{
+  size_t totalLength = 0;
+
+  for (auto it = m_nexthopList.rbegin(); it != m_nexthopList.rend(); ++it) {
+    totalLength += it->wireEncode(block);
+  }
+
+  totalLength += m_destination.wireEncode(block);
+
+  totalLength += block.prependVarNumber(totalLength);
+  totalLength += block.prependVarNumber(ndn::tlv::nlsr::RoutingTableEntry);
+
+  return totalLength;
+}
+
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(RoutingTableEntry);
+
+const ndn::Block&
+RoutingTableEntry::wireEncode() const
+{
+  if (m_wire.hasWire()) {
+    return m_wire;
+  }
+
+  ndn::EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  ndn::EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  m_wire = buffer.block();
+
+  return m_wire;
+}
+
+void
+RoutingTableEntry::wireDecode(const ndn::Block& wire)
+{
+  m_nexthopList.clear();
+
+  m_wire = wire;
+
+  if (m_wire.type() != ndn::tlv::nlsr::RoutingTableEntry) {
+    std::stringstream error;
+    error << "Expected RoutingTable Block, but Block is of a different type: #"
+          << m_wire.type();
+    BOOST_THROW_EXCEPTION(Error(error.str()));
+  }
+
+  m_wire.parse();
+
+  auto val = m_wire.elements_begin();
+
+  if (val != m_wire.elements_end() && val->type() == ndn::tlv::Name) {
+    m_destination.wireDecode(*val);
+    ++val;
+  }
+  else {
+    BOOST_THROW_EXCEPTION(Error("Missing required destination field"));
+  }
+
+  for (; val != m_wire.elements_end(); ++val) {
+    if (val->type() == ndn::tlv::nlsr::NextHop) {
+      m_nexthopList.addNextHop(NextHop(*val));
+    }
+    else {
+      std::stringstream error;
+      error << "Expected NextHop Block, but Block is of a different type: #"
+            << m_wire.type();
+      BOOST_THROW_EXCEPTION(Error(error.str()));
+    }
+  }
+}
+
 std::ostream&
 operator<<(std::ostream& os, const RoutingTableEntry& rte)
 {
-  os << "RoutingTableEntry("
-     << "Destination: " << rte.getDestination()
-     << "Next hop list: " << rte.getNexthopList() << ")";
+  os << "  Destination: " << rte.getDestination() << "\n"
+     << rte.getNexthopList() << "\n";
 
   return os;
 }
diff --git a/src/route/routing-table-entry.hpp b/src/route/routing-table-entry.hpp
index 83731b9..ffbbfac 100644
--- a/src/route/routing-table-entry.hpp
+++ b/src/route/routing-table-entry.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,27 +16,38 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- **/
+ */
 
 #ifndef NLSR_ROUTING_TABLE_ENTRY_HPP
 #define NLSR_ROUTING_TABLE_ENTRY_HPP
 
 #include "nexthop-list.hpp"
 
+#include <ndn-cxx/encoding/block.hpp>
+#include <ndn-cxx/encoding/encoding-buffer.hpp>
+#include <ndn-cxx/encoding/tlv.hpp>
 #include <ndn-cxx/name.hpp>
 
 namespace nlsr {
 
+/*! \brief Data abstraction for RouteTableInfo
+ *
+ *   RoutingTableEntry := ROUTINGTABLEENTRY-TYPE TLV-LENGTH
+ *                          Name
+ *                          NexthopList*
+ *
+ * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_DataSet
+ */
 class RoutingTableEntry
 {
 public:
-  RoutingTableEntry()
-  {
-  }
+  using Error = ndn::tlv::Error;
 
-  ~RoutingTableEntry()
+  RoutingTableEntry() = default;
+
+  RoutingTableEntry(const ndn::Block& block)
   {
+    wireDecode(block);
   }
 
   RoutingTableEntry(const ndn::Name& dest)
@@ -65,15 +76,29 @@
   inline bool
   operator==(RoutingTableEntry& rhs)
   {
-    return ((*this).getDestination() == rhs.getDestination() &&
-            (*this).getNexthopList() == rhs.getNexthopList());
+    return m_destination == rhs.getDestination() &&
+           m_nexthopList == rhs.getNexthopList();
   }
 
+  template<ndn::encoding::Tag TAG>
+  size_t
+  wireEncode(ndn::EncodingImpl<TAG>& block) const;
+
+  const ndn::Block&
+  wireEncode() const;
+
+  void
+  wireDecode(const ndn::Block& wire);
+
 protected:
   ndn::Name m_destination;
   NexthopList m_nexthopList;
+
+  mutable ndn::Block m_wire;
 };
 
+NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(RoutingTableEntry);
+
 std::ostream&
 operator<<(std::ostream& os, const RoutingTableEntry& rte);
 
diff --git a/src/route/routing-table.cpp b/src/route/routing-table.cpp
index 3fcd654..a2ec12b 100644
--- a/src/route/routing-table.cpp
+++ b/src/route/routing-table.cpp
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "routing-table.hpp"
 #include "nlsr.hpp"
@@ -26,6 +26,7 @@
 #include "routing-table-entry.hpp"
 #include "name-prefix-table.hpp"
 #include "logger.hpp"
+#include "tlv-nlsr.hpp"
 
 #include <list>
 #include <string>
@@ -94,24 +95,22 @@
         // Inform the NPT that updates have been made
         NLSR_LOG_DEBUG("Calling Update NPT With new Route");
         (*afterRoutingChange)(m_rTable);
-        writeLog();
+        NLSR_LOG_DEBUG(*this);
         m_namePrefixTable.writeLog();
         m_fib.writeLog();
       }
       else {
-        NLSR_LOG_DEBUG("Adjacency building is scheduled, so"
-                   " routing table can not be calculated :(");
+        NLSR_LOG_DEBUG("Adjacency building is scheduled, so routing table can not be calculated :(");
       }
     }
     else {
-      NLSR_LOG_DEBUG("No Adj LSA of router itself,"
-                 " so Routing table can not be calculated :(");
+      NLSR_LOG_DEBUG("No Adj LSA of router itself, so Routing table can not be calculated :(");
       clearRoutingTable();
       clearDryRoutingTable(); // for dry run options
       // need to update NPT here
       NLSR_LOG_DEBUG("Calling Update NPT With new Route");
       (*afterRoutingChange)(m_rTable);
-      writeLog();
+      NLSR_LOG_DEBUG(*this);
       m_namePrefixTable.writeLog();
       m_fib.writeLog();
       // debugging purpose end
@@ -199,26 +198,6 @@
 }
 
 void
-RoutingTable::writeLog()
-{
-  NLSR_LOG_DEBUG("---------------Routing Table------------------");
-  for (const auto& rte : m_rTable) {
-    NLSR_LOG_DEBUG("Destination: " << rte.getDestination());
-    NLSR_LOG_DEBUG("Nexthops: ");
-    rte.getNexthopList().writeLog();
-  }
-
-  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
-    NLSR_LOG_DEBUG("--------Hyperbolic Routing Table(Dry)---------");
-    for (const auto& rte : m_dryTable) {
-      NLSR_LOG_DEBUG("Destination: " << rte.getDestination());
-      NLSR_LOG_DEBUG("Nexthops: ");
-      rte.getNexthopList().writeLog();
-    }
-  }
-}
-
-void
 RoutingTable::addNextHopToDryTable(const ndn::Name& destRouter, NextHop& nh)
 {
   NLSR_LOG_DEBUG("Adding " << nh << " to dry table for destination: " << destRouter);
@@ -251,4 +230,100 @@
   }
 }
 
+template<ndn::encoding::Tag TAG>
+size_t
+RoutingTableStatus::wireEncode(ndn::EncodingImpl<TAG>& block) const
+{
+  size_t totalLength = 0;
+
+  for (auto it = m_dryTable.rbegin(); it != m_dryTable.rend(); ++it) {
+    totalLength += it->wireEncode(block);
+  }
+
+  for (auto it = m_rTable.rbegin(); it != m_rTable.rend(); ++it) {
+    totalLength += it->wireEncode(block);
+  }
+
+  totalLength += block.prependVarNumber(totalLength);
+  totalLength += block.prependVarNumber(ndn::tlv::nlsr::RoutingTable);
+
+  return totalLength;
+}
+
+NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(RoutingTableStatus);
+
+const ndn::Block&
+RoutingTableStatus::wireEncode() const
+{
+  if (m_wire.hasWire()) {
+    return m_wire;
+  }
+
+  ndn::EncodingEstimator estimator;
+  size_t estimatedSize = wireEncode(estimator);
+
+  ndn::EncodingBuffer buffer(estimatedSize, 0);
+  wireEncode(buffer);
+
+  m_wire = buffer.block();
+
+  return m_wire;
+}
+
+void
+RoutingTableStatus::wireDecode(const ndn::Block& wire)
+{
+  m_rTable.clear();
+
+  m_wire = wire;
+
+  if (m_wire.type() != ndn::tlv::nlsr::RoutingTable) {
+    std::stringstream error;
+    error << "Expected RoutingTableStatus Block, but Block is of a different type: #"
+          << m_wire.type();
+    BOOST_THROW_EXCEPTION(Error(error.str()));
+  }
+
+  m_wire.parse();
+
+  auto val = m_wire.elements_begin();
+
+  std::set<ndn::Name> destinations;
+  for (; val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::RoutingTableEntry; ++val) {
+    auto entry = RoutingTableEntry(*val);
+
+    if (destinations.emplace(entry.getDestination()).second) {
+      m_rTable.push_back(entry);
+    }
+    else {
+      // If destination already exists then this is the start of dry HR table
+      m_dryTable.push_back(entry);
+    }
+  }
+
+  if (val != m_wire.elements_end()) {
+    std::stringstream error;
+    error << "Expected the end of elements, but Block is of a different type: #"
+          << val->type();
+    BOOST_THROW_EXCEPTION(Error(error.str()));
+  }
+}
+
+std::ostream&
+operator<<(std::ostream& os, const RoutingTableStatus& rts)
+{
+  os << "Routing Table:\n";
+  for (const auto& rte : rts.getRoutingTableEntry()) {
+    os << rte;
+  }
+
+  if (!rts.getDryRoutingTableEntry().empty()) {
+    os << "Dry-Run Hyperbolic Routing Table:\n";
+    for (const auto& rte : rts.getDryRoutingTableEntry()) {
+      os << rte;
+    }
+  }
+  return os;
+}
+
 } // namespace nlsr
diff --git a/src/route/routing-table.hpp b/src/route/routing-table.hpp
index af2ba93..8f9309b 100644
--- a/src/route/routing-table.hpp
+++ b/src/route/routing-table.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,8 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- **/
+ */
 
 #ifndef NLSR_ROUTING_TABLE_HPP
 #define NLSR_ROUTING_TABLE_HPP
@@ -35,7 +34,58 @@
 
 class NextHop;
 
-class RoutingTable : boost::noncopyable
+/*! \brief Data abstraction for routing table status
+ *
+ * RtStatus := RT-STATUS-TYPE TLV-LENGTH
+ *              RouteTableEntry*
+ *
+ * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_Dataset
+ */
+class RoutingTableStatus
+{
+public:
+  using Error = ndn::tlv::Error;
+
+  RoutingTableStatus() = default;
+
+  RoutingTableStatus(const ndn::Block& block)
+  {
+    wireDecode(block);
+  }
+
+  const std::list<RoutingTableEntry>&
+  getRoutingTableEntry() const
+  {
+    return m_rTable;
+  }
+
+  const std::list<RoutingTableEntry>&
+  getDryRoutingTableEntry() const
+  {
+    return m_dryTable;
+  }
+
+  const ndn::Block&
+  wireEncode() const;
+
+private:
+  void
+  wireDecode(const ndn::Block& wire);
+
+  template<ndn::encoding::Tag TAG>
+  size_t
+  wireEncode(ndn::EncodingImpl<TAG>& block) const;
+
+PUBLIC_WITH_TESTS_ELSE_PROTECTED:
+  std::list<RoutingTableEntry> m_dryTable;
+  std::list<RoutingTableEntry> m_rTable;
+  mutable ndn::Block m_wire;
+};
+
+std::ostream&
+operator<<(std::ostream& os, const RoutingTableStatus& rts);
+
+class RoutingTable : public RoutingTableStatus
 {
 public:
   explicit
@@ -84,18 +134,6 @@
     return m_routingCalcInterval;
   }
 
-  const std::list<RoutingTableEntry>&
-  getRoutingTableEntry() const
-  {
-    return m_rTable;
-  }
-
-  const std::list<RoutingTableEntry>&
-  getDryRoutingTableEntry() const
-  {
-    return m_dryTable;
-  }
-
   uint64_t
   getRtSize()
   {
@@ -117,23 +155,15 @@
   void
   clearDryRoutingTable();
 
-  void
-  writeLog();
-
 public:
   std::unique_ptr<AfterRoutingChange> afterRoutingChange;
 
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  std::list<RoutingTableEntry> m_rTable;
-
 private:
   ndn::Scheduler& m_scheduler;
   Fib& m_fib;
   Lsdb& m_lsdb;
   NamePrefixTable& m_namePrefixTable;
 
-  std::list<RoutingTableEntry> m_dryTable;
-
   ndn::time::seconds m_routingCalcInterval;
 
   bool m_isRoutingTableCalculating;
diff --git a/src/tlv/tlv-nlsr.hpp b/src/tlv-nlsr.hpp
similarity index 97%
rename from src/tlv/tlv-nlsr.hpp
rename to src/tlv-nlsr.hpp
index e7d2253..93cfd2d 100644
--- a/src/tlv/tlv-nlsr.hpp
+++ b/src/tlv-nlsr.hpp
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #ifndef NLSR_TLV_NLSR_HPP
 #define NLSR_TLV_NLSR_HPP
@@ -47,7 +47,6 @@
   ExpirationTime              = 139,
   Cost                        = 140,
   Uri                         = 141,
-  Destination                 = 142,
   NextHop                     = 143,
   RoutingTable                = 144,
   RoutingTableEntry           = 145
diff --git a/src/tlv/destination.cpp b/src/tlv/destination.cpp
deleted file mode 100644
index a1ea06f..0000000
--- a/src/tlv/destination.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "destination.hpp"
-#include "tlv-nlsr.hpp"
-
-#include <ndn-cxx/util/concepts.hpp>
-#include <ndn-cxx/encoding/block-helpers.hpp>
-
-namespace nlsr {
-namespace tlv {
-
-BOOST_CONCEPT_ASSERT((ndn::WireEncodable<Destination>));
-BOOST_CONCEPT_ASSERT((ndn::WireDecodable<Destination>));
-static_assert(std::is_base_of<ndn::tlv::Error, Destination::Error>::value,
-              "Destination::Error must inherit from tlv::Error");
-
-Destination::Destination() = default;
-
-Destination::Destination(const ndn::Block& block)
-{
-  wireDecode(block);
-}
-
-template<ndn::encoding::Tag TAG>
-size_t
-Destination::wireEncode(ndn::EncodingImpl<TAG>& encoder) const
-{
-  size_t totalLength = 0;
-
-  totalLength += m_name.wireEncode(encoder);
-
-  totalLength += encoder.prependVarNumber(totalLength);
-  totalLength += encoder.prependVarNumber(ndn::tlv::nlsr::Destination);
-
-  return totalLength;
-}
-
-NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Destination);
-
-const ndn::Block&
-Destination::wireEncode() const
-{
-  if (m_wire.hasWire()) {
-    return m_wire;
-  }
-
-  ndn::EncodingEstimator estimator;
-  size_t estimatedSize = wireEncode(estimator);
-
-  ndn::EncodingBuffer buffer(estimatedSize, 0);
-  wireEncode(buffer);
-
-  m_wire = buffer.block();
-
-  return m_wire;
-}
-
-void
-Destination::wireDecode(const ndn::Block& wire)
-{
-  m_name.clear();
-
-  m_wire = wire;
-
-  if (m_wire.type() != ndn::tlv::nlsr::Destination) {
-    std::stringstream error;
-    error << "Expected Destination Block, but Block is of a different type: #"
-          << m_wire.type();
-    BOOST_THROW_EXCEPTION(Error(error.str()));
-  }
-
-  m_wire.parse();
-
-  ndn::Block::element_const_iterator val = m_wire.elements_begin();
-
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::Name) {
-    m_name.wireDecode(*val);
-    ++val;
-  }
-  else {
-    BOOST_THROW_EXCEPTION(Error("Missing required Name field"));
-  }
-}
-
-std::ostream&
-operator<<(std::ostream& os, const Destination& Destination)
-{
-  os << "Destination: " << Destination.getName();
-  return os;
-}
-
-std::shared_ptr<Destination>
-makeDes(const RoutingTableEntry& rte)
-{
-  std::shared_ptr<Destination> desInfo = std::make_shared<Destination>();
-
-  desInfo->setName(rte.getDestination());
-
-  return desInfo;
-}
-
-} // namespace tlv
-} // namespace nlsr
diff --git a/src/tlv/destination.hpp b/src/tlv/destination.hpp
deleted file mode 100644
index 859c8a8..0000000
--- a/src/tlv/destination.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef NLSR_TLV_DESTINATION_HPP
-#define NLSR_TLV_DESTINATION_HPP
-
-#include "route/routing-table-entry.hpp"
-
-#include <ndn-cxx/util/time.hpp>
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/encoding/encoding-buffer.hpp>
-#include <ndn-cxx/encoding/tlv.hpp>
-#include <ndn-cxx/name.hpp>
-#include <boost/throw_exception.hpp>
-
-#include <list>
-
-namespace nlsr {
-namespace tlv {
-
-/*! \brief Data abstraction for Destination
- *
- *    Destination := DESTINATION-TYPE TLV-LENGTH
- *                     Name
- *
- * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_DataSet
- */
-class Destination
-{
-public:
-  class Error : public ndn::tlv::Error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : ndn::tlv::Error(what)
-    {
-    }
-  };
-
-  Destination();
-
-  explicit
-  Destination(const ndn::Block& block);
-
-  const ndn::Name&
-  getName() const
-  {
-    return m_name;
-  }
-
-  Destination&
-  setName(const ndn::Name& name)
-  {
-    m_name = name;
-    m_wire.reset();
-    return *this;
-  }
-
-  template<ndn::encoding::Tag TAG>
-  size_t
-  wireEncode(ndn::EncodingImpl<TAG>& block) const;
-
-  const ndn::Block&
-  wireEncode() const;
-
-  void
-  wireDecode(const ndn::Block& wire);
-
-private:
-  ndn::Name m_name;
-
-  mutable ndn::Block m_wire;
-};
-
-NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(Destination);
-
-std::ostream&
-operator<<(std::ostream& os, const Destination& destination);
-
-std::shared_ptr<Destination>
-makeDes(const RoutingTableEntry& rte);
-
-} // namespace tlv
-} // namespace nlsr
-
-#endif // NLSR_TLV_DESTINATION_HPP
diff --git a/src/tlv/nexthop.cpp b/src/tlv/nexthop.cpp
deleted file mode 100644
index 508bf1a..0000000
--- a/src/tlv/nexthop.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "nexthop.hpp"
-#include "tlv-nlsr.hpp"
-
-#include <ndn-cxx/util/concepts.hpp>
-#include <ndn-cxx/encoding/block-helpers.hpp>
-
-namespace nlsr {
-namespace tlv {
-
-BOOST_CONCEPT_ASSERT((ndn::WireEncodable<NextHop>));
-BOOST_CONCEPT_ASSERT((ndn::WireDecodable<NextHop>));
-static_assert(std::is_base_of<ndn::tlv::Error, NextHop::Error>::value,
-              "NextHop::Error must inherit from tlv::Error");
-
-NextHop::NextHop()
-  : m_cost(0)
-{
-}
-
-NextHop::NextHop(const ndn::Block& block)
-{
-  wireDecode(block);
-}
-
-template<ndn::encoding::Tag TAG>
-size_t
-NextHop::wireEncode(ndn::EncodingImpl<TAG>& block) const
-{
-  size_t totalLength = 0;
-
-  totalLength += ndn::encoding::prependDoubleBlock(block, ndn::tlv::nlsr::CostDouble, m_cost);
-
-  totalLength += block.prependByteArrayBlock(
-    ndn::tlv::nlsr::Uri, reinterpret_cast<const uint8_t*>(m_uri.c_str()), m_uri.size());
-
-  totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::NextHop);
-
-  return totalLength;
-}
-
-NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(NextHop);
-
-const ndn::Block&
-NextHop::wireEncode() const
-{
-  if (m_wire.hasWire()) {
-    return m_wire;
-  }
-
-  ndn::EncodingEstimator estimator;
-  size_t estimatedSize = wireEncode(estimator);
-
-  ndn::EncodingBuffer buffer(estimatedSize, 0);
-  wireEncode(buffer);
-
-  m_wire = buffer.block();
-
-  return m_wire;
-}
-
-void
-NextHop::wireDecode(const ndn::Block& wire)
-{
-  m_uri = "";
-  m_cost = 0;
-
-  m_wire = wire;
-
-  if (m_wire.type() != ndn::tlv::nlsr::NextHop) {
-    std::stringstream error;
-    error << "Expected NextHop Block, but Block is of a different type: #"
-          << m_wire.type();
-    BOOST_THROW_EXCEPTION(Error(error.str()));
-  }
-
-  m_wire.parse();
-
-  ndn::Block::element_const_iterator val = m_wire.elements_begin();
-
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Uri) {
-    m_uri.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
-    ++val;
-  }
-  else {
-    BOOST_THROW_EXCEPTION(Error("Missing required Uri field"));
-  }
-
-  m_cost = ndn::encoding::readDouble(*val);
-}
-
-std::ostream&
-operator<<(std::ostream& os, const NextHop& nexthop)
-{
-  os << "NextHop("
-     << "Uri: " << nexthop.getUri() << ", "<< "Cost: " << nexthop.getCost() << ")" << std::endl;
-
-  return os;
-}
-
-} // namespace tlv
-} // namespace nlsr
diff --git a/src/tlv/nexthop.hpp b/src/tlv/nexthop.hpp
deleted file mode 100644
index 9b0f72c..0000000
--- a/src/tlv/nexthop.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef NLSR_TLV_NEXTHOP_HPP
-#define NLSR_TLV_NEXTHOP_HPP
-
-#include <ndn-cxx/util/time.hpp>
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/encoding/encoding-buffer.hpp>
-#include <ndn-cxx/encoding/tlv.hpp>
-#include <ndn-cxx/name.hpp>
-#include <boost/throw_exception.hpp>
-
-namespace nlsr {
-namespace tlv {
-
-/*! \brief Data abstraction for Nexthop
- *
- *   NextHop := NEXTHOP-TYPE TLV-LENGTH
- *                Uri
- *                Cost
- *
- * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_Dataset
- */
-class NextHop
-{
-public:
-  class Error : public ndn::tlv::Error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : ndn::tlv::Error(what)
-    {
-    }
-  };
-
-  NextHop();
-
-  explicit
-  NextHop(const ndn::Block& block);
-
-  const std::string&
-  getUri() const
-  {
-    return m_uri;
-  }
-
-  NextHop&
-  setUri(const std::string& uri)
-  {
-    m_uri = uri;
-    m_wire.reset();
-    return *this;
-  }
-
-  double
-  getCost() const
-  {
-    return m_cost;
-  }
-
-  NextHop&
-  setCost(double cost)
-  {
-    m_cost = cost;
-    m_wire.reset();
-    return *this;
-  }
-
-  template<ndn::encoding::Tag TAG>
-  size_t
-  wireEncode(ndn::EncodingImpl<TAG>& block) const;
-
-  const ndn::Block&
-  wireEncode() const;
-
-  void
-  wireDecode(const ndn::Block& wire);
-
-private:
-  std::string m_uri;
-  double m_cost;
-
-  mutable ndn::Block m_wire;
-};
-
-NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(NextHop);
-
-std::ostream&
-operator<<(std::ostream& os, const NextHop& nexthop);
-
-} // namespace tlv
-} // namespace nlsr
-
-#endif // NLSR_TLV_NEXTHOP_HPP
diff --git a/src/tlv/routing-table-entry.cpp b/src/tlv/routing-table-entry.cpp
deleted file mode 100644
index 255d418..0000000
--- a/src/tlv/routing-table-entry.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "routing-table-entry.hpp"
-#include "tlv-nlsr.hpp"
-
-#include <ndn-cxx/util/concepts.hpp>
-#include <ndn-cxx/encoding/block-helpers.hpp>
-
-namespace nlsr {
-namespace tlv {
-
-BOOST_CONCEPT_ASSERT((ndn::WireEncodable<RoutingTable>));
-BOOST_CONCEPT_ASSERT((ndn::WireDecodable<RoutingTable>));
-static_assert(std::is_base_of<ndn::tlv::Error, RoutingTable::Error>::value,
-              "RoutingTable::Error must inherit from tlv::Error");
-
-RoutingTable::RoutingTable()
-  : m_hasNexthops(false)
-{
-}
-
-RoutingTable::RoutingTable(const ndn::Block& block)
-{
-  wireDecode(block);
-}
-
-bool
-RoutingTable::hasNexthops() const
-{
-  return m_hasNexthops;
-}
-
-RoutingTable&
-RoutingTable::addNexthops(const NextHop& nexthop)
-{
-  m_nexthops.push_back(nexthop);
-  m_wire.reset();
-  m_hasNexthops = true;
-  return *this;
-}
-
-RoutingTable&
-RoutingTable::clearNexthops()
-{
-  m_nexthops.clear();
-  m_hasNexthops = false;
-  return *this;
-}
-
-template<ndn::encoding::Tag TAG>
-size_t
-RoutingTable::wireEncode(ndn::EncodingImpl<TAG>& block) const
-{
-  size_t totalLength = 0;
-
-  for (std::list<NextHop>::const_reverse_iterator it = m_nexthops.rbegin();
-       it != m_nexthops.rend(); ++it) {
-    totalLength += it->wireEncode(block);
-  }
-
-  totalLength += m_des.wireEncode(block);
-
-  totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::RoutingTableEntry);
-
-  return totalLength;
-}
-
-NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(RoutingTable);
-
-const ndn::Block&
-RoutingTable::wireEncode() const
-{
-  if (m_wire.hasWire()) {
-    return m_wire;
-  }
-
-  ndn::EncodingEstimator estimator;
-  size_t estimatedSize = wireEncode(estimator);
-
-  ndn::EncodingBuffer buffer(estimatedSize, 0);
-  wireEncode(buffer);
-
-  m_wire = buffer.block();
-
-  return m_wire;
-}
-
-void
-RoutingTable::wireDecode(const ndn::Block& wire)
-{
-  m_hasNexthops = false;
-  m_nexthops.clear();
-
-  m_wire = wire;
-
-  if (m_wire.type() != ndn::tlv::nlsr::RoutingTableEntry) {
-    std::stringstream error;
-    error << "Expected RoutingTable Block, but Block is of a different type: #"
-          << m_wire.type();
-    BOOST_THROW_EXCEPTION(Error(error.str()));
-  }
-
-  m_wire.parse();
-
-  ndn::Block::element_const_iterator val = m_wire.elements_begin();
-
-  if (val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::Destination) {
-    m_des.wireDecode(*val);
-    ++val;
-  }
-  else {
-    BOOST_THROW_EXCEPTION(Error("Missing required destination field"));
-  }
-
-  for (; val != m_wire.elements_end(); ++val) {
-    if (val->type() == ndn::tlv::nlsr::NextHop) {
-      m_nexthops.push_back(NextHop(*val));
-      m_hasNexthops = true;
-    }
-    else {
-      std::stringstream error;
-      error << "Expected NextHop Block, but Block is of a different type: #"
-            << m_wire.type();
-      BOOST_THROW_EXCEPTION(Error(error.str()));
-    }
-  }
-}
-
-std::ostream&
-operator<<(std::ostream& os, const RoutingTable& routingtable)
-{
-  os << routingtable.getDestination() << std::endl;
-  os << "NexthopList(" << std::endl;
-
-  for (const auto& rtentry : routingtable) {
-    os << rtentry;
-  }
-
-  os << ")";
-  return os;
-}
-
-} // namespace tlv
-} // namespace nlsr
diff --git a/src/tlv/routing-table-entry.hpp b/src/tlv/routing-table-entry.hpp
deleted file mode 100644
index 167f63a..0000000
--- a/src/tlv/routing-table-entry.hpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef NLSR_TLV_ROUTING_TABLE_ENTRY_HPP
-#define NLSR_TLV_ROUTING_TABLE_ENTRY_HPP
-
-#include "destination.hpp"
-#include "nexthop.hpp"
-
-#include <ndn-cxx/util/time.hpp>
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/encoding/encoding-buffer.hpp>
-#include <ndn-cxx/encoding/tlv.hpp>
-#include <ndn-cxx/name.hpp>
-
-#include <list>
-
-namespace nlsr {
-namespace tlv {
-
-/*! \brief Data abstraction for RouteTableInfo
- *
- *   RouteTableInfo := ROUTINGTABLE-TYPE TLV-LENGTH
- *                       Destination
- *                       NexthopList*
- *
- * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_DataSet
- */
-class RoutingTable
-{
-public:
-  class Error : public ndn::tlv::Error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : ndn::tlv::Error(what)
-    {
-    }
-  };
-
-  typedef std::list<NextHop> HopList;
-  typedef HopList::const_iterator const_iterator;
-
-  RoutingTable();
-
-  explicit
-  RoutingTable(const ndn::Block& block);
-
-  const Destination&
-  getDestination() const
-  {
-    return m_des;
-  }
-
-  RoutingTable&
-  setDestination(const Destination& des)
-  {
-    m_des = des;
-    m_wire.reset();
-    return *this;
-  }
-
-  uint64_t
-  getRtSize() const
-  {
-    return m_size;
-  }
-
-  RoutingTable&
-  setRtSize(uint64_t size)
-  {
-    m_size = size;
-    m_wire.reset();
-    return *this;
-  }
-
-  bool
-  hasNexthops() const;
-
-  const std::list<NextHop>&
-  getNextHops() const
-  {
-    return m_nexthops;
-  }
-
-  RoutingTable&
-  addNexthops(const NextHop& nexthop);
-
-  RoutingTable&
-  clearNexthops();
-
-  template<ndn::encoding::Tag TAG>
-  size_t
-  wireEncode(ndn::EncodingImpl<TAG>& block) const;
-
-  const ndn::Block&
-  wireEncode() const;
-
-  void
-  wireDecode(const ndn::Block& wire);
-
-  const_iterator
-  begin() const;
-
-  const_iterator
-  end() const;
-
-private:
-  Destination m_des;
-  uint64_t m_size;
-  bool m_hasNexthops;
-  HopList m_nexthops;
-
-  mutable ndn::Block m_wire;
-};
-
-NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(RoutingTable);
-
-inline RoutingTable::const_iterator
-RoutingTable::begin() const
-{
-  return m_nexthops.begin();
-}
-
-inline RoutingTable::const_iterator
-RoutingTable::end() const
-{
-  return m_nexthops.end();
-}
-
-std::ostream&
-operator<<(std::ostream& os, const RoutingTable& routetable);
-
-} // namespace tlv
-} // namespace nlsr
-
-#endif // NLSR_TLV_ROUTING_TABLE_ENTRY_HPP
diff --git a/src/tlv/routing-table-status.cpp b/src/tlv/routing-table-status.cpp
deleted file mode 100644
index 00d2c78..0000000
--- a/src/tlv/routing-table-status.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "routing-table-status.hpp"
-#include "tlv-nlsr.hpp"
-
-#include <ndn-cxx/util/concepts.hpp>
-#include <ndn-cxx/encoding/block-helpers.hpp>
-
-namespace nlsr {
-namespace tlv {
-
-BOOST_CONCEPT_ASSERT((ndn::WireEncodable<RoutingTableStatus>));
-BOOST_CONCEPT_ASSERT((ndn::WireDecodable<RoutingTableStatus>));
-static_assert(std::is_base_of<ndn::tlv::Error, RoutingTableStatus::Error>::value,
-              "RoutingTableStatus::Error must inherit from tlv::Error");
-
-RoutingTableStatus::RoutingTableStatus()
-  : m_hasRoutingtable(false)
-{
-}
-
-RoutingTableStatus::RoutingTableStatus(const ndn::Block& block)
-{
-  wireDecode(block);
-}
-
-RoutingTableStatus&
-RoutingTableStatus::addRoutingTable(const RoutingTable& routetable)
-{
-  m_routingtables.push_back(routetable);
-  m_wire.reset();
-  m_hasRoutingtable = true;
-  return *this;
-}
-
-RoutingTableStatus&
-RoutingTableStatus::clearRoutingTable()
-{
-  m_routingtables.clear();
-  m_hasRoutingtable = false;
-  return *this;
-}
-
-bool
-RoutingTableStatus::hasRoutingTable()
-{
-  return m_hasRoutingtable;
-}
-
-template<ndn::encoding::Tag TAG>
-size_t
-RoutingTableStatus::wireEncode(ndn::EncodingImpl<TAG>& block) const
-{
-  size_t totalLength = 0;
-
-  for (std::list<RoutingTable>::const_reverse_iterator it = m_routingtables.rbegin();
-       it != m_routingtables.rend(); ++it) {
-    totalLength += it->wireEncode(block);
-  }
-
-  totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::RoutingTable);
-
-  return totalLength;
-}
-
-NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(RoutingTableStatus);
-
-const ndn::Block&
-RoutingTableStatus::wireEncode() const
-{
-  if (m_wire.hasWire()) {
-    return m_wire;
-  }
-
-  ndn::EncodingEstimator estimator;
-  size_t estimatedSize = wireEncode(estimator);
-
-  ndn::EncodingBuffer buffer(estimatedSize, 0);
-  wireEncode(buffer);
-
-  m_wire = buffer.block();
-
-  return m_wire;
-}
-
-void
-RoutingTableStatus::wireDecode(const ndn::Block& wire)
-{
-  m_routingtables.clear();
-
-  m_hasRoutingtable = false;
-
-  m_wire = wire;
-
-  if (m_wire.type() != ndn::tlv::nlsr::RoutingTable) {
-    std::stringstream error;
-    error << "Expected RoutingTableStatus Block, but Block is of a different type: #"
-          << m_wire.type();
-    BOOST_THROW_EXCEPTION(Error(error.str()));
-  }
-
-  m_wire.parse();
-
-  ndn::Block::element_const_iterator val = m_wire.elements_begin();
-
-  for (; val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::RoutingTableEntry; ++val) {
-    m_routingtables.push_back(RoutingTable(*val));
-    m_hasRoutingtable = true;
-  }
-
-  if (val != m_wire.elements_end()) {
-    std::stringstream error;
-    error << "Expected the end of elements, but Block is of a different type: #"
-          << val->type();
-    BOOST_THROW_EXCEPTION(Error(error.str()));
-  }
-}
-
-std::ostream&
-operator<<(std::ostream& os, const RoutingTableStatus& rtStatus)
-{
-  os << "Routing Table Status: " << std::endl;
-
-  bool isFirst = true;
-
-  for (const auto& routingtable : rtStatus.getRoutingtable()) {
-    if (isFirst) {
-      isFirst = false;
-    }
-    else {
-      os << ", ";
-    }
-
-    os << routingtable;
-  }
-
-  return os;
-}
-
-} // namespace tlv
-} // namespace nlsr
diff --git a/src/tlv/routing-table-status.hpp b/src/tlv/routing-table-status.hpp
deleted file mode 100644
index 97d083f..0000000
--- a/src/tlv/routing-table-status.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2018,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#ifndef NLSR_TLV_ROUTING_TABLE_STATUS_HPP
-#define NLSR_TLV_ROUTING_TABLE_STATUS_HPP
-
-#include "routing-table-entry.hpp"
-#include "destination.hpp"
-
-#include <ndn-cxx/util/time.hpp>
-#include <ndn-cxx/encoding/block.hpp>
-#include <ndn-cxx/encoding/encoding-buffer.hpp>
-#include <ndn-cxx/encoding/tlv.hpp>
-#include <ndn-cxx/name.hpp>
-
-#include <list>
-
-namespace nlsr {
-namespace tlv {
-
-/*! \brief Data abstraction for routing table status
- *
- * RtStatus := RT-STATUS-TYPE TLV-LENGTH
- *              RouteTableInfo*
- *
- * \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_Dataset
- */
-class RoutingTableStatus
-{
-public:
-  class Error : public ndn::tlv::Error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : ndn::tlv::Error(what)
-    {
-    }
-  };
-
-  typedef std::list<RoutingTable> RTList;
-
-  RoutingTableStatus();
-
-  explicit
-  RoutingTableStatus(const ndn::Block& block);
-
-  const std::list<RoutingTable>&
-  getRoutingtable() const
-  {
-    return m_routingtables;
-  }
-
-  RoutingTableStatus&
-  addRoutingTable(const RoutingTable& routeTable);
-
-  RoutingTableStatus&
-  clearRoutingTable();
-
-  bool
-  hasRoutingTable();
-
-  template<ndn::encoding::Tag TAG>
-  size_t
-  wireEncode(ndn::EncodingImpl<TAG>& block) const;
-
-  const ndn::Block&
-  wireEncode() const;
-
-  void
-  wireDecode(const ndn::Block& wire);
-
-private:
-  RTList m_routingtables;
-  bool m_hasRoutingtable;
-
-  mutable ndn::Block m_wire;
-};
-
-NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(RoutingTableStatus);
-
-std::ostream&
-operator<<(std::ostream& os, const RoutingTableStatus& rtStatus);
-
-} // namespace tlv
-} // namespace nlsr
-
-#endif // NLSR_TLV_ROUTING_TABLE_STATUS_HPP
diff --git a/tests/publisher/test-dataset-interest-handler.cpp b/tests/publisher/test-dataset-interest-handler.cpp
index 7342f62..2ec5d35 100644
--- a/tests/publisher/test-dataset-interest-handler.cpp
+++ b/tests/publisher/test-dataset-interest-handler.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,10 +17,10 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "publisher/dataset-interest-handler.hpp"
-#include "tlv/tlv-nlsr.hpp"
+#include "tlv-nlsr.hpp"
 
 #include "tests/test-common.hpp"
 #include "publisher-fixture.hpp"
diff --git a/tests/test-hyperbolic-calculator.cpp b/tests/route/test-hyperbolic-calculator.cpp
similarity index 98%
rename from tests/test-hyperbolic-calculator.cpp
rename to tests/route/test-hyperbolic-calculator.cpp
index 2a787ba..a697e2e 100644
--- a/tests/test-hyperbolic-calculator.cpp
+++ b/tests/route/test-hyperbolic-calculator.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,14 +17,13 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
-#include "test-common.hpp"
+#include "../test-common.hpp"
 
 #include "route/routing-table-calculator.hpp"
 
 #include "adjacency-list.hpp"
-//#include "lsa.hpp"
 #include "lsdb.hpp"
 #include "nlsr.hpp"
 #include "route/map.hpp"
diff --git a/tests/test-link-state-calculator.cpp b/tests/route/test-link-state-calculator.cpp
similarity index 99%
rename from tests/test-link-state-calculator.cpp
rename to tests/route/test-link-state-calculator.cpp
index f43c4f6..a0d04df 100644
--- a/tests/test-link-state-calculator.cpp
+++ b/tests/route/test-link-state-calculator.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,15 +17,14 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "route/routing-table-calculator.hpp"
 
 #include "adjacency-list.hpp"
-//#include "lsa.hpp"
 #include "lsdb.hpp"
 #include "nlsr.hpp"
-#include "test-common.hpp"
+#include "../test-common.hpp"
 #include "route/map.hpp"
 #include "route/routing-table.hpp"
 #include "adjacent.hpp"
diff --git a/tests/route/test-map-entry.cpp b/tests/route/test-map-entry.cpp
deleted file mode 100644
index 0429dde..0000000
--- a/tests/route/test-map-entry.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2019,  The University of Memphis,
- *                           Regents of the University of California
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author Ashlesh Gawande <agawande@memphis.edu>
- **/
-
-#include "route/map.hpp"
-#include "tests/boost-test.hpp"
-
-namespace nlsr {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TestMapEntry)
-
-BOOST_AUTO_TEST_CASE(MapEntryConstructorAndGetters)
-{
-  std::string rtr = "r0";
-
-  MapEntry me1(rtr, 1);
-
-  BOOST_CHECK_EQUAL(me1.getRouter(), "r0");
-
-  BOOST_CHECK_EQUAL(me1.getMappingNumber(), 1);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace nlsr
diff --git a/tests/route/test-nexthop-list.cpp b/tests/route/test-nexthop-list.cpp
index 5bdef4d..9ab8572 100644
--- a/tests/route/test-nexthop-list.cpp
+++ b/tests/route/test-nexthop-list.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2019,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "route/nexthop-list.hpp"
 #include "route/nexthop.hpp"
@@ -101,7 +101,7 @@
   NexthopList::iterator it = list.begin();
   BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), hopA.getConnectingFaceUri());
 
-  list.reset();
+  list.clear();
   list.addNextHop(hopZ);
   list.addNextHop(hopA);
 
@@ -118,7 +118,7 @@
   shortUriHop.setRouteCost(25);
   shortUriHop.setConnectingFaceUri("AAA");
 
-  list.reset();
+  list.clear();
   list.addNextHop(longUriHop);
   list.addNextHop(shortUriHop);
 
diff --git a/tests/route/test-nexthop.cpp b/tests/route/test-nexthop.cpp
index 3a6a5fd..a11c221 100644
--- a/tests/route/test-nexthop.cpp
+++ b/tests/route/test-nexthop.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2019,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -16,9 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author Ashlesh Gawande <agawande@memphis.edu>
- **/
+ */
 
 #include "route/nexthop.hpp"
 #include "tests/boost-test.hpp"
@@ -102,6 +100,50 @@
   BOOST_CHECK(hop1.getRouteCostAsAdjustedInteger() > hop2.getRouteCostAsAdjustedInteger());
 }
 
+const uint8_t NexthopData[] =
+{
+  // Header
+  0x8f, 0x1d,
+  // Uri
+  0x8d, 0x11, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f,
+  0x70, 0x2f, 0x74, 0x6c, 0x76,
+  // Cost
+  0x86, 0x08, 0x3f, 0xfa, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66
+};
+
+BOOST_AUTO_TEST_CASE(NexthopEncode)
+{
+  NextHop nexthops1;
+  nexthops1.setConnectingFaceUri("/test/nexthop/tlv");
+  nexthops1.setRouteCost(1.65);
+
+  const ndn::Block& wire = nexthops1.wireEncode();
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(NexthopData,
+                                  NexthopData + sizeof(NexthopData),
+                                  wire.begin(), wire.end());
+}
+
+BOOST_AUTO_TEST_CASE(NexthopDecode)
+{
+  NextHop nexthops1;
+
+  nexthops1.wireDecode(ndn::Block(NexthopData, sizeof(NexthopData)));
+
+  BOOST_REQUIRE_EQUAL(nexthops1.getConnectingFaceUri(), "/test/nexthop/tlv");
+  BOOST_REQUIRE_EQUAL(nexthops1.getRouteCost(), 1.65);
+}
+
+BOOST_AUTO_TEST_CASE(AdjacencyOutputStream)
+{
+  NextHop nexthops1;
+  nexthops1.setConnectingFaceUri("/test/nexthop/tlv");
+  nexthops1.setRouteCost(99);
+
+  std::ostringstream os;
+  os << nexthops1;
+  BOOST_CHECK_EQUAL(os.str(), "NextHop(Uri: /test/nexthop/tlv, Cost: 99)");
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace test
diff --git a/tests/route/test-routing-table-entry.cpp b/tests/route/test-routing-table-entry.cpp
index 574abc2..c17b981 100644
--- a/tests/route/test-routing-table-entry.cpp
+++ b/tests/route/test-routing-table-entry.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2019,  The University of Memphis,
+/*
+ * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -16,9 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author Ashlesh Gawande <agawande@memphis.edu>
- **/
+ */
 
 #include "route/routing-table-entry.hpp"
 #include "tests/boost-test.hpp"
@@ -35,6 +33,134 @@
   BOOST_CHECK_EQUAL(rte1.getDestination(), "router1");
 }
 
+const uint8_t RoutingTableEntryWithNexthopsData[] =
+{
+  // Header
+  0x91, 0x35,
+  // Destination Name
+  0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31, 0x8f, 0x14,
+  // Nexthop
+  0x8d, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x31, 0x86, 0x08, 0x3f, 0xfa,
+  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x14, 0x8d, 0x08,
+  // Nexthop
+  0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x32, 0x86, 0x08, 0x3f, 0xfa, 0x66, 0x66,
+  0x66, 0x66, 0x66, 0x66
+};
+
+const uint8_t RoutingTableEntryWithoutNexthopsData[] =
+{
+  // Header
+  0x91, 0x09,
+  // Destination Name
+  0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31
+};
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryEncodeWithNexthops)
+{
+  RoutingTableEntry rte(ndn::Name("dest1"));
+
+  NextHop nexthops1;
+  nexthops1.setConnectingFaceUri("nexthop1");
+  nexthops1.setRouteCost(1.65);
+  rte.getNexthopList().addNextHop(nexthops1);
+
+  NextHop nexthops2;
+  nexthops2.setConnectingFaceUri("nexthop2");
+  nexthops2.setRouteCost(1.65);
+  rte.getNexthopList().addNextHop(nexthops2);
+
+  const ndn::Block& wire = rte.wireEncode();
+
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableEntryWithNexthopsData,
+                                  RoutingTableEntryWithNexthopsData +
+                                    sizeof(RoutingTableEntryWithNexthopsData),
+                                  wire.begin(), wire.end());
+}
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryDecodeWithNexthops)
+{
+  RoutingTableEntry rte(ndn::Block(RoutingTableEntryWithNexthopsData,
+                                   sizeof(RoutingTableEntryWithNexthopsData)));
+  BOOST_CHECK_EQUAL(rte.getDestination(), "dest1");
+
+  BOOST_CHECK(rte.getNexthopList().size() != 0);
+  auto it = rte.getNexthopList().begin();
+  BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), "nexthop1");
+  BOOST_CHECK_EQUAL(it->getRouteCost(), 1.65);
+
+  it++;
+  BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), "nexthop2");
+  BOOST_CHECK_EQUAL(it->getRouteCost(), 1.65);
+}
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryEncodeWithoutNexthops)
+{
+  RoutingTableEntry rte(ndn::Name("dest1"));
+
+  auto wire = rte.wireEncode();
+
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableEntryWithoutNexthopsData,
+                                  RoutingTableEntryWithoutNexthopsData +
+                                    sizeof(RoutingTableEntryWithoutNexthopsData),
+                                  wire.begin(), wire.end());
+}
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryDecodeWithoutNexthops)
+{
+  RoutingTableEntry rte(ndn::Block(RoutingTableEntryWithoutNexthopsData,
+                                   sizeof(RoutingTableEntryWithoutNexthopsData)));
+
+  BOOST_CHECK_EQUAL(rte.getDestination(), "dest1");
+  BOOST_CHECK(rte.getNexthopList().size() == 0);
+}
+
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryClear)
+{
+  RoutingTableEntry rte(ndn::Name("dest1"));
+
+  NextHop nexthops1;
+  nexthops1.setConnectingFaceUri("nexthop1");
+  nexthops1.setRouteCost(99);
+  rte.getNexthopList().addNextHop(nexthops1);
+
+  BOOST_CHECK_EQUAL(rte.getNexthopList().size(), 1);
+
+  auto it = rte.getNexthopList().begin();
+  BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), "nexthop1");
+  BOOST_CHECK_EQUAL(it->getRouteCost(), 99);
+
+  rte.getNexthopList().clear();
+  BOOST_CHECK_EQUAL(rte.getNexthopList().size(), 0);
+
+  NextHop nexthops2;
+  nexthops2.setConnectingFaceUri("nexthop2");
+  nexthops2.setRouteCost(99);
+  rte.getNexthopList().addNextHop(nexthops2);
+
+  BOOST_CHECK_EQUAL(rte.getNexthopList().size(), 1);
+  it =  rte.getNexthopList().begin();
+  BOOST_CHECK_EQUAL(it->getConnectingFaceUri(), "nexthop2");
+  BOOST_CHECK_EQUAL(it->getRouteCost(), 99);
+}
+
+BOOST_AUTO_TEST_CASE(RoutingTableEntryOutputStream)
+{
+  RoutingTableEntry rte(ndn::Name("dest1"));
+
+  NextHop nexthops1;
+  nexthops1.setConnectingFaceUri("nexthop1");
+  nexthops1.setRouteCost(99);
+  rte.getNexthopList().addNextHop(nexthops1);
+
+  std::ostringstream os;
+  os << rte;
+
+  BOOST_CHECK_EQUAL(os.str(),
+                    "  Destination: /dest1\n"
+                    "    NextHop(Uri: nexthop1, Cost: 99)\n");
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace test
diff --git a/tests/route/test-routing-table.cpp b/tests/route/test-routing-table.cpp
index f8a7df5..0bce153 100644
--- a/tests/route/test-routing-table.cpp
+++ b/tests/route/test-routing-table.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California
  *
@@ -16,9 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author Ashlesh Gawande <agawande@memphis.edu>
- **/
+ */
 
 #include "route/routing-table.hpp"
 #include "nlsr.hpp"
@@ -30,23 +28,106 @@
 namespace nlsr {
 namespace test {
 
-BOOST_FIXTURE_TEST_SUITE(TestRoutingTable, BaseFixture)
-
-BOOST_AUTO_TEST_CASE(RoutingTableAddNextHop)
+class RoutingTableFixture
 {
+public:
+  RoutingTableFixture()
+    : conf(face, keyChain)
+    , nlsr(face, keyChain, conf)
+    , rt(nlsr.m_routingTable)
+  {
+  }
+
+public:
   ndn::util::DummyClientFace face;
   ndn::KeyChain keyChain;
-  ConfParameter conf(face, keyChain);
-  Nlsr nlsr(face, keyChain, conf);
+  ConfParameter conf;
+  Nlsr nlsr;
 
-  RoutingTable rt1(m_scheduler, nlsr.m_fib, nlsr.m_lsdb,
-                   nlsr.m_namePrefixTable, conf);
+  RoutingTable& rt;
+};
 
+BOOST_AUTO_TEST_SUITE(TestRoutingTable)
+
+BOOST_FIXTURE_TEST_CASE(RoutingTableAddNextHop, RoutingTableFixture)
+{
   NextHop nh1;
   const std::string DEST_ROUTER = "destRouter";
-  rt1.addNextHop(DEST_ROUTER, nh1);
+  rt.addNextHop(DEST_ROUTER, nh1);
 
-  BOOST_CHECK_EQUAL(rt1.findRoutingTableEntry(DEST_ROUTER)->getDestination(), DEST_ROUTER);
+  BOOST_CHECK_EQUAL(rt.findRoutingTableEntry(DEST_ROUTER)->getDestination(), DEST_ROUTER);
+}
+
+const uint8_t RoutingTableData1[] =
+{
+  // Header
+  0x90, 0x20,
+  // Routing table entry
+  0x91, 0x1e,
+  // Destination
+  0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31, 0x8f, 0x13,
+  // Nexthop
+  0x8d, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x86, 0x08, 0x3f, 0xfa, 0x66,
+  0x66, 0x66, 0x66, 0x66, 0x66
+};
+
+const uint8_t RoutingTableData2[] =
+{
+  // Header
+  0x90, 0x00
+};
+
+BOOST_FIXTURE_TEST_CASE(RoutingTableEncode1, RoutingTableFixture)
+{
+  NextHop nexthops;
+  nexthops.setConnectingFaceUri("nexthop");
+  nexthops.setRouteCost(1.65);
+  rt.addNextHop("dest1", nexthops);
+
+  auto wire = rt.wireEncode();
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData1,
+                                  RoutingTableData1 + sizeof(RoutingTableData1),
+                                  wire.begin(), wire.end());
+}
+
+BOOST_FIXTURE_TEST_CASE(RoutingTableEncode2, RoutingTableFixture)
+{
+  auto wire = rt.wireEncode();
+  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData2,
+                                  RoutingTableData2 + sizeof(RoutingTableData2),
+                                  wire.begin(), wire.end());
+}
+
+BOOST_FIXTURE_TEST_CASE(RoutingTableDecode1, RoutingTableFixture)
+{
+  RoutingTableStatus rtStatus(ndn::Block(RoutingTableData1, sizeof(RoutingTableData1)));
+
+  auto it1 = rtStatus.m_rTable.begin();
+
+  ndn::Name des1 = it1->getDestination();
+  BOOST_CHECK_EQUAL(des1, "dest1");
+
+  auto it2 = it1->getNexthopList().begin();
+  BOOST_CHECK_EQUAL(it2->getConnectingFaceUri(), "nexthop");
+  BOOST_CHECK_EQUAL(it2->getRouteCost(), 1.65);
+
+  BOOST_CHECK_EQUAL(rtStatus.m_rTable.size(), 1);
+}
+
+BOOST_FIXTURE_TEST_CASE(RoutingTableOutputStream, RoutingTableFixture)
+{
+  NextHop nexthops;
+  nexthops.setConnectingFaceUri("nexthop");
+  nexthops.setRouteCost(99);
+  rt.addNextHop("dest1", nexthops);
+
+  std::ostringstream os;
+  os << rt;
+
+  BOOST_CHECK_EQUAL(os.str(),
+                    "Routing Table:\n"
+                    "  Destination: /dest1\n"
+                    "    NextHop(Uri: nexthop, Cost: 99)\n");
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/tlv/test-destination.cpp b/tests/tlv/test-destination.cpp
deleted file mode 100644
index adc153e..0000000
--- a/tests/tlv/test-destination.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "tlv/destination.hpp"
-
-#include "tests/boost-test.hpp"
-
-namespace nlsr {
-namespace tlv {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TlvTestDes)
-
-const uint8_t DesData[] =
-{
-  // Header
-  0x8e, 0x13,
-  // Routername 746573742f646573742f746c76
-  0x07, 0x11, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x08, 0x04, 0x64, 0x65, 0x73, 0x74,
-  0x08, 0x03, 0x74, 0x6c, 0x76
-};
-
-BOOST_AUTO_TEST_CASE(DesEncode)
-{
-  Destination des1;
-  des1.setName("/test/dest/tlv");
-
-  const ndn::Block& wire = des1.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(DesData,
-                                  DesData + sizeof(DesData),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(DesDecode)
-{
-  Destination des1;
-
-  des1.wireDecode(ndn::Block(DesData, sizeof(DesData)));
-
-  ndn::Name DEST_NAME = ndn::Name("/test/dest/tlv");
-  BOOST_REQUIRE_EQUAL(des1.getName(), DEST_NAME);
-}
-
-BOOST_AUTO_TEST_CASE(DesOutputStream)
-{
-  Destination des1;
-  des1.setName("/test/dest/tlv");
-
-  std::ostringstream os;
-  os << des1;
-
-  BOOST_CHECK_EQUAL(os.str(), "Destination: /test/dest/tlv");
-}
-
-BOOST_AUTO_TEST_CASE(DesMake)
-{
-  RoutingTableEntry rte("/test/dest/tlv");
-
-  std::shared_ptr<Destination> des = makeDes(rte);
-  BOOST_CHECK_EQUAL(des->getName(), rte.getDestination());
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace tlv
-} // namespace nlsr
diff --git a/tests/tlv/test-nexthops.cpp b/tests/tlv/test-nexthops.cpp
deleted file mode 100644
index f5b4d29..0000000
--- a/tests/tlv/test-nexthops.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "tlv/nexthop.hpp"
-
-#include "tests/boost-test.hpp"
-
-namespace nlsr {
-namespace tlv {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TlvTestNexthops)
-
-const uint8_t NexthopData[] =
-{
-  // Header
-  0x8f, 0x1d,
-  // Uri
-  0x8d, 0x11, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f,
-  0x70, 0x2f, 0x74, 0x6c, 0x76,
-  // Cost
-  0x86, 0x08, 0x3f, 0xfa, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66
-};
-
-BOOST_AUTO_TEST_CASE(NexthopEncode)
-{
-  NextHop nexthops1;
-  nexthops1.setUri("/test/nexthop/tlv");
-  nexthops1.setCost(1.65);
-
-  const ndn::Block& wire = nexthops1.wireEncode();
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(NexthopData,
-                                  NexthopData + sizeof(NexthopData),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(NexthopDecode)
-{
-  NextHop nexthops1;
-
-  nexthops1.wireDecode(ndn::Block(NexthopData, sizeof(NexthopData)));
-
-  BOOST_REQUIRE_EQUAL(nexthops1.getUri(), "/test/nexthop/tlv");
-  BOOST_REQUIRE_EQUAL(nexthops1.getCost(), 1.65);
-}
-
-BOOST_AUTO_TEST_CASE(AdjacencyOutputStream)
-{
-  NextHop nexthops1;
-  nexthops1.setUri("/test/nexthop/tlv");
-  nexthops1.setCost(99);
-
-  std::ostringstream os;
-  os << nexthops1;
-  BOOST_CHECK_EQUAL(os.str(), "NextHop(Uri: /test/nexthop/tlv, Cost: 99)\n");
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace tlv
-} // namespace nlsr
diff --git a/tests/tlv/test-routing-table-entry.cpp b/tests/tlv/test-routing-table-entry.cpp
deleted file mode 100644
index 338945b..0000000
--- a/tests/tlv/test-routing-table-entry.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "tlv/routing-table-entry.hpp"
-
-#include "tests/boost-test.hpp"
-
-namespace nlsr {
-namespace tlv {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TlvTestRoutingTableEntry)
-
-const uint8_t RoutingTableEntryWithNexthopsData[] =
-{
-  // Header
-  0x91, 0x37,
-  // Destination
-  0x8e, 0x09, 0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31,
-  // Nexthop
-  0x8f, 0x14, 0x8d, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x31, 0x86, 0x08,
-  0x3f, 0xfa, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x8f, 0x14,
-  // Nexthop
-  0x8d, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x32, 0x86, 0x08, 0x3f, 0xfa,
-  0x66, 0x66, 0x66, 0x66, 0x66, 0x66
-};
-
-const uint8_t RoutingTableEntryWithoutNexthopsData[] =
-{
-  // Header
-  0x91, 0x0b,
-  // Destination
-  0x8e, 0x09, 0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31
-};
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryEncodeWithNexthops)
-{
-  RoutingTable rt;
-
-  Destination des1;
-  des1.setName("dest1");
-  rt.setDestination(des1);
-
-  NextHop nexthops1;
-  nexthops1.setUri("nexthop1");
-  nexthops1.setCost(1.65);
-  rt.addNexthops(nexthops1);
-
-  NextHop nexthops2;
-  nexthops2.setUri("nexthop2");
-  nexthops2.setCost(1.65);
-  rt.addNexthops(nexthops2);
-
-  const ndn::Block& wire = rt.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableEntryWithNexthopsData,
-                                  RoutingTableEntryWithNexthopsData +
-                                    sizeof(RoutingTableEntryWithNexthopsData),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryDecodeWithNexthops)
-{
-  RoutingTable rt;
-
-  rt.wireDecode(ndn::Block(RoutingTableEntryWithNexthopsData,
-                                      sizeof(RoutingTableEntryWithNexthopsData)));
-
-  Destination des = rt.getDestination();
-  BOOST_CHECK_EQUAL(des.getName(), "dest1");
-
-  BOOST_CHECK_EQUAL(rt.hasNexthops(), true);
-  std::list<NextHop> nexthops = rt.getNextHops();
-  std::list<NextHop>::const_iterator it = nexthops.begin();
-  BOOST_CHECK_EQUAL(it->getUri(), "nexthop1");
-  BOOST_CHECK_EQUAL(it->getCost(), 1.65);
-
-  it++;
-  BOOST_CHECK_EQUAL(it->getUri(), "nexthop2");
-  BOOST_CHECK_EQUAL(it->getCost(), 1.65);
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryEncodeWithoutNexthops)
-{
-  RoutingTable rt;
-
-  Destination des1;
-  des1.setName("dest1");
-  rt.setDestination(des1);
-
-  const ndn::Block& wire = rt.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableEntryWithoutNexthopsData,
-                                  RoutingTableEntryWithoutNexthopsData +
-                                    sizeof(RoutingTableEntryWithoutNexthopsData),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryDecodeWithoutNexthops)
-{
-  RoutingTable rt;
-
-  rt.wireDecode(ndn::Block(RoutingTableEntryWithoutNexthopsData,
-                           sizeof(RoutingTableEntryWithoutNexthopsData)));
-
-  Destination des = rt.getDestination();
-  BOOST_CHECK_EQUAL(des.getName(), "dest1");
-
-  BOOST_CHECK_EQUAL(rt.hasNexthops(), false);
-}
-
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryClear)
-{
-  RoutingTable rt;
-  Destination des1;
-  des1.setName("dest1");
-  rt.setDestination(des1);
-
-  NextHop nexthops1;
-  nexthops1.setUri("nexthop1");
-  nexthops1.setCost(99);
-  rt.addNexthops(nexthops1);
-
-  BOOST_CHECK_EQUAL(rt.getNextHops().size(), 1);
-
-  std::list<NextHop> nexthops = rt.getNextHops();
-  std::list<NextHop>::const_iterator it = nexthops.begin();
-  BOOST_CHECK_EQUAL(it->getUri(), "nexthop1");
-  BOOST_CHECK_EQUAL(it->getCost(), 99);
-
-  rt.clearNexthops();
-  BOOST_CHECK_EQUAL(rt.getNextHops().size(), 0);
-
-  NextHop nexthops2;
-  nexthops2.setUri("nexthop2");
-  nexthops2.setCost(99);
-  rt.addNexthops(nexthops2);
-
-  BOOST_CHECK_EQUAL(rt.getNextHops().size(), 1);
-
-  nexthops = rt.getNextHops();
-  it = nexthops.begin();
-  BOOST_CHECK_EQUAL(it->getUri(), "nexthop2");
-  BOOST_CHECK_EQUAL(it->getCost(), 99);
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableEntryOutputStream)
-{
-  RoutingTable rt;
-  Destination des1;
-  des1.setName("dest1");
-  rt.setDestination(des1);
-
-  NextHop nexthops1;
-  nexthops1.setUri("nexthop1");
-  nexthops1.setCost(99);
-  rt.addNexthops(nexthops1);
-
-  std::ostringstream os;
-  os << rt;
-
-  BOOST_CHECK_EQUAL(os.str(),
-                    "Destination: /dest1\n"
-                    "NexthopList(\n"
-                    "NextHop(Uri: nexthop1, Cost: 99)\n"
-                    ")");
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace tlv
-} // namespace nlsr
diff --git a/tests/tlv/test-routing-table.cpp b/tests/tlv/test-routing-table.cpp
deleted file mode 100644
index 70c25c9..0000000
--- a/tests/tlv/test-routing-table.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2020,  The University of Memphis,
- *                           Regents of the University of California,
- *                           Arizona Board of Regents.
- *
- * This file is part of NLSR (Named-data Link State Routing).
- * See AUTHORS.md for complete list of NLSR authors and contributors.
- *
- * NLSR is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
-
-#include "tlv/routing-table-status.hpp"
-
-#include "tests/boost-test.hpp"
-
-namespace nlsr {
-namespace tlv {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TlvTestRoutingTable)
-
-const uint8_t RoutingTableData1[] =
-{
-  // Header
-  0x90, 0x22,
-  // Routing table entry
-  0x91, 0x20,
-  // Destination
-  0x8e, 0x09, 0x07, 0x07, 0x08, 0x05, 0x64, 0x65, 0x73, 0x74, 0x31,
-  // Nexthop
-  0x8f, 0x13, 0x8d, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x68, 0x6f, 0x70, 0x86, 0x08, 0x3f,
-  0xfa, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66
-};
-
-const uint8_t RoutingTableData2[] =
-{
-  // Header
-  0x90, 0x00
-};
-
-BOOST_AUTO_TEST_CASE(RoutingTableEncode1)
-{
-  RoutingTableStatus rtStatus;
-
-  Destination des;
-  des.setName("dest1");
-
-  // RoutingtableEntry
-  RoutingTable rt;
-  rt.setDestination(des);
-
-  NextHop nexthops;
-  nexthops.setUri("nexthop");
-  nexthops.setCost(1.65);
-  rt.addNexthops(nexthops);
-
-  rtStatus.addRoutingTable(rt);
-
-  const ndn::Block& wire = rtStatus.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData1,
-                                  RoutingTableData1 + sizeof(RoutingTableData1),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableEncode2)
-{
-  RoutingTableStatus rtStatus;
-
-  const ndn::Block& wire = rtStatus.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(RoutingTableData2,
-                                  RoutingTableData2 + sizeof(RoutingTableData2),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableDecode1)
-{
-  RoutingTableStatus rtStatus;
-
-  rtStatus.wireDecode(ndn::Block(RoutingTableData1, sizeof(RoutingTableData1)));
-
-  std::list<RoutingTable> rte = rtStatus.getRoutingtable();
-  std::list<RoutingTable>::const_iterator it1 = rte.begin();
-
-  Destination des1 = it1->getDestination();
-  BOOST_CHECK_EQUAL(des1.getName(), "dest1");
-
-  std::list<NextHop> nexthops = it1->getNextHops();
-  std::list<NextHop>::const_iterator it2 = nexthops.begin();
-  BOOST_CHECK_EQUAL(it2->getUri(), "nexthop");
-  BOOST_CHECK_EQUAL(it2->getCost(), 1.65);
-
-  BOOST_CHECK_EQUAL(rtStatus.hasRoutingTable(), true);
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableDecode2)
-{
-  RoutingTableStatus rtStatus;
-  rtStatus.wireDecode(ndn::Block(RoutingTableData2, sizeof(RoutingTableData2)));
-
-  BOOST_CHECK_EQUAL(rtStatus.hasRoutingTable(), false);
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableClear)
-{
-  RoutingTableStatus rtStatus;
-  Destination des;
-  des.setName("dest1");
-
-  // RoutingtableEntry
-  RoutingTable rt;
-  rt.setDestination(des);
-
-  NextHop nexthops;
-  nexthops.setUri("nexthop");
-  nexthops.setCost(1.65);
-  rt.addNexthops(nexthops);
-
-  rtStatus.addRoutingTable(rt);
-
-  BOOST_CHECK_EQUAL(rtStatus.hasRoutingTable(), true);
-  rtStatus.clearRoutingTable();
-  BOOST_CHECK_EQUAL(rtStatus.hasRoutingTable(), false);
-}
-
-BOOST_AUTO_TEST_CASE(RoutingTableOutputStream)
-{
-  RoutingTableStatus rtStatus;
-  Destination des;
-  des.setName("dest1");
-
-  // RoutingtableEntry
-  RoutingTable rt;
-  rt.setDestination(des);
-
-  NextHop nexthops;
-  nexthops.setUri("nexthop");
-  nexthops.setCost(99);
-  rt.addNexthops(nexthops);
-
-  rtStatus.addRoutingTable(rt);
-
-  std::ostringstream os;
-  os << rtStatus;
-
-  BOOST_CHECK_EQUAL(os.str(), "Routing Table Status: \n"
-                                  "Destination: /dest1\n"
-                                  "NexthopList(\n"
-                                  "NextHop(Uri: nexthop, Cost: 99)\n"
-                                  ")");
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace tlv
-} // namespace nlsr
diff --git a/tools/nlsrc.cpp b/tools/nlsrc.cpp
index a943b85..b54eb43 100644
--- a/tools/nlsrc.cpp
+++ b/tools/nlsrc.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "nlsrc.hpp"
 
@@ -273,10 +273,7 @@
 void
 Nlsrc::fetchRtables()
 {
-  fetchFromRt<nlsr::tlv::RoutingTableStatus>(
-    [this] (const nlsr::tlv::RoutingTableStatus& rts) {
-      recordRtable(rts);
-    });
+  fetchFromRt<nlsr::RoutingTableStatus>([this] (const auto& rts) { recordRtable(rts); });
 }
 
 template <class T>
@@ -373,24 +370,10 @@
 }
 
 void
-Nlsrc::recordRtable(const nlsr::tlv::RoutingTableStatus& rts)
+Nlsrc::recordRtable(const nlsr::RoutingTableStatus& rts)
 {
   std::ostringstream os;
-
-  ndn::Name firstDes;
-  for (const auto& rt : rts.getRoutingtable()) {
-    if (firstDes.empty()) {
-      firstDes = rt.getDestination().getName();
-      os << rt << std::endl;
-      continue;
-    }
-
-    if (firstDes == rt.getDestination().getName()) {
-      os << "\n------Dry-run Hyperbolic Routing Tables:------- \n " << std::endl;
-    }
-    os << rt << std::endl;
-  }
-
+  os << rts;
   m_rtString = os.str();
 }
 
@@ -423,8 +406,7 @@
 Nlsrc::printRT()
 {
   if (!m_rtString.empty()) {
-    std::cout << "Routing Table" << std::endl;
-    std::cout << m_rtString << std::endl;
+    std::cout << m_rtString;
   }
   else {
     std::cout << "Routing Table is not calculated yet" << std::endl;
diff --git a/tools/nlsrc.hpp b/tools/nlsrc.hpp
index aab636c..938e82c 100644
--- a/tools/nlsrc.hpp
+++ b/tools/nlsrc.hpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2020,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
@@ -17,12 +17,12 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- **/
+ */
 
 #include "lsa/adj-lsa.hpp"
 #include "lsa/coordinate-lsa.hpp"
 #include "lsa/name-lsa.hpp"
-#include "tlv/routing-table-status.hpp"
+#include "route/routing-table.hpp"
 
 #include <boost/noncopyable.hpp>
 #include <ndn-cxx/face.hpp>
@@ -123,7 +123,7 @@
   recordLsa(const nlsr::Lsa& lsa);
 
   void
-  recordRtable(const nlsr::tlv::RoutingTableStatus& rts);
+  recordRtable(const nlsr::RoutingTableStatus& rts);
 
   void
   printLsdb();