diff --git a/src/adjacency-list.cpp b/src/adjacency-list.cpp
index 0cf8ff3..d2ada2b 100644
--- a/src/adjacency-list.cpp
+++ b/src/adjacency-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-2019,  The University of Memphis,
  *                           Regents of the University of California,
  *                           Arizona Board of Regents.
  *
@@ -186,9 +186,8 @@
 AdjacencyList::getNumOfActiveNeighbor() const
 {
   int32_t actNbrCount = 0;
-  for (std::list<Adjacent>::const_iterator it = m_adjList.begin(); it != m_adjList.end(); it++) {
-
-    if (it->getStatus() == Adjacent::STATUS_ACTIVE) {
+  for (const auto& adjacent: m_adjList) {
+    if (adjacent.getStatus() == Adjacent::STATUS_ACTIVE) {
       actNbrCount++;
     }
   }
@@ -198,24 +197,19 @@
 std::list<Adjacent>::iterator
 AdjacencyList::find(const ndn::Name& adjName)
 {
-  std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
-                                                  m_adjList.end(),
-                                                  std::bind(&Adjacent::compare,
-                                                            _1, std::cref(adjName)));
-  return it;
+  return std::find_if(m_adjList.begin(),
+                      m_adjList.end(),
+                      std::bind(&Adjacent::compare, _1, std::cref(adjName)));
 }
 
 std::list<Adjacent>::const_iterator
 AdjacencyList::find(const ndn::Name& adjName) const
 {
-  std::list<Adjacent>::const_iterator it = std::find_if(m_adjList.cbegin(),
-                                                        m_adjList.cend(),
-                                                        std::bind(&Adjacent::compare,
-                                                                  _1, std::cref(adjName)));
-  return it;
+  return std::find_if(m_adjList.cbegin(),
+                      m_adjList.cend(),
+                      std::bind(&Adjacent::compare, _1, std::cref(adjName)));
 }
 
-
 AdjacencyList::iterator
 AdjacencyList::findAdjacent(const ndn::Name& adjName)
 {
@@ -250,20 +244,16 @@
                                                   m_adjList.end(),
                                                   std::bind(&Adjacent::compareFaceUri,
                                                             _1, faceUri));
-  if (it != m_adjList.end()) {
-    return it->getFaceId();
-  }
 
-  return 0;
+  return it != m_adjList.end() ? it->getFaceId() : 0;
 }
 
 void
 AdjacencyList::writeLog()
 {
   NLSR_LOG_DEBUG("-------Adjacency List--------");
-  for (std::list<Adjacent>::iterator it = m_adjList.begin();
-       it != m_adjList.end(); it++) {
-    (*it).writeLog();
+  for (const auto& adjacent : m_adjList) {
+    NLSR_LOG_DEBUG(adjacent);
   }
 }
 
diff --git a/src/adjacent.cpp b/src/adjacent.cpp
index af1f926..1ae047e 100644
--- a/src/adjacent.cpp
+++ b/src/adjacent.cpp
@@ -104,10 +104,4 @@
   return os;
 }
 
-void
-Adjacent::writeLog()
-{
-  NLSR_LOG_DEBUG(*this);
-}
-
 } // namespace nlsr
diff --git a/src/adjacent.hpp b/src/adjacent.hpp
index c85f0ff..7930791 100644
--- a/src/adjacent.hpp
+++ b/src/adjacent.hpp
@@ -153,9 +153,6 @@
     return m_faceUri == faceUri;
   }
 
-  void
-  writeLog();
-
 public:
   static const double DEFAULT_LINK_COST;
   static const double NON_ADJACENT_COST;
diff --git a/src/communication/sync-logic-handler.cpp b/src/communication/sync-logic-handler.cpp
index 1784267..308457e 100644
--- a/src/communication/sync-logic-handler.cpp
+++ b/src/communication/sync-logic-handler.cpp
@@ -33,59 +33,29 @@
 
 INIT_LOGGER(SyncLogicHandler);
 
-template<class T>
-class NullDeleter
-{
-public:
-  void
-  operator()(T*)
-  {
-  }
-};
-
 SyncLogicHandler::SyncLogicHandler(ndn::Face& face, const IsLsaNew& isLsaNew,
                                    const ConfParameter& conf)
   : onNewLsa(std::make_unique<OnNewLsa>())
   , m_syncFace(face)
   , m_isLsaNew(isLsaNew)
   , m_confParam(conf)
+  , m_nameLsaUserPrefix(ndn::Name(m_confParam.getSyncUserPrefix()).append(std::to_string(Lsa::Type::NAME)))
+  , m_syncLogic(m_syncFace, m_confParam.getSyncProtocol(), m_confParam.getSyncPrefix(),
+                m_nameLsaUserPrefix, m_confParam.getSyncInterestLifetime(),
+                std::bind(&SyncLogicHandler::processUpdate, this, _1, _2))
 {
-  createSyncLogic(conf.getSyncPrefix());
-}
+  m_adjLsaUserPrefix = ndn::Name(m_confParam.getSyncUserPrefix())
+                         .append(std::to_string(Lsa::Type::ADJACENCY));
+  m_coorLsaUserPrefix = ndn::Name(m_confParam.getSyncUserPrefix())
+                         .append(std::to_string(Lsa::Type::COORDINATE));
 
-void
-SyncLogicHandler::createSyncLogic(const ndn::Name& syncPrefix, const ndn::time::milliseconds& syncInterestLifetime)
-{
-  if (m_syncLogic != nullptr) {
-    NLSR_LOG_WARN("Trying to create Sync Logic object, but Sync Logic object already exists");
-    return;
+  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF ||
+      m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
+    m_syncLogic.addUserNode(m_adjLsaUserPrefix);
   }
-
-  // Build LSA sync update prefix
-  buildUpdatePrefix();
-
-  NLSR_LOG_DEBUG("Creating Sync Logic object. Sync Prefix: " << syncPrefix);
-
-  // The face's lifetime is managed in main.cpp; Logic should not manage the memory
-  // of the object
-  std::shared_ptr<ndn::Face> facePtr(&m_syncFace, NullDeleter<ndn::Face>());
-
-  m_syncLogic = std::make_shared<SyncProtocolAdapter>(*facePtr,
-                  m_confParam.getSyncProtocol(),
-                  syncPrefix,
-                  m_nameLsaUserPrefix,
-                  syncInterestLifetime,
-                  std::bind(&SyncLogicHandler::processUpdate, this, _1, _2));
-
-  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
-    m_syncLogic->addUserNode(m_adjLsaUserPrefix);
-  }
-  else if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
-    m_syncLogic->addUserNode(m_coorLsaUserPrefix);
-  }
-  else {
-    m_syncLogic->addUserNode(m_adjLsaUserPrefix);
-    m_syncLogic->addUserNode(m_coorLsaUserPrefix);
+  else if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON ||
+           m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
+    m_syncLogic.addUserNode(m_coorLsaUserPrefix);
   }
 }
 
@@ -148,42 +118,19 @@
 void
 SyncLogicHandler::publishRoutingUpdate(const Lsa::Type& type, const uint64_t& seqNo)
 {
-  if (m_syncLogic == nullptr) {
-    NLSR_LOG_FATAL("Cannot publish routing update; SyncLogic does not exist");
-
-    BOOST_THROW_EXCEPTION(SyncLogicHandler::Error("Cannot publish routing update; SyncLogic does not exist"));
-  }
-
   switch (type) {
   case Lsa::Type::ADJACENCY:
-    m_syncLogic->publishUpdate(m_adjLsaUserPrefix, seqNo);
+    m_syncLogic.publishUpdate(m_adjLsaUserPrefix, seqNo);
     break;
   case Lsa::Type::COORDINATE:
-    m_syncLogic->publishUpdate(m_coorLsaUserPrefix, seqNo);
+    m_syncLogic.publishUpdate(m_coorLsaUserPrefix, seqNo);
     break;
   case Lsa::Type::NAME:
-    m_syncLogic->publishUpdate(m_nameLsaUserPrefix, seqNo);
+    m_syncLogic.publishUpdate(m_nameLsaUserPrefix, seqNo);
     break;
   default:
     break;
   }
 }
 
