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
