diff --git a/nlsr.conf b/nlsr.conf
index 8b10210..48f34a6 100644
--- a/nlsr.conf
+++ b/nlsr.conf
@@ -9,9 +9,11 @@
   router /%C1.Router/cs/pollux    ; name of the router in ndn URI format
 
   ; lsa-refresh-time is the time in seconds, after which router will refresh its LSAs
-
   lsa-refresh-time 1800      ; default value 1800. Valid values 240-7200
 
+  ; InterestLifetime (in seconds) for LSA fetching
+  lsa-interest-lifetime 4    ; default value 4. Valid values 1-60
+
   ; log-level is to set the levels of log for NLSR
 
   log-level  INFO       ; default value INFO, valid value DEBUG, INFO
diff --git a/src/communication/sync-logic-handler.cpp b/src/communication/sync-logic-handler.cpp
index dea3782..2570d2d 100644
--- a/src/communication/sync-logic-handler.cpp
+++ b/src/communication/sync-logic-handler.cpp
@@ -97,9 +97,7 @@
         interestName.append(routerName);
         interestName.append("name");
         interestName.appendNumber(sm.getNameLsaSeq());
-        pnlsr.getLsdb().expressInterest(interestName,
-                                        pnlsr.getConfParameter().getInterestResendTime(),
-                                        0);
+        pnlsr.getLsdb().expressInterest(interestName, 0);
       }
       if (pnlsr.getLsdb().isAdjLsaNew(rName.append("adjacency"), sm.getAdjLsaSeq())) {
         _LOG_DEBUG("Updated Adj LSA. Need to fetch it");
@@ -107,9 +105,7 @@
         interestName.append(routerName);
         interestName.append("adjacency");
         interestName.appendNumber(sm.getAdjLsaSeq());
-        pnlsr.getLsdb().expressInterest(interestName,
-                                        pnlsr.getConfParameter().getInterestResendTime(),
-                                        0);
+        pnlsr.getLsdb().expressInterest(interestName, 0);
       }
       if (pnlsr.getLsdb().isCoordinateLsaNew(rName.append("coordinate"),
                                              sm.getCorLsaSeq())) {
@@ -118,9 +114,7 @@
         interestName.append(routerName);
         interestName.append("coordinate");
         interestName.appendNumber(sm.getCorLsaSeq());
-        pnlsr.getLsdb().expressInterest(interestName,
-                                        pnlsr.getConfParameter().getInterestResendTime(),
-                                        0);
+        pnlsr.getLsdb().expressInterest(interestName, 0);
       }
     }
     catch (std::exception& e) {
diff --git a/src/conf-file-processor.cpp b/src/conf-file-processor.cpp
index 0328ecd..5f3c147 100644
--- a/src/conf-file-processor.cpp
+++ b/src/conf-file-processor.cpp
@@ -172,6 +172,23 @@
   }
 
   try {
+    int lifetime = section.get<int>("lsa-interest-lifetime");
+    if (lifetime >= LSA_INTEREST_LIFETIME_MIN && lifetime <= LSA_INTEREST_LIFETIME_MAX) {
+      m_nlsr.getConfParameter().setLsaInterestLifetime(ndn::time::seconds(lifetime));
+    }
+    else {
+      std::cerr << "Wrong value for lsa-interest-timeout. "
+                << "Allowed value:" << LSA_INTEREST_LIFETIME_MIN << "-"
+                << LSA_INTEREST_LIFETIME_MAX << std::endl;
+      return false;
+    }
+  }
+  catch (const std::exception& ex) {
+    std::cerr << ex.what() << std::endl;
+    // return false;
+  }
+
+  try {
     std::string logLevel = section.get<string>("log-level");
     if ( boost::iequals(logLevel, "info") || boost::iequals(logLevel, "debug")) {
       m_nlsr.getConfParameter().setLogLevel(logLevel);
diff --git a/src/conf-parameter.cpp b/src/conf-parameter.cpp
index 0984b99..f45fea7 100644
--- a/src/conf-parameter.cpp
+++ b/src/conf-parameter.cpp
@@ -36,10 +36,11 @@
   _LOG_DEBUG("Router Prefix: " << m_routerPrefix);
   _LOG_DEBUG("ChronoSync sync Prifex: " << m_chronosyncPrefix);
   _LOG_DEBUG("ChronoSync LSA prefix: " << m_lsaPrefix);
-  _LOG_DEBUG("Interest Retry number: " << m_interestRetryNumber);
-  _LOG_DEBUG("Interest Resend second: " << m_interestResendTime);
-  _LOG_DEBUG("Info Interest Interval: " << m_infoInterestInterval);
+  _LOG_DEBUG("Hello Interest retry number: " << m_interestRetryNumber);
+  _LOG_DEBUG("Hello Interest resend second: " << m_interestResendTime);
+  _LOG_DEBUG("Info Interest interval: " << m_infoInterestInterval);
   _LOG_DEBUG("LSA refresh time: " << m_lsaRefreshTime);
+  _LOG_DEBUG("LSA Interest lifetime: " << getLsaInterestLifetime());
   _LOG_DEBUG("Max Faces Per Prefix: " << m_maxFacesPerPrefix);
   _LOG_DEBUG("Hyperbolic ROuting: " << m_hyperbolicState);
   _LOG_DEBUG("Hyp R: " << m_corR);
diff --git a/src/conf-parameter.hpp b/src/conf-parameter.hpp
index cb97943..b8b5b72 100644
--- a/src/conf-parameter.hpp
+++ b/src/conf-parameter.hpp
@@ -27,6 +27,7 @@
 #include <boost/cstdint.hpp>
 #include <ndn-cxx/common.hpp>
 #include <ndn-cxx/face.hpp>
+#include <ndn-cxx/util/time.hpp>
 
 #include "logger.hpp"
 
@@ -39,6 +40,12 @@
 };
 
 enum {
+  LSA_INTEREST_LIFETIME_MIN = 1,
+  LSA_INTEREST_LIFETIME_DEFAULT = 4,
+  LSA_INTEREST_LIFETIME_MAX = 60
+};
+
+enum {
   HELLO_RETRIES_MIN = 1,
   HELLO_RETRIES_DEFAULT = 3,
   HELLO_RETRIES_MAX = 15
@@ -73,6 +80,7 @@
 public:
   ConfParameter()
     : m_lsaRefreshTime(LSA_REFRESH_TIME_DEFAULT)
+    , m_lsaInterestLifetime(ndn::time::seconds(static_cast<int>(LSA_INTEREST_LIFETIME_DEFAULT)))
     , m_routerDeadInterval(2*LSA_REFRESH_TIME_DEFAULT)
     , m_logLevel("INFO")
     , m_interestRetryNumber(HELLO_RETRIES_DEFAULT)
@@ -82,7 +90,8 @@
     , m_corR(0)
     , m_corTheta(0)
     , m_maxFacesPerPrefix(MAX_FACES_PER_PREFIX_MIN)
-  {}
+  {
+  }
 
   void
   setNetwork(const ndn::Name& networkName)
@@ -91,14 +100,14 @@
     m_chronosyncPrefix = m_network;
     m_chronosyncPrefix.append("NLSR");
     m_chronosyncPrefix.append("sync");
-    
+
     m_lsaPrefix = m_network;
     m_lsaPrefix.append("NLSR");
     m_lsaPrefix.append("LSA");
   }
 
   const ndn::Name&
-  getNetwork()
+  getNetwork() const
   {
     return m_network;
   }
@@ -110,7 +119,7 @@
   }
 
   const ndn::Name&
