diff --git a/src/publisher/dataset-interest-handler.cpp b/src/publisher/dataset-interest-handler.cpp
index d6f8ce7..f31cdbd 100644
--- a/src/publisher/dataset-interest-handler.cpp
+++ b/src/publisher/dataset-interest-handler.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.
  *
@@ -21,7 +21,6 @@
 
 #include "dataset-interest-handler.hpp"
 #include "nlsr.hpp"
-#include "tlv/lsdb-status.hpp"
 #include "logger.hpp"
 
 #include <ndn-cxx/mgmt/nfd/control-response.hpp>
diff --git a/src/tlv/lsdb-status.cpp b/src/tlv/lsdb-status.cpp
deleted file mode 100644
index f39cd27..0000000
--- a/src/tlv/lsdb-status.cpp
+++ /dev/null
@@ -1,239 +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 "lsdb-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<LsdbStatus>));
-BOOST_CONCEPT_ASSERT((ndn::WireDecodable<LsdbStatus>));
-static_assert(std::is_base_of<ndn::tlv::Error, LsdbStatus::Error>::value,
-              "LsdbStatus::Error must inherit from tlv::Error");
-
-LsdbStatus::LsdbStatus()
-  : m_hasAdjacencyLsas(false)
-  , m_hasCoordinateLsas(false)
-  , m_hasNameLsas(false)
-{
-}
-
-LsdbStatus::LsdbStatus(const ndn::Block& block)
-{
-  wireDecode(block);
-}
-
-LsdbStatus&
-LsdbStatus::addAdjacencyLsa(const AdjacencyLsa& adjacencyLsa)
-{
-  m_adjacencyLsas.push_back(adjacencyLsa);
-  m_wire.reset();
-  m_hasAdjacencyLsas = true;
-  return *this;
-}
-
-LsdbStatus&
-LsdbStatus::clearAdjacencyLsas()
-{
-  m_adjacencyLsas.clear();
-  m_hasAdjacencyLsas = false;
-  return *this;
-}
-
-LsdbStatus&
-LsdbStatus::addCoordinateLsa(const CoordinateLsa& coordinateLsa)
-{
-  m_coordinateLsas.push_back(coordinateLsa);
-  m_wire.reset();
-  m_hasCoordinateLsas = true;
-  return *this;
-}
-
-LsdbStatus&
-LsdbStatus::clearCoordinateLsas()
-{
-  m_coordinateLsas.clear();
-  m_hasCoordinateLsas = false;
-  return *this;
-}
-
-LsdbStatus&
-LsdbStatus::addNameLsa(const NameLsa& nameLsa)
-{
-  m_nameLsas.push_back(nameLsa);
-  m_wire.reset();
-  m_hasNameLsas = true;
-  return *this;
-}
-
-LsdbStatus&
-LsdbStatus::clearNameLsas()
-{
-  m_nameLsas.clear();
-  m_hasNameLsas = false;
-  return *this;
-}
-
-template<ndn::encoding::Tag TAG>
-size_t
-LsdbStatus::wireEncode(ndn::EncodingImpl<TAG>& block) const
-{
-  size_t totalLength = 0;
-
-  for (std::list<NameLsa>::const_reverse_iterator it = m_nameLsas.rbegin();
-       it != m_nameLsas.rend(); ++it) {
-    totalLength += it->wireEncode(block);
-  }
-
-  for (std::list<CoordinateLsa>::const_reverse_iterator it = m_coordinateLsas.rbegin();
-       it != m_coordinateLsas.rend(); ++it) {
-    totalLength += it->wireEncode(block);
-  }
-
-  for (std::list<AdjacencyLsa>::const_reverse_iterator it = m_adjacencyLsas.rbegin();
-       it != m_adjacencyLsas.rend(); ++it) {
-    totalLength += it->wireEncode(block);
-  }
-
-  totalLength += block.prependVarNumber(totalLength);
-  totalLength += block.prependVarNumber(ndn::tlv::nlsr::LsdbStatus);
-
-  return totalLength;
-}
-
-NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(LsdbStatus);
-
-const ndn::Block&
-LsdbStatus::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
-LsdbStatus::wireDecode(const ndn::Block& wire)
-{
-  m_adjacencyLsas.clear();
-  m_coordinateLsas.clear();
-  m_nameLsas.clear();
-
-  m_hasAdjacencyLsas = false;
-  m_hasCoordinateLsas = false;
-  m_hasNameLsas = false;
-
-  m_wire = wire;
-
-  if (m_wire.type() != ndn::tlv::nlsr::LsdbStatus) {
-    std::stringstream error;
-    error << "Expected LsdbStatus 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::AdjacencyLsa; ++val) {
-    m_adjacencyLsas.push_back(AdjacencyLsa(*val));
-    m_hasAdjacencyLsas = true;
-  }
-
-  for (; val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::CoordinateLsa; ++val) {
-    m_coordinateLsas.push_back(CoordinateLsa(*val));
-    m_hasCoordinateLsas = true;
-  }
-
-  for (; val != m_wire.elements_end() && val->type() == ndn::tlv::nlsr::NameLsa; ++val) {
-    m_nameLsas.push_back(NameLsa(*val));
-    m_hasNameLsas = 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 LsdbStatus& lsdbStatus)
-{
-  os << "LsdbStatus(";
-
-  bool isFirst = true;
-
-  for (const auto& adjacencyLsa : lsdbStatus.getAdjacencyLsas()) {
-    if (isFirst) {
-      isFirst = false;
-    }
-    else {
-      os << ", ";
-    }
-
-    os << adjacencyLsa;
-  }
-
-  for (const auto& coordinateLsa : lsdbStatus.getCoordinateLsas()) {
-    if (isFirst) {
-      isFirst = false;
-    }
-    else {
-      os << ", ";
-    }
-
-    os << coordinateLsa;
-  }
-
-  for (const auto& nameLsa : lsdbStatus.getNameLsas()) {
-    if (isFirst) {
-      isFirst = false;
-    }
-    else {
-      os << ", ";
-    }
-
-    os << nameLsa;
-  }
-
-  os << ")";
-
-  return os;
-}
-
-} // namespace tlv
-} // namespace nlsr
diff --git a/src/tlv/lsdb-status.hpp b/src/tlv/lsdb-status.hpp
deleted file mode 100644
index 7d93859..0000000
--- a/src/tlv/lsdb-status.hpp
+++ /dev/null
@@ -1,176 +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_LSDB_STATUS_HPP
-#define NLSR_TLV_LSDB_STATUS_HPP
-
-#include "adjacency-lsa.hpp"
-#include "coordinate-lsa.hpp"
-#include "name-lsa.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 LsdbStatus
- *
- *  LsdbStatus := LSDB-STATUS-TYPE TLV-LENGTH
- *                  AdjacencyLsa*
- *                  CoordinateLsa*
- *                  NameLsa*
- *
- * \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
- */
-class LsdbStatus
-{
-public:
-  class Error : public ndn::tlv::Error
-  {
-  public:
-    explicit
-    Error(const std::string& what)
-      : ndn::tlv::Error(what)
-    {
-    }
-  };
-
-  typedef std::list<AdjacencyLsa> AdjacencyLsaList;
-  typedef std::list<CoordinateLsa> CoordinateLsaList;
-  typedef std::list<NameLsa> NameLsaList;
-
-  LsdbStatus();
-
-  explicit
-  LsdbStatus(const ndn::Block& block);
-
-  const std::list<AdjacencyLsa>&
-  getAdjacencyLsas() const
-  {
-    return m_adjacencyLsas;
-  }
-
-  LsdbStatus&
-  addAdjacencyLsa(const AdjacencyLsa& adjacencyLsa);
-
-  LsdbStatus&
-  clearAdjacencyLsas();
-
-  bool
-  hasAdjacencyLsas()
-  {
-    return m_hasAdjacencyLsas;
-  }
-
-  const std::list<CoordinateLsa>&
-  getCoordinateLsas() const
-  {
-    return m_coordinateLsas;
-  }
-
-  LsdbStatus&
-  addCoordinateLsa(const CoordinateLsa& coordinateLsa);
-
-  LsdbStatus&
-  clearCoordinateLsas();
-
-  bool
-  hasCoordinateLsas()
-  {
-    return m_hasCoordinateLsas;
-  }
-
-  const std::list<NameLsa>&
-  getNameLsas() const
-  {
-    return m_nameLsas;
-  }
-
-  LsdbStatus&
-  addNameLsa(const NameLsa& nameLsa);
-
-  LsdbStatus&
-  clearNameLsas();
-
-  bool
-  hasNameLsas()
-  {
-    return m_hasNameLsas;
-  }
-
-  /*! \brief Encodes the LSA objects and some info for each LSA using
-   * the method in TAG.
-   *
-   * This function will TLV-format the LSA objects and some LSA
-   * info using the implementation specified by TAG. Usually this is
-   * called with an estimator first to guess how long the buffer needs
-   * to be, then with an encoder to do the real work. This process is
-   * automated by the other wireEncode.
-   * \sa LsdbStatus::wireEncode()
-   */
-  template<ndn::encoding::Tag TAG>
-  size_t
-  wireEncode(ndn::EncodingImpl<TAG>& block) const;
-
-  /*! \brief Create a TLV encoding of this object.
-   *
-   * Create a block containing the TLV encoding of this object. That
-   * involves two steps: estimating the size that the information will
-   * take up, and then creating a buffer of that size and encoding the
-   * information into it. Both steps are accomplished by
-   * LsdbStatus::wireEncode(ndn::EncodingImpl<TAG>&)
-   */
-  const ndn::Block&
-  wireEncode() const;
-
-  /*! \brief Populate this object by decoding the one contained in the
-   * given block.
-   */
-  void
-  wireDecode(const ndn::Block& wire);
-
-private:
-  AdjacencyLsaList m_adjacencyLsas;
-  CoordinateLsaList m_coordinateLsas;
-  NameLsaList m_nameLsas;
-
-  bool m_hasAdjacencyLsas;
-  bool m_hasCoordinateLsas;
-  bool m_hasNameLsas;
-
-  mutable ndn::Block m_wire;
-};
-
-NDN_CXX_DECLARE_WIRE_ENCODE_INSTANTIATIONS(LsdbStatus);
-
-std::ostream&
-operator<<(std::ostream& os, const LsdbStatus& lsdbStatus);
-
-} // namespace tlv
-} // namespace nlsr
-
-#endif // NLSR_TLV_LSDB_STATUS_HPP
diff --git a/tests/tlv/test-lsdb-status.cpp b/tests/tlv/test-lsdb-status.cpp
deleted file mode 100644
index 0c87774..0000000
--- a/tests/tlv/test-lsdb-status.cpp
+++ /dev/null
@@ -1,372 +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,
- *                           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/lsdb-status.hpp"
-
-#include "tests/boost-test.hpp"
-
-#include <boost/mpl/vector.hpp>
-#include <boost/lexical_cast.hpp>
-
-namespace nlsr {
-namespace tlv {
-namespace test {
-
-BOOST_AUTO_TEST_SUITE(TlvTestLsdbStatus)
-
-const uint8_t LsdbStatusData1[] =
-{
-  // Header
-  0x8a, 0x7b,
-  // AdjacencyLsa
-  0x83, 0x32,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8b, 0x02, 0x27, 0x10,
-    // Adjacency
-    0x84, 0x1d, 0x07, 0x0c, 0x08, 0x0a, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x63,
-    0x79, 0x31, 0x8d, 0x0a, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x31,
-    0x8c, 0x01, 0x80,
-  // CoordinateLsa
-  0x85, 0x27,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8b, 0x02, 0x27, 0x10,
-    // HyperbolicRadius
-    0x87, 0x08, 0x3f, 0xfa, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-    // HyperbolicAngle
-    0x88, 0x08, 0x3f, 0xfc, 0x7a, 0xe1, 0x47, 0xae, 0x14, 0x7b,
-  // NameLsa
-  0x89, 0x1c,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8b, 0x02, 0x27, 0x10,
-    // Name
-    0x07, 0x07, 0x08, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x31
-};
-
-const uint8_t LsdbStatusData2[] =
-{
-  // Header
-  0x8a, 0x00
-};
-
-const uint8_t LsdbStatusData3[] =
-{
-  // Header
-  0x8a, 0x7b,
-  // CoordianteLsa
-  0x85, 0x27,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8B, 0x02, 0x27, 0x10,
-    // HyperbolicRadius
-    0x87, 0x08, 0x3F, 0xFA, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
-    // HyperbolicAngle
-    0x88, 0x08, 0x3F, 0xFC, 0x7A, 0xE1, 0x47, 0xAE, 0x14, 0x7B,
-  // NameLsa
-  0x89, 0x1c,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8b, 0x02, 0x27, 0x10,
-    // Name
-    0x07, 0x07, 0x08, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x31,
-  // AdjacencyLsa
-  0x83, 0x32,
-    // LsaInfo
-    0x80, 0x11, 0x81, 0x08, 0x07, 0x06, 0x08, 0x04, 0x74, 0x65, 0x73, 0x74, 0x82, 0x01,
-    0x80, 0x8B, 0x02, 0x27, 0x10,
-    // Adjacency
-    0x84, 0x1d, 0x07, 0x0c, 0x08, 0x0a, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x63,
-    0x79, 0x31, 0x8d, 0x0a, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x31,
-    0x8c, 0x01, 0x80
-};
-
-BOOST_AUTO_TEST_CASE(LsdbStatusEncode1)
-{
-  LsdbStatus lsdbStatus;
-
-  LsaInfo lsaInfo;
-  lsaInfo.setOriginRouter("test");
-  lsaInfo.setSequenceNumber(128);
-  lsaInfo.setExpirationPeriod(ndn::time::milliseconds(10000));
-
-  // AdjacencyLsa
-  AdjacencyLsa adjacencyLsa;
-  adjacencyLsa.setLsaInfo(lsaInfo);
-
-  Adjacency adjacency1;
-  adjacency1.setName("adjacency1");
-  adjacency1.setUri("adjacency1");
-  adjacency1.setCost(128);
-  adjacencyLsa.addAdjacency(adjacency1);
-
-  lsdbStatus.addAdjacencyLsa(adjacencyLsa);
-
-  // CoordinateLsa
-  CoordinateLsa coordinateLsa;
-  coordinateLsa.setLsaInfo(lsaInfo);
-
-  coordinateLsa.setHyperbolicRadius(1.65);
-  std::vector<double> angles;
-  angles.push_back(1.78);
-  coordinateLsa.setHyperbolicAngle(angles);
-
-  lsdbStatus.addCoordinateLsa(coordinateLsa);
-
-  // NameLsa
-  NameLsa nameLsa;
-  nameLsa.setLsaInfo(lsaInfo);
-  nameLsa.addName("name1");
-
-  lsdbStatus.addNameLsa(nameLsa);
-
-  const ndn::Block& wire = lsdbStatus.wireEncode();
-
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(LsdbStatusData1,
-                                  LsdbStatusData1 + sizeof(LsdbStatusData1),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(LsdbStatusEncode2)
-{
-  LsdbStatus lsdbStatus;
-
-  const ndn::Block& wire = lsdbStatus.wireEncode();
-  BOOST_REQUIRE_EQUAL_COLLECTIONS(LsdbStatusData2,
-                                  LsdbStatusData2 + sizeof(LsdbStatusData2),
-                                  wire.begin(), wire.end());
-}
-
-BOOST_AUTO_TEST_CASE(LsdbStatusDecode1)
-{
-  LsdbStatus lsdbStatus;
-
-  lsdbStatus.wireDecode(ndn::Block(LsdbStatusData1, sizeof(LsdbStatusData1)));
-
-  std::list<AdjacencyLsa> adjacencyLsas = lsdbStatus.getAdjacencyLsas();
-  std::list<AdjacencyLsa>::const_iterator it1 = adjacencyLsas.begin();
-
-  LsaInfo lsaInfo = it1->getLsaInfo();
-  BOOST_CHECK_EQUAL(lsaInfo.getOriginRouter(), "test");
-  BOOST_CHECK_EQUAL(lsaInfo.getSequenceNumber(), 128);
-  BOOST_CHECK_EQUAL(lsaInfo.getExpirationPeriod(), ndn::time::milliseconds(10000));
-
-  std::list<Adjacency> adjacencies = it1->getAdjacencies();
-  std::list<Adjacency>::const_iterator it2 = adjacencies.begin();
-  BOOST_CHECK_EQUAL(it2->getName(), "adjacency1");
-  BOOST_CHECK_EQUAL(it2->getUri(), "adjacency1");
-  BOOST_CHECK_EQUAL(it2->getCost(), 128);
-
-  BOOST_CHECK_EQUAL(lsdbStatus.hasAdjacencyLsas(), true);
-
-  std::list<CoordinateLsa> coordinateLsas = lsdbStatus.getCoordinateLsas();
-  std::list<CoordinateLsa>::const_iterator it3 = coordinateLsas.begin();
-
-  lsaInfo = it3->getLsaInfo();
-  BOOST_CHECK_EQUAL(lsaInfo.getOriginRouter(), "test");
-  BOOST_CHECK_EQUAL(lsaInfo.getSequenceNumber(), 128);
-  BOOST_CHECK_EQUAL(lsaInfo.getExpirationPeriod(), ndn::time::milliseconds(10000));
-
-  BOOST_REQUIRE_EQUAL(it3->getHyperbolicRadius(), 1.65);
-  std::vector<double> angles;
-  angles.push_back(1.78);
-  BOOST_REQUIRE(it3->getHyperbolicAngle() == angles);
-
-  BOOST_CHECK_EQUAL(lsdbStatus.hasCoordinateLsas(), true);
-
-  std::list<NameLsa> nameLsas = lsdbStatus.getNameLsas();
-  std::list<NameLsa>::const_iterator it4 = nameLsas.begin();
-
-  lsaInfo = it4->getLsaInfo();
-  BOOST_CHECK_EQUAL(lsaInfo.getOriginRouter(), "test");
-  BOOST_CHECK_EQUAL(lsaInfo.getSequenceNumber(), 128);
-  BOOST_CHECK_EQUAL(lsaInfo.getExpirationPeriod(), ndn::time::milliseconds(10000));
-
-  std::list<ndn::Name> names = it4->getNames();
-  std::list<ndn::Name>::const_iterator it5 = names.begin();
-  BOOST_CHECK_EQUAL(*it5, "name1");
-
-  BOOST_CHECK_EQUAL(lsdbStatus.hasNameLsas(), true);
-}
-
-BOOST_AUTO_TEST_CASE(LsdbStatusDecode2)
-{
-  LsdbStatus lsdbStatus;
-
-  lsdbStatus.wireDecode(ndn::Block(LsdbStatusData2, sizeof(LsdbStatusData2)));
-
-  BOOST_CHECK_EQUAL(lsdbStatus.hasAdjacencyLsas(), false);
-  BOOST_CHECK_EQUAL(lsdbStatus.hasCoordinateLsas(), false);
-  BOOST_CHECK_EQUAL(lsdbStatus.hasNameLsas(), false);
-}
-
-BOOST_AUTO_TEST_CASE(LsdbStatusDecode3)
-{
-  LsdbStatus lsdbStatus;
-
-  BOOST_CHECK_THROW(lsdbStatus.wireDecode(ndn::Block(LsdbStatusData3, sizeof(LsdbStatusData3))),
-                    LsdbStatus::Error);
-}
-
-BOOST_AUTO_TEST_CASE(LsdbStatusClear)
-{
-  LsdbStatus lsdbStatus;
-
-  LsaInfo lsaInfo;
-  lsaInfo.setOriginRouter("test");
-  lsaInfo.setSequenceNumber(128);
-  lsaInfo.setExpirationPeriod(ndn::time::milliseconds(10000));
-
-  // AdjacencyLsa
-  AdjacencyLsa adjacencyLsa;
-  adjacencyLsa.setLsaInfo(lsaInfo);
-
-  Adjacency adjacency1;
-  adjacency1.setName("adjacency1");
-  adjacency1.setUri("adjacency1");
-  adjacency1.setCost(128);
-  adjacencyLsa.addAdjacency(adjacency1);
-
-  lsdbStatus.addAdjacencyLsa(adjacencyLsa);
-  BOOST_CHECK_EQUAL(lsdbStatus.hasAdjacencyLsas(), true);
-  lsdbStatus.clearAdjacencyLsas();
-  BOOST_CHECK_EQUAL(lsdbStatus.hasAdjacencyLsas(), false);
-
-  // CoordinateLsa
-  CoordinateLsa coordinateLsa;
-  coordinateLsa.setLsaInfo(lsaInfo);
-
-  coordinateLsa.setHyperbolicRadius(1.65);
-  std::vector<double> angles;
-  angles.push_back(1.78);
-  coordinateLsa.setHyperbolicAngle(angles);
-
-  lsdbStatus.addCoordinateLsa(coordinateLsa);
-  BOOST_CHECK_EQUAL(lsdbStatus.hasCoordinateLsas(), true);
-  lsdbStatus.clearCoordinateLsas();
-  BOOST_CHECK_EQUAL(lsdbStatus.hasCoordinateLsas(), false);
-
-  // NameLsa
-  NameLsa nameLsa;
-  nameLsa.setLsaInfo(lsaInfo);
-  nameLsa.addName("name1");
-
-  lsdbStatus.addNameLsa(nameLsa);
-  BOOST_CHECK_EQUAL(lsdbStatus.hasNameLsas(), true);
-  lsdbStatus.clearNameLsas();
-  BOOST_CHECK_EQUAL(lsdbStatus.hasNameLsas(), false);
-}
-
-class Theta
-{
-public:
-  std::vector<double> angles = {1.78};
-};
-
-class ThetaAndPhi
-{
-public:
-  std::vector<double> angles = {1.78, 3.21};
-};
-
-typedef boost::mpl::vector<Theta, ThetaAndPhi> HyperbolicAngleVectorFixture;
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(LsdbStatusOutputStream, HRAngleVector, HyperbolicAngleVectorFixture)
-{
-  HRAngleVector angleVector;
-  LsdbStatus lsdbStatus;
-
-  LsaInfo lsaInfo;
-  lsaInfo.setOriginRouter("test");
-  lsaInfo.setSequenceNumber(128);
-  lsaInfo.setExpirationPeriod(ndn::time::milliseconds(10000));
-
-  // AdjacencyLsa
-  AdjacencyLsa adjacencyLsa;
-  adjacencyLsa.setLsaInfo(lsaInfo);
-
-  Adjacency adjacency1;
-  adjacency1.setName("adjacency1");
-  adjacency1.setUri("adjacency1");
-  adjacency1.setCost(128);
-  adjacencyLsa.addAdjacency(adjacency1);
-
-  lsdbStatus.addAdjacencyLsa(adjacencyLsa);
-
-    // NameLsa
-  NameLsa nameLsa;
-  nameLsa.setLsaInfo(lsaInfo);
-  nameLsa.addName("name1");
-
-  lsdbStatus.addNameLsa(nameLsa);
-
-  // CoordinateLsa
-  CoordinateLsa coordinateLsa;
-  coordinateLsa.setLsaInfo(lsaInfo);
-
-  coordinateLsa.setHyperbolicRadius(1.65);
-  coordinateLsa.setHyperbolicAngle(angleVector.angles);
-
-  std::string outputAngles = "HyperbolicAngles: ";
-  for (uint i = 0; i < angleVector.angles.size(); i++) {
-    std::string angle = boost::lexical_cast<std::string>(angleVector.angles[i]);
-    if (i == angleVector.angles.size()-1) {
-      outputAngles += angle;
-    }
-    else {
-      outputAngles += angle + ", ";
-    }
-  }
-  outputAngles += "), ";
-
-  lsdbStatus.addCoordinateLsa(coordinateLsa);
-
-  std::ostringstream os;
-  os << lsdbStatus;
-
-  BOOST_CHECK_EQUAL(os.str(), "LsdbStatus("
-                                "AdjacencyLsa("
-                                  "LsaInfo("
-                                    "OriginRouter: /test, "
-                                    "SequenceNumber: 128, "
-                                    "ExpirationPeriod: 10000 milliseconds), "
-                                  "Adjacency(Name: /adjacency1, Uri: adjacency1, Cost: 128)), "
-                                "CoordinateLsa("
-                                  "LsaInfo("
-                                    "OriginRouter: /test, "
-                                    "SequenceNumber: 128, "
-                                    "ExpirationPeriod: 10000 milliseconds), "
-                                  "HyperbolicRadius: 1.65, "
-                                  + outputAngles +
-                                "NameLsa("
-                                  "LsaInfo("
-                                    "OriginRouter: /test, "
-                                    "SequenceNumber: 128, "
-                                    "ExpirationPeriod: 10000 milliseconds), "
-                                  "Name: /name1))");
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace test
-} // namespace tlv
-} // namespace nlsr