-void
-SyncLogicHandler::buildUpdatePrefix()
-{
-  ndn::Name updatePrefix = m_confParam.getLsaPrefix();
-  updatePrefix.append(m_confParam.getSiteName());
-  updatePrefix.append(m_confParam.getRouterName());
-
-  m_nameLsaUserPrefix = updatePrefix;
-  m_nameLsaUserPrefix.append(std::to_string(Lsa::Type::NAME));
-
-  m_adjLsaUserPrefix = updatePrefix;
-  m_adjLsaUserPrefix.append(std::to_string(Lsa::Type::ADJACENCY));
-
-  m_coorLsaUserPrefix = updatePrefix;
-  m_coorLsaUserPrefix.append(std::to_string(Lsa::Type::COORDINATE));
-}
-
 } // namespace nlsr
diff --git a/src/communication/sync-logic-handler.hpp b/src/communication/sync-logic-handler.hpp
index b9461c2..4dc2d3d 100644
--- a/src/communication/sync-logic-handler.hpp
+++ b/src/communication/sync-logic-handler.hpp
@@ -77,19 +77,6 @@
   publishRoutingUpdate(const Lsa::Type& type, const uint64_t& seqNo);
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  /*! \brief Create and configure a Logic object to enable Sync for this NLSR.
-   *
-   * In a typical situation this only needs to be called once, when NLSR starts.
-   * \param syncPrefix The sync prefix you want this Sync to use
-   * \param syncInterestLifetime ChronoSync/PSync sends a periodic sync interest every
-   *        \p syncInterestLifetime / 2 ms
-   * \sa Nlsr::initialize
-   */
-  void
-  createSyncLogic(const ndn::Name& syncPrefix,
-                  const ndn::time::milliseconds& syncInterestLifetime =
-                    ndn::time::milliseconds(SYNC_INTEREST_LIFETIME_DEFAULT));
-
   /*! \brief Callback from Sync protocol
    *
    * In a typical situation this only needs to be called once, when NLSR starts.
@@ -99,11 +86,6 @@
   void
   processUpdate(const ndn::Name& updateName, uint64_t highSeq);
 
-  /*! \brief Simple function to glue Name components together
-   */
-  void
-  buildUpdatePrefix();
-
   /*! \brief Determine which kind of LSA was updated and fetch it.
    *
    * Checks that the received update is not from us, which can happen,
@@ -121,9 +103,6 @@
 
 private:
   ndn::Face& m_syncFace;
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  std::shared_ptr<SyncProtocolAdapter> m_syncLogic;
-private:
   IsLsaNew m_isLsaNew;
   const ConfParameter& m_confParam;
 
@@ -132,6 +111,8 @@
   ndn::Name m_adjLsaUserPrefix;
   ndn::Name m_coorLsaUserPrefix;
 
+  SyncProtocolAdapter m_syncLogic;
+
 private:
   static const std::string NLSR_COMPONENT;
   static const std::string LSA_COMPONENT;
diff --git a/src/conf-file-processor.cpp b/src/conf-file-processor.cpp
index 1517a87..bbca665 100644
--- a/src/conf-file-processor.cpp
+++ b/src/conf-file-processor.cpp
@@ -451,17 +451,6 @@
     return false;
   }
 
-  // first-hello-interval
-  ConfigurationVariable<uint32_t> firstHelloInterval("first-hello-interval",
-                                                     std::bind(&ConfParameter::setFirstHelloInterval,
-                                                     &m_confParam, _1));
-  firstHelloInterval.setMinAndMaxValue(FIRST_HELLO_INTERVAL_MIN, FIRST_HELLO_INTERVAL_MAX);
-  firstHelloInterval.setOptional(FIRST_HELLO_INTERVAL_DEFAULT);
-
-  if (!firstHelloInterval.parseFromConfigSection(section)) {
-    return false;
-  }
-
   for (ConfigSection::const_iterator tn =
            section.begin(); tn != section.end(); ++tn) {
 
diff --git a/src/conf-parameter.cpp b/src/conf-parameter.cpp
index 67a5b4b..4938a8e 100644
--- a/src/conf-parameter.cpp
+++ b/src/conf-parameter.cpp
@@ -43,7 +43,6 @@
   : m_confFileName(confFileName)
   , m_lsaRefreshTime(LSA_REFRESH_TIME_DEFAULT)
   , m_adjLsaBuildInterval(ADJ_LSA_BUILD_INTERVAL_DEFAULT)
-  , m_firstHelloInterval(FIRST_HELLO_INTERVAL_DEFAULT)
   , m_routingCalcInterval(ROUTING_CALC_INTERVAL_DEFAULT)
   , m_faceDatasetFetchInterval(ndn::time::seconds(static_cast<int>(FACE_DATASET_FETCH_INTERVAL_DEFAULT)))
   , m_lsaInterestLifetime(ndn::time::seconds(static_cast<int>(LSA_INTEREST_LIFETIME_DEFAULT)))
@@ -80,17 +79,18 @@
   NLSR_LOG_INFO("LSA Interest lifetime: " << getLsaInterestLifetime());
   NLSR_LOG_INFO("Router dead interval: " << getRouterDeadInterval());
   NLSR_LOG_INFO("Max Faces Per Prefix: " << m_maxFacesPerPrefix);
-  NLSR_LOG_INFO("Hyperbolic Routing: " << m_hyperbolicState);
-  NLSR_LOG_INFO("Hyp R: " << m_corR);
-  int i=0;
-  for (auto const& value: m_corTheta) {
-    NLSR_LOG_INFO("Hyp Angle " << i++ << ": "<< value);
+  if (m_hyperbolicState == HYPERBOLIC_STATE_ON || m_hyperbolicState == HYPERBOLIC_STATE_DRY_RUN) {
+    NLSR_LOG_INFO("Hyperbolic Routing: " << m_hyperbolicState);
+    NLSR_LOG_INFO("Hyp R: " << m_corR);
+    int i=0;
+    for (auto const& value: m_corTheta) {
+      NLSR_LOG_INFO("Hyp Angle " << i++ << ": "<< value);
+    }
   }
   NLSR_LOG_INFO("State Directory: " << m_stateFileDir);
 
   // Event Intervals
   NLSR_LOG_INFO("Adjacency LSA build interval:  " << m_adjLsaBuildInterval);
-  NLSR_LOG_INFO("First Hello Interest interval: " << m_firstHelloInterval);
   NLSR_LOG_INFO("Routing calculation interval:  " << m_routingCalcInterval);
 }
 
diff --git a/src/conf-parameter.hpp b/src/conf-parameter.hpp
index 6b63937..df541a5 100644
--- a/src/conf-parameter.hpp
+++ b/src/conf-parameter.hpp
@@ -56,15 +56,9 @@
 };
 
 enum {
-  ADJ_LSA_BUILD_INTERVAL_MIN = 0,
-  ADJ_LSA_BUILD_INTERVAL_DEFAULT = 5,
-  ADJ_LSA_BUILD_INTERVAL_MAX = 5
-};
-
-enum {
-  FIRST_HELLO_INTERVAL_MIN = 0,
-  FIRST_HELLO_INTERVAL_DEFAULT = 10,
-  FIRST_HELLO_INTERVAL_MAX = 10
+  ADJ_LSA_BUILD_INTERVAL_MIN = 5,
+  ADJ_LSA_BUILD_INTERVAL_DEFAULT = 10,
+  ADJ_LSA_BUILD_INTERVAL_MAX = 30
 };
 
 enum {
@@ -94,7 +88,7 @@
 
 enum {
   HELLO_TIMEOUT_MIN = 1,
-  HELLO_TIMEOUT_DEFAULT = 3,
+  HELLO_TIMEOUT_DEFAULT = 1,
   HELLO_TIMEOUT_MAX = 15
 };
 
@@ -180,11 +174,15 @@
   }
 
   void
-  buildRouterPrefix()
+  buildRouterAndSyncUserPrefix()
   {
     m_routerPrefix = m_network;
     m_routerPrefix.append(m_siteName);
     m_routerPrefix.append(m_routerName);
+
+    m_syncUserPrefix = m_lsaPrefix;
+    m_syncUserPrefix.append(m_siteName);
+    m_syncUserPrefix.append(m_routerName);
   }
 
   const ndn::Name&
@@ -194,6 +192,12 @@
   }
 
   const ndn::Name&
+  getSyncUserPrefix() const
+  {
+    return m_syncUserPrefix;
+  }
+
+  const ndn::Name&
   getSyncPrefix() const
   {
     return m_syncPrefix;
@@ -256,18 +260,6 @@
   }
 
   void
-  setFirstHelloInterval(uint32_t interval)
-  {
-    m_firstHelloInterval = interval;
-  }
-
-  uint32_t
-  getFirstHelloInterval() const
-  {
-    return m_firstHelloInterval;
-  }
-
-  void
   setRoutingCalcInterval(uint32_t interval)
   {
     m_routingCalcInterval = interval;
@@ -481,7 +473,7 @@
   ndn::Name m_network;
 
   ndn::Name m_routerPrefix;
-  ndn::Name m_lsaRouterPrefix;
+  ndn::Name m_syncUserPrefix;
 
   ndn::Name m_syncPrefix;
   ndn::Name m_lsaPrefix;
@@ -489,7 +481,6 @@
   uint32_t  m_lsaRefreshTime;
 
   uint32_t m_adjLsaBuildInterval;
-  uint32_t m_firstHelloInterval;
   uint32_t m_routingCalcInterval;
 
   uint32_t m_faceDatasetFetchTries;
diff --git a/src/hello-protocol.cpp b/src/hello-protocol.cpp
index c068905..3d67771 100644
--- a/src/hello-protocol.cpp
+++ b/src/hello-protocol.cpp
@@ -42,55 +42,55 @@
   , m_confParam(confParam)
   , m_routingTable(routingTable)
   , m_lsdb(lsdb)
+  , m_adjacencyList(m_confParam.getAdjacencyList())
 {
 }
 
 void
 HelloProtocol::expressInterest(const ndn::Name& interestName, uint32_t seconds)
 {
-  NLSR_LOG_DEBUG("Expressing Interest :" << interestName);
+  NLSR_LOG_DEBUG("Expressing Interest: " << interestName);
   ndn::Interest interest(interestName);
   interest.setInterestLifetime(ndn::time::seconds(seconds));
   interest.setMustBeFresh(true);
   interest.setCanBePrefix(true);
   m_face.expressInterest(interest,
-                         std::bind(&HelloProtocol::onContent, this, _1, _2),
-                         [this] (const ndn::Interest& interest, const ndn::lp::Nack& nack)
-                         {
-                           NDN_LOG_TRACE("Received Nack with reason " << nack.getReason());
-                           NDN_LOG_TRACE("Treating as timeout");
-                           processInterestTimedOut(interest);
-                         },
-                         std::bind(&HelloProtocol::processInterestTimedOut, this, _1));
+    std::bind(&HelloProtocol::onContent, this, _1, _2),
+    [this, seconds] (const ndn::Interest& interest, const ndn::lp::Nack& nack)
+    {
+      NDN_LOG_TRACE("Received Nack with reason: " << nack.getReason());
+      NDN_LOG_TRACE("Will treat as timeout in " << 2 * seconds << " seconds");
+      m_scheduler.schedule(ndn::time::seconds(2 * seconds),
+        [this, interest] { processInterestTimedOut(interest); });
+    },
+    std::bind(&HelloProtocol::processInterestTimedOut, this, _1));
 
   // increment SENT_HELLO_INTEREST
   hpIncrementSignal(Statistics::PacketType::SENT_HELLO_INTEREST);
 }
 
 void
-HelloProtocol::sendScheduledInterest()
+HelloProtocol::sendHelloInterest(const ndn::Name& neighbor)
 {
-  for (const auto& adjacent : m_confParam.getAdjacencyList().getAdjList()) {
-    // If this adjacency has a Face, just proceed as usual.
-    if(adjacent.getFaceId() != 0) {
-      // interest name: /<neighbor>/NLSR/INFO/<router>
-      ndn::Name interestName = adjacent.getName() ;
-      interestName.append(NLSR_COMPONENT);
-      interestName.append(INFO_COMPONENT);
-      interestName.append(m_confParam.getRouterPrefix().wireEncode());
-      expressInterest(interestName, m_confParam.getInterestResendTime());
-      NLSR_LOG_DEBUG("Sending scheduled interest: " << interestName);
-    }
+  auto adjacent = m_adjacencyList.findAdjacent(neighbor);
+
+  if (adjacent == m_adjacencyList.end()) {
+    return;
   }
-  scheduleInterest(m_confParam.getInfoInterestInterval());
-}
 
-void
-HelloProtocol::scheduleInterest(uint32_t seconds)
-{
-  NLSR_LOG_DEBUG("Scheduling HELLO Interests in " << ndn::time::seconds(seconds));
+  // If this adjacency has a Face, just proceed as usual.
+  if(adjacent->getFaceId() != 0) {
+    // interest name: /<neighbor>/NLSR/INFO/<router>
+    ndn::Name interestName = adjacent->getName() ;
+    interestName.append(NLSR_COMPONENT);
+    interestName.append(INFO_COMPONENT);
+    interestName.append(m_confParam.getRouterPrefix().wireEncode());
+    expressInterest(interestName, m_confParam.getInterestResendTime());
+    NLSR_LOG_DEBUG("Sending HELLO interest: " << interestName);
+  }
 
-  m_scheduler.schedule(ndn::time::seconds(seconds), [this] { sendScheduledInterest(); });
+  m_scheduler.schedule(ndn::time::seconds(m_confParam.getInfoInterestInterval()),
+                       [this, neighbor] { sendHelloInterest(neighbor); });
 }
 
 void
@@ -113,7 +113,7 @@
   ndn::Name neighbor;
   neighbor.wireDecode(interestName.get(-1).blockFromValue());
   NLSR_LOG_DEBUG("Neighbor: " << neighbor);
-  if (m_confParam.getAdjacencyList().isNeighbor(neighbor)) {
+  if (m_adjacencyList.isNeighbor(neighbor)) {
     std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>();
     data->setName(ndn::Name(interest.getName()).appendVersion());
     data->setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
@@ -128,7 +128,7 @@
     // increment SENT_HELLO_DATA
     hpIncrementSignal(Statistics::PacketType::SENT_HELLO_DATA);
 
-    auto adjacent = m_confParam.getAdjacencyList().findAdjacent(neighbor);
+    auto adjacent = m_adjacencyList.findAdjacent(neighbor);
     // If this neighbor was previously inactive, send our own hello interest, too
     if (adjacent->getStatus() == Adjacent::STATUS_INACTIVE) {
       // We can only do that if the neighbor currently has a face.
@@ -155,15 +155,14 @@
   }
   ndn::Name neighbor = interestName.getPrefix(-3);
   NLSR_LOG_DEBUG("Neighbor: " << neighbor);
-  m_confParam.getAdjacencyList().incrementTimedOutInterestCount(neighbor);
+  m_adjacencyList.incrementTimedOutInterestCount(neighbor);
 
-  Adjacent::Status status = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
+  Adjacent::Status status = m_adjacencyList.getStatusOfNeighbor(neighbor);
 
-  uint32_t infoIntTimedOutCount =
-    m_confParam.getAdjacencyList().getTimedOutInterestCount(neighbor);
+  uint32_t infoIntTimedOutCount = m_adjacencyList.getTimedOutInterestCount(neighbor);
   NLSR_LOG_DEBUG("Status: " << status);
   NLSR_LOG_DEBUG("Info Interest Timed out: " << infoIntTimedOutCount);
-  if (infoIntTimedOutCount < m_confParam.getInterestRetryNumber()) {
+  if (infoIntTimedOutCount <= m_confParam.getInterestRetryNumber()) {
     // interest name: /<neighbor>/NLSR/INFO/<router>
     ndn::Name interestName(neighbor);
     interestName.append(NLSR_COMPONENT);
@@ -174,7 +173,7 @@
   }
   else if ((status == Adjacent::STATUS_ACTIVE) &&
            (infoIntTimedOutCount == m_confParam.getInterestRetryNumber())) {
-    m_confParam.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_INACTIVE);
+    m_adjacencyList.setStatusOfNeighbor(neighbor, Adjacent::STATUS_INACTIVE);
 
     NLSR_LOG_DEBUG("Neighbor: " << neighbor << " status changed to INACTIVE");
 
@@ -189,10 +188,9 @@
 HelloProtocol::onContent(const ndn::Interest& interest, const ndn::Data& data)
 {
   NLSR_LOG_DEBUG("Received data for INFO(name): " << data.getName());
-  if (data.getSignature().hasKeyLocator()) {
-    if (data.getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
-      NLSR_LOG_DEBUG("Data signed with: " << data.getSignature().getKeyLocator().getName());
-    }
+  if (data.getSignature().hasKeyLocator() &&
+      data.getSignature().getKeyLocator().getType() == ndn::tlv::Name) {
+    NLSR_LOG_DEBUG("Data signed with: " << data.getSignature().getKeyLocator().getName());
   }
   m_confParam.getValidator().validate(data,
                                       std::bind(&HelloProtocol::onContentValidated, this, _1),
@@ -210,10 +208,10 @@
   if (dataName.get(-3).toUri() == INFO_COMPONENT) {
     ndn::Name neighbor = dataName.getPrefix(-4);
 
-    Adjacent::Status oldStatus = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
-    m_confParam.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_ACTIVE);
-    m_confParam.getAdjacencyList().setTimedOutInterestCount(neighbor, 0);
-    Adjacent::Status newStatus = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
+    Adjacent::Status oldStatus = m_adjacencyList.getStatusOfNeighbor(neighbor);
+    m_adjacencyList.setStatusOfNeighbor(neighbor, Adjacent::STATUS_ACTIVE);
+    m_adjacencyList.setTimedOutInterestCount(neighbor, 0);
+    Adjacent::Status newStatus = m_adjacencyList.getStatusOfNeighbor(neighbor);
 
     NLSR_LOG_DEBUG("Neighbor : " << neighbor);
     NLSR_LOG_DEBUG("Old Status: " << oldStatus << " New Status: " << newStatus);
@@ -226,6 +224,8 @@
         m_lsdb.scheduleAdjLsaBuild();
       }
     }
+
+    onHelloDataValidated(neighbor);
   }
   // increment RCV_HELLO_DATA
   hpIncrementSignal(Statistics::PacketType::RCV_HELLO_DATA);
diff --git a/src/hello-protocol.hpp b/src/hello-protocol.hpp
index ff87a3b..3ba4ee7 100644
--- a/src/hello-protocol.hpp
+++ b/src/hello-protocol.hpp
@@ -45,18 +45,6 @@
                 ndn::security::SigningInfo& signingInfo,
                 ConfParameter& confParam, RoutingTable& routingTable, Lsdb& lsdb);
 
-  /*! \brief Schedules a Hello Interest event.
-   *
-   * This function serves as the Hello Interest loop, and must be
-   * explicitly called to start the Hello cycle. This is done at
-   * NLSR's initialization.
-   *
-   * \sa Nlsr::initialize
-   * \param seconds The number of seconds to wait before calling the event.
-   */
-  void
-  scheduleInterest(uint32_t seconds);
-
   /*! \brief Sends a Hello Interest packet.
    *
    * \param interestNamePrefix The name of the router that has published the
@@ -75,14 +63,12 @@
    *
    * This function is called as part of a schedule to regularly
    * determine the adjacency status of neighbors. This function
-   * creates and sends a Hello Interest to each neighbor in
-   * Nlsr::m_adjacencyList. If the neighbor has not been contacted
-   * before and currently has no Face in NFD, this method will call a
-   * different pipeline that creates the Face first, then registers
-   * prefixes.
+   * creates and sends a Hello Interest to the given adjacent.
+   *
+   * \param neighbor the name of the neighbor
    */
   void