-  getRouterName()
+  getRouterName() const
   {
     return m_routerName;
   }
@@ -122,7 +131,7 @@
   }
 
   const ndn::Name&
-  getSiteName()
+  getSiteName() const
   {
     return m_siteName;
   }
@@ -136,20 +145,20 @@
   }
 
   const ndn::Name&
-  getRouterPrefix()
+  getRouterPrefix() const
   {
     return m_routerPrefix;
   }
 
 
   const ndn::Name&
-  getChronosyncPrefix()
+  getChronosyncPrefix() const
   {
     return m_chronosyncPrefix;
   }
 
   const ndn::Name&
-  getLsaPrefix()
+  getLsaPrefix() const
   {
     return m_lsaPrefix;
   }
@@ -162,31 +171,43 @@
   }
 
   int32_t
-  getLsaRefreshTime()
+  getLsaRefreshTime() const
   {
     return m_lsaRefreshTime;
   }
 
   void
+  setLsaInterestLifetime(const ndn::time::seconds& lifetime)
+  {
+    m_lsaInterestLifetime = lifetime;
+  }
+
+  const ndn::time::seconds&
+  getLsaInterestLifetime() const
+  {
+    return m_lsaInterestLifetime;
+  }
+
+  void
   setRouterDeadInterval(int64_t rdt)
   {
     m_routerDeadInterval = rdt;
   }
 
   int64_t