-  sendScheduledInterest();
+  sendHelloInterest(const ndn::Name& neighbor);
 
   /*! \brief Processes a Hello Interest from a neighbor.
    *
@@ -167,6 +153,9 @@
   onRegistrationSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
                         const ndn::Name& neighbor, const ndn::time::milliseconds& timeout);
 
+public:
+  ndn::util::Signal<HelloProtocol, const ndn::Name&> onHelloDataValidated;
+
 private:
   ndn::Face& m_face;
   ndn::Scheduler m_scheduler;
@@ -175,6 +164,7 @@
   ConfParameter& m_confParam;
   RoutingTable& m_routingTable;
   Lsdb& m_lsdb;
+  AdjacencyList& m_adjacencyList;
 
   static const std::string INFO_COMPONENT;
   static const std::string NLSR_COMPONENT;
diff --git a/src/lsdb.cpp b/src/lsdb.cpp
index 1e3cf1b..d5ddd12 100644
--- a/src/lsdb.cpp
+++ b/src/lsdb.cpp
@@ -211,8 +211,8 @@
     if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
       // If this name LSA is from another router, add the advertised
       // prefixes to the NPT.
-      m_namePrefixTable.addEntry(nlsa.getOrigRouter(),
-                                           nlsa.getOrigRouter());
+      m_namePrefixTable.addEntry(nlsa.getOrigRouter(), nlsa.getOrigRouter());
+
       for (const auto& name : nlsa.getNpl().getNames()) {
         if (name != m_confParam.getRouterPrefix()) {
           m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
@@ -523,6 +523,10 @@
 void
 Lsdb::writeCorLsdbLog()
 {
+  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
+    return;
+  }
+
   NLSR_LOG_DEBUG("---------------Cor LSDB-------------------");
   for (const auto& corLsa : m_corLsdb) {
     corLsa.writeLog();
@@ -558,12 +562,14 @@
     return;
   }
 
-  if (m_isBuildAdjLsaSheduled == false) {
+  if (m_isBuildAdjLsaSheduled) {
+    NLSR_LOG_DEBUG("Rescheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
+  }
+  else {
     NLSR_LOG_DEBUG("Scheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
-
-    m_scheduler.schedule(m_adjLsaBuildInterval, [this] { buildAdjLsa(); });
     m_isBuildAdjLsaSheduled = true;
   }
+  m_scheduledAdjLsaBuild = m_scheduler.schedule(m_adjLsaBuildInterval, [this] { buildAdjLsa(); });
 }
 
 void
@@ -608,9 +614,9 @@
   // hopefully finished)
   else {
     m_isBuildAdjLsaSheduled = true;
-    int schedulingTime = m_confParam.getInterestRetryNumber() *
-                         m_confParam.getInterestResendTime();
-    m_scheduler.schedule(ndn::time::seconds(schedulingTime), [this] { buildAdjLsa(); });
+    auto schedulingTime = ndn::time::seconds(m_confParam.getInterestRetryNumber() *
+                                             m_confParam.getInterestResendTime());
+    m_scheduledAdjLsaBuild = m_scheduler.schedule(schedulingTime, [this] { buildAdjLsa(); });
   }
 }
 
@@ -1264,6 +1270,10 @@
 void
 Lsdb::writeAdjLsdbLog()
 {
+  if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
+    return;
+  }
+
   NLSR_LOG_DEBUG("---------------Adj LSDB-------------------");
   for (const auto& adj : m_adjLsdb) {
     adj.writeLog();
diff --git a/src/lsdb.hpp b/src/lsdb.hpp
index 9f37002..718ee55 100644
--- a/src/lsdb.hpp
+++ b/src/lsdb.hpp
@@ -207,7 +207,7 @@
     return m_isBuildAdjLsaSheduled;
   }
 
-  const SyncLogicHandler&
+  SyncLogicHandler&
   getSync() {
     return m_sync;
   }
@@ -412,6 +412,7 @@
 
   bool m_isBuildAdjLsaSheduled;
   int64_t m_adjBuildCount;
+  ndn::scheduler::ScopedEventId m_scheduledAdjLsaBuild;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   ndn::InMemoryStoragePersistent m_lsaStorage;
diff --git a/src/main.cpp b/src/main.cpp
index b271298..d109582 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -20,7 +20,7 @@
  **/
 
 #include "conf-file-processor.hpp"