-  getRouterDeadInterval()
+  getRouterDeadInterval() const
   {
     return m_routerDeadInterval;
   }
-  
-  void 
+
+  void
   setLogLevel(const std::string& logLevel)
   {
     m_logLevel = logLevel;
   }
-  
-  const std::string& 
-  getLogLevel()
+
+  const std::string&
+  getLogLevel() const
   {
     return m_logLevel;
   }
@@ -198,7 +219,7 @@
   }
 
   uint32_t
-  getInterestRetryNumber()
+  getInterestRetryNumber() const
   {
     return m_interestRetryNumber;
   }
@@ -210,13 +231,13 @@
   }
 
   int32_t
-  getInterestResendTime()
+  getInterestResendTime() const
   {
     return m_interestResendTime;
   }
 
   int32_t
-  getInfoInterestInterval()
+  getInfoInterestInterval() const
   {
     return m_infoInterestInterval;
   }
@@ -234,7 +255,7 @@
   }
 
   int32_t
-  getHyperbolicState()
+  getHyperbolicState() const
   {
     return m_hyperbolicState;
   }
@@ -250,7 +271,7 @@
   }
 
   double
-  getCorR()
+  getCorR() const
   {
     return m_corR;
   }
@@ -262,11 +283,11 @@
   }
 
   double
-  getCorTheta()
+  getCorTheta() const
   {
     return m_corTheta;
   }
-  
+
   void
   setMaxFacesPerPrefix(int32_t mfpp)
   {
@@ -274,7 +295,7 @@
   }
 
   int32_t
-  getMaxFacesPerPrefix()
+  getMaxFacesPerPrefix() const
   {
     return m_maxFacesPerPrefix;
   }
@@ -286,7 +307,7 @@
   }
 
   const std::string&
-  getLogDir()
+  getLogDir() const
   {
     return m_logDir;
   }
@@ -298,7 +319,7 @@
   }
 
   const std::string&
-  getSeqFileDir()
+  getSeqFileDir() const
   {
     return m_seqFileDir;
   }
@@ -318,21 +339,22 @@
   ndn::Name m_lsaPrefix;
 
   int32_t  m_lsaRefreshTime;
+  ndn::time::seconds m_lsaInterestLifetime;
   int64_t  m_routerDeadInterval;
   std::string m_logLevel;
 
   uint32_t m_interestRetryNumber;
   int32_t  m_interestResendTime;
-  
-  
+
+
   int32_t  m_infoInterestInterval;
-  
+
   int32_t m_hyperbolicState;
   double m_corR;
   double m_corTheta;
 
   int32_t m_maxFacesPerPrefix;
-  
+
   std::string m_logDir;
   std::string m_seqFileDir;
 
diff --git a/src/lsdb.cpp b/src/lsdb.cpp
index 55e8044..dc7882d 100644
--- a/src/lsdb.cpp
+++ b/src/lsdb.cpp
@@ -612,9 +612,9 @@
 }
 
 void
-Lsdb::setLsaRefreshTime(int lrt)
+Lsdb::setLsaRefreshTime(const seconds& lsaRefreshTime)
 {
-  m_lsaRefreshTime = ndn::time::seconds(lrt);
+  m_lsaRefreshTime = lsaRefreshTime;
 }
 
 void
@@ -749,20 +749,23 @@
 
 
 void
-Lsdb::expressInterest(const ndn::Name& interestName, uint32_t interestLifeTime,
-                      uint32_t timeoutCount)
+Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
+                      steady_clock::TimePoint deadline/* = steady_clock::TimePoint::min()*/)
 {
+  if (deadline == steady_clock::TimePoint::min()) {
+    deadline = steady_clock::now() + m_lsaRefreshTime;
+  }
+
   ndn::Interest interest(interestName);
   uint64_t interestedLsSeqNo = interestName[-1].toNumber();
-  _LOG_DEBUG("Expressing Interest for LSA(name): " << interestName <<
-              " Seq number: " << interestedLsSeqNo );
-  interest.setInterestLifetime(ndn::time::seconds(interestLifeTime));
-  interest.setMustBeFresh(true);
+  _LOG_DEBUG("Expressing Interest for LSA(name): " << interestName
+             << " Seq number: " << interestedLsSeqNo);
+  interest.setInterestLifetime(m_nlsr.getConfParameter().getLsaInterestLifetime());
   m_nlsr.getNlsrFace().expressInterest(interest,
                                        ndn::bind(&Lsdb::onContent,
-                                                 this, _1, _2),
+                                                 this, _2, deadline),
                                        ndn::bind(&Lsdb::processInterestTimedOut,
-                                                 this, _1, timeoutCount));
+                                                 this, _1, timeoutCount, deadline));
 }
 
 void
@@ -811,7 +814,7 @@
 {
   ndn::shared_ptr<ndn::Data> data = ndn::make_shared<ndn::Data>();
   data->setName(ndn::Name(interest.getName()).appendVersion());
-  data->setFreshnessPeriod(ndn::time::seconds(10));
+  data->setFreshnessPeriod(m_lsaRefreshTime);
   data->setContent(reinterpret_cast<const uint8_t*>(content.c_str()), content.size());
   m_nlsr.getKeyChain().sign(*data, m_nlsr.getDefaultCertName());
   ndn::SignatureSha256WithRsa signature(data->getSignature());
@@ -864,7 +867,8 @@
 }
 
 void
-Lsdb::onContent(const ndn::Interest& interest, const ndn::Data& data)
+Lsdb::onContent(const ndn::Data& data,
+                const steady_clock::TimePoint& deadline)
 {
   _LOG_DEBUG("Received data for LSA(name): " << data.getName());
   if (data.getSignature().hasKeyLocator()) {
@@ -874,11 +878,28 @@
   }
   m_nlsr.getValidator().validate(data,
                                  ndn::bind(&Lsdb::onContentValidated, this, _1),
-                                 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2));
+                                 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
+                                           deadline));
 
 }
 
 void
+Lsdb::retryContentValidation(const ndn::shared_ptr<const ndn::Data>& data,
+                             const steady_clock::TimePoint& deadline)
+{
+  _LOG_DEBUG("Retrying validation of LSA(name): " << data->getName());
+  if (data->getSignature().hasKeyLocator()) {
+    if (data->getSignature().getKeyLocator().getType() == ndn::KeyLocator::KeyLocator_Name) {
+      _LOG_DEBUG("Data signed with: " << data->getSignature().getKeyLocator().getName());
+    }
+  }
+  m_nlsr.getValidator().validate(*data,
+                                 ndn::bind(&Lsdb::onContentValidated, this, _1),
+                                 ndn::bind(&Lsdb::onContentValidationFailed, this, _1, _2,
+                                           deadline));
+}
+
+void
 Lsdb::onContentValidated(const ndn::shared_ptr<const ndn::Data>& data)
 {
   const ndn::Name& dataName = data->getName();
@@ -916,9 +937,23 @@
 }
 
 void