-#include "nlsr-runner.hpp"
+#include "nlsr.hpp"
 #include "version.hpp"
 
 #include <boost/exception/get_error_info.hpp>
@@ -85,6 +85,7 @@
 
   boost::asio::io_service ioService;
   ndn::Face face(ioService);
+  ndn::KeyChain keyChain;
 
   nlsr::ConfParameter confParam(face, configFileName);
   nlsr::ConfFileProcessor configProcessor(confParam);
@@ -94,15 +95,16 @@
     return 2;
   }
 
-  confParam.buildRouterPrefix();
+  confParam.buildRouterAndSyncUserPrefix();
   confParam.writeLog();
 
-  nlsr::NlsrRunner runner(face, confParam);
+  nlsr::Nlsr nlsr(face, keyChain, confParam);
 
   try {
-    runner.run();
+    face.processEvents();
   }
   catch (const std::exception& e) {
+    nlsr.getFib().clean();
     std::cerr << "FATAL: " << getExtendedErrorMessage(e) << std::endl;
     return 1;
   }
diff --git a/src/nlsr-runner.cpp b/src/nlsr-runner.cpp
deleted file mode 100644
index 41c0f8c..0000000
--- a/src/nlsr-runner.cpp
+++ /dev/null
@@ -1,47 +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 "nlsr-runner.hpp"
-
-namespace nlsr {
-
-NlsrRunner::NlsrRunner(ndn::Face& face, ConfParameter& confParam)
-  : m_face(face)
-  , m_confParam(confParam)
-  , m_nlsr(m_face, m_keyChain, m_confParam)
-{
-}
-
-void
-NlsrRunner::run()
-{
-  m_nlsr.initialize();
-
-  try {
-    m_face.processEvents();
-  }
-  catch (...) {
-    m_nlsr.getFib().clean();
-    throw;
-  }
-}
-
-} // namespace nlsr
diff --git a/src/nlsr-runner.hpp b/src/nlsr-runner.hpp
deleted file mode 100644
index afe653e..0000000
--- a/src/nlsr-runner.hpp
+++ /dev/null
@@ -1,70 +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/>.
- **/
-
-#ifndef NLSR_NLSR_RUNNER_HPP
-#define NLSR_NLSR_RUNNER_HPP
-
-#include "nlsr.hpp"
-#include "conf-parameter.hpp"
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/util/scheduler.hpp>
-
-namespace nlsr {
-
-/*! \brief A wrapper class to instantiate and configure an NLSR object.
- *
- * As its name suggests, this class is responsible for running
- * NLSR. It creates an nlsr::ConfFileProcessor to read a configuration
- * file and uses that to configure and then start an NLSR process.
- * This class only exists to provide this functionality, and there is
- * no special reliance of NLSR on this class.
- */
-class NlsrRunner
-{
-public:
-  explicit
-  NlsrRunner(ndn::Face& face, ConfParameter& confParam);
-
-  /*! \brief Instantiate, configure, and start the NLSR process.
-   *
-   * Each NlsrRunner is uniquely paired to the Face it's instantiated
-   * with. This is *not* a factory-type class, but a one-to-one
-   * relationship. If one wants to create multiple NLSR classes,
-   * multiple NLSR runners need to be created, too.
-   *
-   * \throws ConfFileError The configuration file cannot be processed.
-   *                       NLSR is not started.
-   * \sa Nlsr::canonizeNeighborUris
-   */
-  void
-  run();
-
-private:
-  ndn::Face& m_face;
-  ndn::KeyChain m_keyChain;
-  ConfParameter& m_confParam;
-  Nlsr m_nlsr;
-};
-
-} // namespace nlsr
-
-#endif // NLSR_NLSR_RUNNER_HPP
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index cbd981e..3094e32 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -50,36 +50,77 @@
   , m_fib(m_face, m_scheduler, m_adjacencyList, m_confParam, m_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_signingInfo,
-           m_confParam, m_namePrefixTable, m_routingTable)
+  , m_lsdb(m_face, m_keyChain, m_signingInfo, m_confParam, m_namePrefixTable, m_routingTable)
+  , m_helloProtocol(m_face, m_keyChain, m_signingInfo, confParam, m_routingTable, m_lsdb)
   , m_afterSegmentValidatedConnection(m_lsdb.afterSegmentValidatedSignal.connect(
                                       std::bind(&Nlsr::afterFetcherSignalEmitted, this, _1)))
   , m_onNewLsaConnection(m_lsdb.getSync().onNewLsa->connect(
-                          [this] (const ndn::Name& updateName, uint64_t sequenceNumber,
-                                  const ndn::Name& originRouter) {
-                            registerStrategyForCerts(originRouter);
-                          }))
+      [this] (const ndn::Name& updateName, uint64_t sequenceNumber,
+              const ndn::Name& originRouter) {
+        registerStrategyForCerts(originRouter);
+      }))
+  , m_onPrefixRegistrationSuccess(m_fib.onPrefixRegistrationSuccess.connect(
+      [this] (const ndn::Name& name) {
+        m_helloProtocol.sendHelloInterest(name);
+      }))
+  , m_onHelloDataValidated(m_helloProtocol.onHelloDataValidated.connect(
+      [this] (const ndn::Name& neighbor) {
+        auto it = m_adjacencyList.findAdjacent(neighbor);
+        if (it != m_adjacencyList.end()) {
+          m_fib.registerPrefix(m_confParam.getSyncPrefix(), it->getFaceUri(), it->getLinkCost(),
+                               ndn::time::milliseconds::max(), ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
+        }
+      }))
   , m_dispatcher(m_face, m_keyChain)
   , m_datasetHandler(m_dispatcher, m_lsdb, m_routingTable)
-  , m_helloProtocol(m_face, m_keyChain, m_signingInfo, confParam, m_routingTable, m_lsdb)
   , m_certStore(m_confParam.getCertStore())
   , m_controller(m_face, m_keyChain)
   , m_faceDatasetController(m_face, m_keyChain)
   , m_prefixUpdateProcessor(m_dispatcher,
-                            m_confParam.getPrefixUpdateValidator(),
-                            m_namePrefixList,
-                            m_lsdb,
-                            m_confParam.getConfFileNameDynamic())
+      m_confParam.getPrefixUpdateValidator(),
+      m_namePrefixList,
+      m_lsdb,
+      m_confParam.getConfFileNameDynamic())
   , m_nfdRibCommandProcessor(m_dispatcher,
-                             m_namePrefixList,
-                             m_lsdb)
+      m_namePrefixList,
+      m_lsdb)
   , m_statsCollector(m_lsdb, m_helloProtocol)
   , m_faceMonitor(m_face)
 {
+  NLSR_LOG_DEBUG("Initializing Nlsr");
+
   m_faceMonitor.onNotification.connect(std::bind(&Nlsr::onFaceEventNotification, this, _1));
   m_faceMonitor.start();
 
+  // Do key initialization and registrations first, then initialize faces
+  // which will create routes to neighbor
+
   setStrategies();
+
+  initializeKey();
+
+  NLSR_LOG_DEBUG("Default NLSR identity: " << m_signingInfo.getSignerName());
+
+  // Can be moved to HelloProtocol and Lsdb ctor if initializeKey is set
+  // earlier in the Nlsr constructor so as to set m_signingInfo
+  setInfoInterestFilter();
+  setLsaInterestFilter();
+
+  // add top-level prefixes: router and localhost prefix
+  addDispatcherTopPrefix(ndn::Name(m_confParam.getRouterPrefix()).append("nlsr"));
+  addDispatcherTopPrefix(LOCALHOST_PREFIX);
+
+  enableIncomingFaceIdIndication();
+
+  registerKeyPrefix();
+  registerLocalhostPrefix();
+  registerRouterPrefix();
+
+  initializeFaces(std::bind(&Nlsr::processFaceDataset, this, _1),
+                  std::bind(&Nlsr::onFaceDatasetFetchTimeout, this, _1, _2, 0));
+
+  // Could be moved into ctor, but unit tests need to be modified
+  initialize();
 }
 
 void