-Lsdb::onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data, const std::string& msg)
+Lsdb::onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data,
+                                const std::string& msg,
+                                const steady_clock::TimePoint& deadline)
 {
   _LOG_DEBUG("Validation Error: " << msg);
+
+  // Delay re-validation by LSA Interest Lifetime.  When error callback will have an error
+  // code, re-validation should be done only when some keys from certification chain failed
+  // to be fetched.  After that change, delaying will no longer be necessary.
+
+  // Stop retrying if delayed re-validation will be scheduled pass the deadline
+  if (steady_clock::now() + m_nlsr.getConfParameter().getLsaInterestLifetime() < deadline) {
+    _LOG_DEBUG("Scheduling revalidation");
+    m_nlsr.getScheduler().scheduleEvent(m_nlsr.getConfParameter().getLsaInterestLifetime(),
+                                        ndn::bind(&Lsdb::retryContentValidation,
+                                                  this, data, deadline));
+  }
 }
 
 void
@@ -967,16 +1002,14 @@
 }
 
 void
-Lsdb::processInterestTimedOut(const ndn::Interest& interest, uint32_t timeoutCount)
+Lsdb::processInterestTimedOut(const ndn::Interest& interest, uint32_t retransmitNo,
+                              const ndn::time::steady_clock::TimePoint& deadline)
 {
-  const ndn::Name& interestName(interest.getName());
+  const ndn::Name& interestName = interest.getName();
   _LOG_DEBUG("Interest timed out for  LSA(name): " << interestName);
-  if ((timeoutCount + 1) <= m_nlsr.getConfParameter().getInterestRetryNumber()) {
-    _LOG_DEBUG("Interest timeoutCount: " << (timeoutCount + 1));
-    _LOG_DEBUG("Need to express interest again for LSA(name): " << interestName);
-    expressInterest(interestName,
-                    m_nlsr.getConfParameter().getInterestResendTime(),
-                    timeoutCount + 1);
+
+  if (ndn::time::steady_clock::now() < deadline) {
+    expressInterest(interestName, retransmitNo + 1, deadline);
   }
 }
 
diff --git a/src/lsdb.hpp b/src/lsdb.hpp
index 6bfc849..ef45cea 100644
--- a/src/lsdb.hpp
+++ b/src/lsdb.hpp
@@ -31,6 +31,9 @@
 #include "lsa.hpp"
 
 namespace nlsr {
+
+using namespace ndn::time;
+
 class Nlsr;
 
 class Lsdb
@@ -109,7 +112,7 @@
   writeAdjLsdbLog();
 
   void
-  setLsaRefreshTime(int lrt);
+  setLsaRefreshTime(const seconds& lsaRefreshTime);
 
   void
   setThisRouterPrefix(std::string trp);
@@ -136,29 +139,29 @@
 
   ndn::EventId
   scheduleNameLsaExpiration(const ndn::Name& key, int seqNo,
-                            const ndn::time::seconds& expTime);
+                            const seconds& expTime);
 
   void
   exprireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo);
 
   ndn::EventId
   scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo,
-                           const ndn::time::seconds& expTime);
+                           const seconds& expTime);
 
   void
   exprireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo);
 
   ndn::EventId
   scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
-                                  const ndn::time::seconds& expTime);
+                                  const seconds& expTime);
 
   void
   exprireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
                                 uint64_t seqNo);
 public:
   void
-  expressInterest(const ndn::Name& interestName, uint32_t interestLifeTime,
-                  uint32_t timeoutCount);
+  expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
+                  steady_clock::TimePoint deadline = steady_clock::TimePoint::min());
 
   void
   processInterest(const ndn::Name& name, const ndn::Interest& interest);
@@ -183,13 +186,27 @@
                                   uint32_t interestedlsSeqNo);
 
   void
-  onContent(const ndn::Interest& interest, const ndn::Data& data);
+  onContent(const ndn::Data& data, const steady_clock::TimePoint& deadline);
+
+  /**
+   * @brief Retry validation after it fails
+   *
+   * Data packet validation can fail either because the packet does not have
+   * valid signature (fatal) or because some of the certificate chain Data packets
+   * failed to be fetched (non-fatal).  Currently, the library does not provide
+   * clear indication (besides plain-text message in error callback) of what is
+   * the reason for failure and we will try to re-validate for as long as it the deadline.
+   */
+  void
+  retryContentValidation(const ndn::shared_ptr<const ndn::Data>& data,
+                         const steady_clock::TimePoint& deadline);
 
   void
   onContentValidated(const ndn::shared_ptr<const ndn::Data>& data);
 
   void
-  onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data, const std::string& msg);
+  onContentValidationFailed(const ndn::shared_ptr<const ndn::Data>& data, const std::string& msg,
+                            const steady_clock::TimePoint& deadline);
 
   void
   processContentNameLsa(const ndn::Name& lsaKey,
@@ -204,9 +221,10 @@
                               uint32_t lsSeqNo, std::string& dataContent);
 
   void
-  processInterestTimedOut(const ndn::Interest& interest, uint32_t timeoutCount);
+  processInterestTimedOut(const ndn::Interest& interest, uint32_t retransmitNo,
+                          const steady_clock::TimePoint& deadline);
 
-  ndn::time::system_clock::TimePoint
+  system_clock::TimePoint
   getLsaExpirationTimePoint();
 
 private:
@@ -218,7 +236,7 @@
   std::list<AdjLsa> m_adjLsdb;
   std::list<CoordinateLsa> m_corLsdb;
 
-  ndn::time::seconds m_lsaRefreshTime;
+  seconds m_lsaRefreshTime;
   std::string m_thisRouterPrefix;
 
 };
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index 3ee4ccd..893809a 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -122,7 +122,7 @@
 {
   _LOG_DEBUG("Initializing Nlsr");
   m_confParam.buildRouterPrefix();
-  m_nlsrLsdb.setLsaRefreshTime(m_confParam.getLsaRefreshTime());
+  m_nlsrLsdb.setLsaRefreshTime(ndn::time::seconds(m_confParam.getLsaRefreshTime()));
   m_nlsrLsdb.setThisRouterPrefix(m_confParam.getRouterPrefix().toUri());
   m_fib.setEntryRefreshTime(2 * m_confParam.getLsaRefreshTime());
   m_sequencingManager.setSeqFileName(m_confParam.getSeqFileDir());
diff --git a/tests/test-adjacent.cpp b/tests/test-adjacent.cpp
index 0dc7af0..d7eef1b 100644
--- a/tests/test-adjacent.cpp
+++ b/tests/test-adjacent.cpp
@@ -40,8 +40,8 @@
   Adjacent adjacent2(ADJ_NAME_2);
   BOOST_CHECK(adjacent1 == adjacent2);
 
-  adjacent1.setLinkCost(10.5);
-  BOOST_CHECK_CLOSE(adjacent1.getLinkCost(), 10.5, 0.0001);
+  adjacent1.setLinkCost(10.1);
+  BOOST_CHECK_EQUAL(adjacent1.getLinkCost(), 11);
 
   BOOST_CHECK_EQUAL(adjacent1.getName(), "testname");
 
diff --git a/tests/test-conf-file-processor.cpp b/tests/test-conf-file-processor.cpp
index a786ec9..7025914 100644
--- a/tests/test-conf-file-processor.cpp
+++ b/tests/test-conf-file-processor.cpp
@@ -38,27 +38,30 @@
   const std::string CONFIG =
      "general\n"
     "{\n"
-    "  network /ndn/\n"      
+    "  network /ndn/\n"
     "  site /memphis.edu/\n"
     "  router /cs/pollux/\n"
     "  lsa-refresh-time 1800\n"
+    "  lsa-interest-lifetime 3\n"
     "  log-level  INFO\n"
+    "  log-dir /tmp\n"
+    "  seq-dir /tmp\n"
     "}\n\n"
     "neighbors\n"
     "{\n"
     "  hello-retries 3\n"
-    "  hello-time-out 1\n"
+    "  hello-timeout 1\n"
     "  hello-interval  60\n\n"
     "  neighbor\n"
     "  {\n"
     "    name /ndn/memphis.edu/cs/castor\n"
-    "    face-id  15\n"
+    "    face-uri  udp4://localhost\n"
     "    link-cost 20\n"
     "  }\n\n"
     "  neighbor\n"
     "  {\n"
     "    name /ndn/memphis.edu/cs/mira\n"
-    "    face-id  17\n"
+    "    face-uri  udp4://localhost\n"
     "    link-cost 30\n"
     "  }\n"
     "}\n\n"
@@ -99,6 +102,9 @@
 
   BOOST_CHECK_EQUAL(nlsr1.getNamePrefixList().getSize(), 2);
 
+  BOOST_CHECK_EQUAL(nlsr1.getConfParameter().getLsaInterestLifetime(),
+                    ndn::time::seconds(3));
+
   remove("unit-test-nlsr.conf");
 }
 