@@ -120,7 +161,7 @@
 void
 Nlsr::registrationFailed(const ndn::Name& name)
 {
-  NLSR_LOG_ERROR("ERROR: Failed to register prefix in local hub's daemon");
+  NLSR_LOG_ERROR("ERROR: Failed to register prefix " << name << " in local hub's daemon");
   BOOST_THROW_EXCEPTION(Error("Error: Prefix registration failed"));
 }
 
@@ -234,30 +275,10 @@
 void
 Nlsr::initialize()
 {
-  NLSR_LOG_DEBUG("Initializing Nlsr");
-
   // Logging start
   m_adjacencyList.writeLog();
   NLSR_LOG_DEBUG(m_namePrefixList);
 
-  initializeKey();
-
-  NLSR_LOG_DEBUG("Default NLSR identity: " << m_signingInfo.getSignerName());
-
-  // Can be moved to HelloProtocol and Lsdb ctor if initializeKey is set
-  // earlier in the Nlsr constructor so as to set m_signingInfo
-  setInfoInterestFilter();
-  setLsaInterestFilter();
-
-  // add top-level prefixes: router and localhost prefix
-  addDispatcherTopPrefix(ndn::Name(m_confParam.getRouterPrefix()).append("nlsr"));
-  addDispatcherTopPrefix(LOCALHOST_PREFIX);
-
-  initializeFaces(std::bind(&Nlsr::processFaceDataset, this, _1),
-                  std::bind(&Nlsr::onFaceDatasetFetchTimeout, this, _1, _2, 0));
-
-  enableIncomingFaceIdIndication();
-
   m_lsdb.buildAndInstallOwnNameLsa();
 
   // Install coordinate LSAs if using HR or dry-run HR.
@@ -265,19 +286,10 @@
     m_lsdb.buildAndInstallOwnCoordinateLsa();
   }
 