diff --git a/tests/test-conf-parameter.cpp b/tests/test-conf-parameter.cpp
index 31cbf71..18eebdc 100644
--- a/tests/test-conf-parameter.cpp
+++ b/tests/test-conf-parameter.cpp
@@ -51,6 +51,8 @@
 
   cp1.setLsaRefreshTime(1500);
 
+  cp1.setLsaInterestLifetime(ndn::time::seconds(1));
+
   cp1.setRouterDeadInterval(10);
 
   cp1.setMaxFacesPerPrefix(50);
@@ -79,6 +81,8 @@
 
   BOOST_CHECK_EQUAL(cp1.getLsaRefreshTime(), 1500);
 
+  BOOST_CHECK_EQUAL(cp1.getLsaInterestLifetime(), ndn::time::seconds(1));
+
   BOOST_CHECK_EQUAL(cp1.getRouterDeadInterval(), 10);
 
   BOOST_CHECK_EQUAL(cp1.getMaxFacesPerPrefix(), 50);
diff --git a/tests/test-lsdb.cpp b/tests/test-lsdb.cpp
index 1691468..b6305b9 100644
--- a/tests/test-lsdb.cpp
+++ b/tests/test-lsdb.cpp
@@ -35,6 +35,8 @@
 
 BOOST_AUTO_TEST_CASE(LsdbRemoveAndExists)
 {
+  INIT_LOGGERS("/tmp");
+
   Nlsr nlsr1;
   ndn::time::system_clock::TimePoint testTimePoint =  ndn::time::system_clock::now();
   NamePrefixList npl1;
@@ -49,17 +51,18 @@
 //For NameLsa lsType is name.
 //12 is seqNo, randomly generated.
 //1800 is the default life time.
-  NameLsa nlsa1("router1", std::string("name"), 12, testTimePoint, npl1);
+  NameLsa nlsa1(ndn::Name("/router1/1"), std::string("name"), 12, testTimePoint, npl1);
 
   Lsdb lsdb1(nlsr1);
 
   lsdb1.installNameLsa(nlsa1);
+  lsdb1.writeNameLsdbLog();
 
-  BOOST_CHECK(lsdb1.doesLsaExist("router1/1", std::string("name")));
+  BOOST_CHECK(lsdb1.doesLsaExist(ndn::Name("/router1/1/name"), std::string("name")));
 
   lsdb1.removeNameLsa(router1);
 
-  BOOST_CHECK_EQUAL(lsdb1.doesLsaExist("router1/1", std::string("name")), false);
+  BOOST_CHECK_EQUAL(lsdb1.doesLsaExist(ndn::Name("/router1/1"), std::string("name")), false);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/test-nexthop.cpp b/tests/test-nexthop.cpp
index c0707cc..7c30069 100644
--- a/tests/test-nexthop.cpp
+++ b/tests/test-nexthop.cpp
@@ -35,10 +35,10 @@
 
   np1.setConnectingFaceUri("udp://test/uri");
 
-  np1.setRouteCost(10.5);
+  np1.setRouteCost(10.1);
 
   BOOST_CHECK_EQUAL(np1.getConnectingFaceUri(), "udp://test/uri");
-  BOOST_CHECK_CLOSE(np1.getRouteCost(), 10.5, 0.0001);
+  BOOST_CHECK_EQUAL(np1.getRouteCost(), 11);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