-  registerKeyPrefix();
-  registerLocalhostPrefix();
-  registerRouterPrefix();
-
-  m_helloProtocol.scheduleInterest(m_confParam.getFirstHelloInterval());
-
   // Need to set direct neighbors' costs to 0 for hyperbolic routing
   if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
-
-    std::list<Adjacent>& neighbors = m_adjacencyList.getAdjList();
-
-    for (std::list<Adjacent>::iterator it = neighbors.begin(); it != neighbors.end(); ++it) {
-      it->setLinkCost(0);
+    for (auto&& neighbor : m_adjacencyList.getAdjList()) {
+      neighbor.setLinkCost(0);
     }
   }
 }
@@ -302,8 +314,9 @@
     nlsrInstanceIdentity = m_keyChain.createIdentity(nlsrInstanceName);
   }
   catch (const std::exception& e) {
+    NLSR_LOG_ERROR(e.what());
     NLSR_LOG_ERROR("Unable to create identity, NLSR will run without security!");
-    NLSR_LOG_DEBUG("Can be ignored if running in non-production environments.");
+    NLSR_LOG_ERROR("Can be ignored if running in non-production environments.");
     return;
   }
   auto nlsrInstanceKey = nlsrInstanceIdentity.getDefaultKey();
@@ -333,13 +346,8 @@
                                                .setSignatureInfo(signatureInfo));
   }
   catch (const std::exception& e) {
-    NLSR_LOG_WARN("ERROR: Router's " << e.what()
-                  << "NLSR is running without security."
-                  << " If security is enabled NLSR will not converge.");
-
-    std::cerr << "Router's " << e.what() << ". NLSR is running without security "
-              << "(Only for testing, should not be used in production.)"
-              << " If security is enabled NLSR will not converge." << std::endl;
+    NLSR_LOG_ERROR("Router's " << e.what() << "NLSR is running without security." <<
+                   " If security is enabled NLSR will not converge.");
   }
 
   m_signingInfo = ndn::security::SigningInfo(ndn::security::SigningInfo::SIGNER_TYPE_ID,
@@ -535,11 +543,11 @@
   NLSR_LOG_DEBUG("Processing face dataset");
 
   // Iterate over each neighbor listed in nlsr.conf
-  for (auto& adjacent : m_adjacencyList.getAdjList()) {
+  for (auto&& adjacent : m_adjacencyList.getAdjList()) {
 
-    const std::string faceUriString = adjacent.getFaceUri().toString();
+    const std::string& faceUriString = adjacent.getFaceUri().toString();
     // Check the list of FaceStatus objects we got for a match
-    for (const ndn::nfd::FaceStatus& faceStatus : faces) {
+    for (const auto& faceStatus : faces) {
       // Set the adjacency FaceID if we find a URI match and it was
       // previously unset. Change the boolean to true.
       if (adjacent.getFaceId() == 0 && faceUriString == faceStatus.getRemoteUri()) {
@@ -574,10 +582,6 @@
   m_fib.registerPrefix(adjName, faceUri, linkCost,
                        timeout, ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
 
-  m_fib.registerPrefix(m_confParam.getSyncPrefix(),
-                       faceUri, linkCost, timeout,
-                       ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
-
   m_fib.registerPrefix(m_confParam.getLsaPrefix(),
                        faceUri, linkCost, timeout,
                        ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
diff --git a/src/nlsr.hpp b/src/nlsr.hpp
index 2124ceb..bc82d01 100644
--- a/src/nlsr.hpp
+++ b/src/nlsr.hpp
@@ -272,21 +272,24 @@
   bool m_isDaemonProcess;
   ndn::security::ValidatorConfig& m_validator;
   std::vector<ndn::Name> m_strategySetOnRouters;
+  uint16_t m_numSyncPrefixRegistered = 0;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   Fib m_fib;
   RoutingTable m_routingTable;
   NamePrefixTable m_namePrefixTable;
   Lsdb m_lsdb;
+  HelloProtocol m_helloProtocol;
 
 private:
   ndn::util::signal::ScopedConnection m_afterSegmentValidatedConnection;
   ndn::util::signal::ScopedConnection m_onNewLsaConnection;
+  ndn::util::signal::ScopedConnection m_onPrefixRegistrationSuccess;
+  ndn::util::signal::ScopedConnection m_onHelloDataValidated;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   ndn::mgmt::Dispatcher m_dispatcher;
   DatasetInterestHandler m_datasetHandler;
-  HelloProtocol m_helloProtocol;
 
 private:
   /*! \brief Where NLSR stores certificates it claims to be
diff --git a/src/route/face-map.cpp b/src/route/face-map.cpp
deleted file mode 100644
index 52026d0..0000000
--- a/src/route/face-map.cpp
+++ /dev/null
@@ -1,44 +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
- *
- * 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 A K M Mahmudul Hoque <ahoque1@memphis.edu>
- *
- **/
-#include "face-map.hpp"
-#include "common.hpp"
-#include "logger.hpp"
-
-#include <iostream>
-#include <utility>
-
-namespace nlsr {
-
-INIT_LOGGER(route.FaceMap);
-
-void
-FaceMap::writeLog()
-{
-  NLSR_LOG_DEBUG("------- Face Map-----------");
-  for (const auto& it : m_table) {
-    NLSR_LOG_DEBUG("Face Map Entry (FaceUri: " << (it.second).getFaceUri()
-               << " Face Id: " << (it.second).getFaceId() << ")");
-  }
-}
-
-} // namespace nlsr
diff --git a/src/route/face-map.hpp b/src/route/face-map.hpp
deleted file mode 100644
index 9505229..0000000
--- a/src/route/face-map.hpp
+++ /dev/null
@@ -1,121 +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_FACE_MAP_HPP
-#define NLSR_FACE_MAP_HPP
-
-#include "common.hpp"
-
-#include <map>
-
-namespace nlsr {
-
-class FaceMapEntry
-{
-
-public:
-  FaceMapEntry(const std::string& faceUri, uint32_t faceId)
-    : m_faceUri(faceUri)
-    , m_faceId(faceId)
-  {
-  }
-
-  void
-  setFaceUri(const std::string& faceUri)
-  {
-    m_faceUri = faceUri;
-  }
-
-  const std::string&
-  getFaceUri() const
-  {
-    return m_faceUri;
-  }
-
-  void
-  setFaceId(uint32_t faceId)
-  {
-    m_faceId = faceId;
-  }
-
-  uint32_t
-  getFaceId() const
-  {
-    return m_faceId;
-  }
-
-  bool
-  compare(const FaceMapEntry& fme)
-  {
-    return m_faceUri == fme.getFaceUri();
-  }
-
-private:
-  std::string m_faceUri;
-  uint32_t m_faceId;
-};
-
-class FaceMap
-{
-
-public:
-  FaceMap()
-  {
-  }
-
-  ~FaceMap()
-  {
-  }
-
-  inline void
-  update(const std::string& faceUri, uint32_t faceId)
-  {
-    FaceMapEntry fme(faceUri, faceId);
-    std::map<std::string, FaceMapEntry>::iterator it = m_table.find(faceUri);
-    if (it == m_table.end()) {
-      m_table.emplace(faceUri, fme);
-    }
-    else {
-      (it->second).setFaceId(fme.getFaceId());
-    }
-  }
-
-  inline uint32_t
-  getFaceId(const std::string& faceUri)
-  {
-    FaceMapEntry fme(faceUri, 0);
-    std::map<std::string, FaceMapEntry>::iterator it = m_table.find(faceUri);
-    if (it != m_table.end()) {
-      return (it->second).getFaceId();
-    }
-    return 0;
-  }
-
-  void
-  writeLog();
-
-private:
-  std::map<std::string, FaceMapEntry> m_table;
-};
-
-} // namespace nlsr
-
-#endif // NLSR_FACE_MAP_HPP
diff --git a/src/route/fib.cpp b/src/route/fib.cpp
index 9ee14c7..cd2b28c 100644
--- a/src/route/fib.cpp
+++ b/src/route/fib.cpp
@@ -202,9 +202,9 @@
                     uint64_t faceCost, const ndn::time::milliseconds& timeout,
                     uint64_t flags, uint8_t times)
 {
-  uint64_t faceId = m_adjacencyList.getFaceId(ndn::FaceUri(faceUri));
+  uint64_t faceId = m_adjacencyList.getFaceId(faceUri);
 
-  if (faceId != 0) {
+  if (faceId > 0) {
     ndn::nfd::ControlParameters faceParameters;
     faceParameters
      .setName(namePrefix)
@@ -216,13 +216,9 @@
 
     NLSR_LOG_DEBUG("Registering prefix: " << faceParameters.getName() << " faceUri: " << faceUri);
     m_controller.start<ndn::nfd::RibRegisterCommand>(faceParameters,
-                                                     std::bind(&Fib::onRegistrationSuccess, this, _1,
-                                                               "Successful in name registration",
-                                                               faceUri),
-                                                     std::bind(&Fib::onRegistrationFailure, this, _1,
-                                                               "Failed in name registration",
-                                                               faceParameters,
-                                                               faceUri, times));
+      std::bind(&Fib::onRegistrationSuccess, this, _1, faceUri),
+      std::bind(&Fib::onRegistrationFailure, this, _1,
+                faceParameters, faceUri, times));
   }
   else {
     NLSR_LOG_WARN("Error: No Face Id for face uri: " << faceUri);
@@ -230,31 +226,28 @@
 }
 
 void
-Fib::onRegistrationSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
-                           const std::string& message, const ndn::FaceUri& faceUri)
+Fib::onRegistrationSuccess(const ndn::nfd::ControlParameters& param,
+                           const ndn::FaceUri& faceUri)
 {
-  NLSR_LOG_DEBUG(message << ": " << commandSuccessResult.getName() <<
-                 " Face Uri: " << faceUri << " faceId: " << commandSuccessResult.getFaceId());
+  NLSR_LOG_DEBUG("Successful in name registration: " << param.getName() <<
+                 " Face Uri: " << faceUri << " faceId: " << param.getFaceId());
 
   auto adjacent = m_adjacencyList.findAdjacent(faceUri);
   if (adjacent != m_adjacencyList.end()) {
-    adjacent->setFaceId(commandSuccessResult.getFaceId());
+    adjacent->setFaceId(param.getFaceId());
   }
-
-  // Update the fast-access FaceMap with the new Face ID, too
-  m_faceMap.update(faceUri.toString(), commandSuccessResult.getFaceId());
-  m_faceMap.writeLog();
+  onPrefixRegistrationSuccess(param.getName());
 }
 
 void
 Fib::onRegistrationFailure(const ndn::nfd::ControlResponse& response,
-                           const std::string& message,
                            const ndn::nfd::ControlParameters& parameters,
                            const ndn::FaceUri& faceUri,
                            uint8_t times)
 {
-  NLSR_LOG_DEBUG(message << ": " << response.getText() << " (code: " << response.getCode() << ")");
-  NLSR_LOG_DEBUG("Prefix: " << parameters.getName() << " failed for: " << times);
+  NLSR_LOG_DEBUG("Failed in name registration: " << response.getText() <<
+                 " (code: " << response.getCode() << ")");
+  NLSR_LOG_DEBUG("Prefix: " << parameters.getName() << " failed for: " << +times);
   if (times < 3) {
     NLSR_LOG_DEBUG("Trying to register again...");
     registerPrefix(parameters.getName(), faceUri,
@@ -270,7 +263,12 @@
 void
 Fib::unregisterPrefix(const ndn::Name& namePrefix, const std::string& faceUri)
 {
-  uint32_t faceId = m_faceMap.getFaceId(faceUri);
+  uint64_t faceId = 0;
+  auto adjacent = m_adjacencyList.findAdjacent(ndn::FaceUri(faceUri));
+  if (adjacent != m_adjacencyList.end()) {
+    faceId = adjacent->getFaceId();
+  }
+
   NLSR_LOG_DEBUG("Unregister prefix: " << namePrefix << " Face Uri: " << faceUri);
   if (faceId > 0) {
     ndn::nfd::ControlParameters controlParameters;
@@ -278,31 +276,20 @@
       .setName(namePrefix)
       .setFaceId(faceId)
       .setOrigin(ndn::nfd::ROUTE_ORIGIN_NLSR);
+
     m_controller.start<ndn::nfd::RibUnregisterCommand>(controlParameters,
-                                                       std::bind(&Fib::onUnregistrationSuccess, this, _1,
-                                                                 "Successful in unregistering name"),
-                                                       std::bind(&Fib::onUnregistrationFailure,
-                                                                 this, _1,
-                                                                 "Failed in unregistering name"));
+      [] (const ndn::nfd::ControlParameters& commandSuccessResult) {
+        NLSR_LOG_DEBUG("Unregister successful Prefix: " << commandSuccessResult.getName() <<
+                       " Face Id: " << commandSuccessResult.getFaceId());
+      },
+      [] (const ndn::nfd::ControlResponse& response) {
+        NLSR_LOG_DEBUG("Failed in unregistering name" << ": " << response.getText() <<
+                 " (code: " << response.getCode() << ")");
+      });
   }
 }
 
 void
-Fib::onUnregistrationSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
-                             const std::string& message)
-{
-  NLSR_LOG_DEBUG("Unregister successful Prefix: " << commandSuccessResult.getName() <<
-                 " Face Id: " << commandSuccessResult.getFaceId());
-}
-
-void
-Fib::onUnregistrationFailure(const ndn::nfd::ControlResponse& response,
-                             const std::string& message)
-{
-  NLSR_LOG_DEBUG(message << ": " << response.getText() << " (code: " << response.getCode() << ")");
-}
-
-void
 Fib::setStrategy(const ndn::Name& name, const std::string& strategy, uint32_t count)
 {
   ndn::nfd::ControlParameters parameters;
diff --git a/src/route/fib.hpp b/src/route/fib.hpp
index f2d952a..25677e3 100644
--- a/src/route/fib.hpp
+++ b/src/route/fib.hpp
@@ -22,7 +22,6 @@
 #ifndef NLSR_ROUTE_FIB_HPP
 #define NLSR_ROUTE_FIB_HPP
 
-#include "face-map.hpp"
 #include "fib-entry.hpp"
 #include "test-access-control.hpp"
 
@@ -164,30 +163,17 @@
   /*! \brief Log registration success, and update the Face ID associated with a URI.
    */
   void
-  onRegistrationSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
-                        const std::string& message, const ndn::FaceUri& faceUri);
+  onRegistrationSuccess(const ndn::nfd::ControlParameters& param,
+                        const ndn::FaceUri& faceUri);
 
   /*! \brief Retry a prefix (next-hop) registration up to three (3) times.
    */
   void
   onRegistrationFailure(const ndn::nfd::ControlResponse& response,
-                        const std::string& message,
                         const ndn::nfd::ControlParameters& parameters,
                         const ndn::FaceUri& faceUri,
                         uint8_t times);
 
-  /*! \brief Log a successful unregistration.
-   */
-  void
-  onUnregistrationSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
-                          const std::string& message);
-
-  /*! \brief Log an unregistration failure. Does not retry.
-   */
-  void
-  onUnregistrationFailure(const ndn::nfd::ControlResponse& response,
-                               const std::string& message);
-
   /*! \brief Log a successful strategy setting.
    */
   void
@@ -240,6 +226,7 @@
 public:
   static const std::string MULTICAST_STRATEGY;
   static const std::string BEST_ROUTE_V2_STRATEGY;
+  ndn::util::Signal<Fib, const ndn::Name&> onPrefixRegistrationSuccess;
 
 private:
   ndn::Scheduler& m_scheduler;
@@ -247,7 +234,6 @@
   ndn::nfd::Controller m_controller;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  FaceMap m_faceMap;
   std::map<ndn::Name, FibEntry> m_table;
 
 private:
diff --git a/src/route/routing-table-calculator.cpp b/src/route/routing-table-calculator.cpp
index a079933..eb821e8 100644
--- a/src/route/routing-table-calculator.cpp
+++ b/src/route/routing-table-calculator.cpp
@@ -142,8 +142,13 @@
   for (size_t i = 0; i < m_nRouters; i++) {
     std::string line;
     for (size_t j = 0; j < m_nRouters; j++) {
-      line += boost::lexical_cast<std::string>(adjMatrix[i][j]);
-      line += " ";
+      if (adjMatrix[i][j] == LinkStateRoutingTableCalculator::NO_NEXT_HOP) {
+        line += "0 ";
+      }
+      else {
+        line += boost::lexical_cast<std::string>(adjMatrix[i][j]);
+        line += " ";
+      }
     }
     line = boost::lexical_cast<std::string>(i) + "|" + line;
     NLSR_LOG_DEBUG(line);
diff --git a/src/route/routing-table-calculator.hpp b/src/route/routing-table-calculator.hpp
index 0a40a1c..683eb58 100644
--- a/src/route/routing-table-calculator.hpp
+++ b/src/route/routing-table-calculator.hpp
@@ -200,6 +200,7 @@
   static const int EMPTY_PARENT;
   static const double INF_DISTANCE;
   static const int NO_MAPPING_NUM;
+public:
   static const int NO_NEXT_HOP;
 
 };
diff --git a/src/route/routing-table-entry.hpp b/src/route/routing-table-entry.hpp
index 6e01c45..fd98c32 100644
--- a/src/route/routing-table-entry.hpp
+++ b/src/route/routing-table-entry.hpp
@@ -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-2019,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -66,9 +66,8 @@
   inline bool
   operator==(RoutingTableEntry& rhs)
   {
-    return ((*this).getDestination() == rhs.getDestination()
-            &&
-           (*this).getNexthopList() == rhs.getNexthopList());
+    return ((*this).getDestination() == rhs.getDestination() &&
+            (*this).getNexthopList() == rhs.getNexthopList());
   }
 
 protected:
diff --git a/src/route/routing-table-pool-entry.cpp b/src/route/routing-table-pool-entry.cpp
index 7e081ae..9102ed0 100644
--- a/src/route/routing-table-pool-entry.cpp
+++ b/src/route/routing-table-pool-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-2019,  The University of Memphis,
  *                           Regents of the University of California
  *
  * This file is part of NLSR (Named-data Link State Routing).
@@ -43,8 +43,7 @@
 bool
 operator==(const RoutingTablePoolEntry& lhs, const RoutingTablePoolEntry& rhs)
 {
-  return (lhs.getDestination() == rhs.getDestination()
-          &&
+  return (lhs.getDestination() == rhs.getDestination() &&
           lhs.getNexthopList() == rhs.getNexthopList());
 }
 
diff --git a/src/route/routing-table.cpp b/src/route/routing-table.cpp
index f0e4aac..60b05f9 100644
--- a/src/route/routing-table.cpp
+++ b/src/route/routing-table.cpp
@@ -27,7 +27,6 @@
 #include "name-prefix-table.hpp"
 #include "logger.hpp"
 
-#include <iostream>
 #include <list>
 #include <string>
 
@@ -42,7 +41,6 @@
   , m_fib(fib)
   , m_lsdb(lsdb)
   , m_namePrefixTable(namePrefixTable)
-  , m_NO_NEXT_HOP{-12345}
   , m_routingCalcInterval{confParam.getRoutingCalcInterval()}
   , m_isRoutingTableCalculating(false)
   , m_isRouteCalculationScheduled(false)
diff --git a/src/route/routing-table.hpp b/src/route/routing-table.hpp
index f43ad11..c149eb7 100644
--- a/src/route/routing-table.hpp
+++ b/src/route/routing-table.hpp
@@ -75,12 +75,6 @@
   void
   scheduleRoutingTableCalculation();
 
-  int
-  getNoNextHop()
-  {
-    return m_NO_NEXT_HOP;
-  }
-
   void
   setRoutingCalcInterval(uint32_t interval)
   {
@@ -141,8 +135,6 @@
   Lsdb& m_lsdb;
   NamePrefixTable& m_namePrefixTable;
 
-  const int m_NO_NEXT_HOP;
-
   std::list<RoutingTableEntry> m_dryTable;
 
   ndn::time::seconds m_routingCalcInterval;
diff --git a/src/sequencing-manager.cpp b/src/sequencing-manager.cpp
index 2aa8e98..bae9e68 100644
--- a/src/sequencing-manager.cpp
+++ b/src/sequencing-manager.cpp
@@ -138,8 +138,14 @@
 SequencingManager::writeLog() const
 {
   NLSR_LOG_DEBUG("----SequencingManager----");
-  NLSR_LOG_DEBUG("Adj LSA seq no: " << m_adjLsaSeq);
-  NLSR_LOG_DEBUG("Cor LSA Seq no: " << m_corLsaSeq);
+  if (m_hyperbolicState == HYPERBOLIC_STATE_OFF ||
+      m_hyperbolicState == HYPERBOLIC_STATE_DRY_RUN) {
+    NLSR_LOG_DEBUG("Adj LSA seq no: " << m_adjLsaSeq);
+  }
+  if (m_hyperbolicState == HYPERBOLIC_STATE_ON ||
+      m_hyperbolicState == HYPERBOLIC_STATE_DRY_RUN) {
+    NLSR_LOG_DEBUG("Cor LSA Seq no: " << m_corLsaSeq);
+  }
   NLSR_LOG_DEBUG("Name LSA Seq no: " << m_nameLsaSeq);
 }
 
