src: Replace Tokenizer with the methods of ndn::Name

Purpose of this commit is to replace Tokenizer in all
places except conf-file-processor.*pp with the methods
of ndn::Name. One static method in class NameHelper
is added. Tokenizer will be removed finally when
configuration file parsing commit is complete.

Refs: 1533

Change-Id: I14a67655eb963c5cc5b045c3c9f7d516e405ff19
diff --git a/src/adjacency-list.cpp b/src/adjacency-list.cpp
index a529b17..117ba76 100644
--- a/src/adjacency-list.cpp
+++ b/src/adjacency-list.cpp
@@ -1,6 +1,6 @@
 #include <iostream>
 #include <algorithm>
-
+#include <ndn-cxx/common.hpp>
 #include "adjacency-list.hpp"
 #include "adjacent.hpp"
 #include "nlsr.hpp"
@@ -41,7 +41,7 @@
 }
 
 int32_t
-AdjacencyList::updateAdjacentStatus(const string& adjName, int32_t s)
+AdjacencyList::updateAdjacentStatus(const ndn::Name& adjName, int32_t s)
 {
   std::list<Adjacent>::iterator it = find(adjName);
   if (it == m_adjList.end())
@@ -53,7 +53,7 @@
 }
 
 Adjacent
-AdjacencyList::getAdjacent(const string& adjName)
+AdjacencyList::getAdjacent(const ndn::Name& adjName)
 {
   Adjacent adj(adjName);
   std::list<Adjacent>::iterator it = find(adjName);
@@ -96,7 +96,7 @@
 }
 
 int32_t
-AdjacencyList::updateAdjacentLinkCost(const string& adjName, double lc)
+AdjacencyList::updateAdjacentLinkCost(const ndn::Name& adjName, double lc)
 {
   std::list<Adjacent>::iterator it = find(adjName);
   if (it == m_adjList.end())
@@ -108,7 +108,7 @@
 }
 
 bool
-AdjacencyList::isNeighbor(const string& adjName)
+AdjacencyList::isNeighbor(const ndn::Name& adjName)
 {
   std::list<Adjacent>::iterator it = find(adjName);
   if (it == m_adjList.end())
@@ -119,7 +119,7 @@
 }
 
 void
-AdjacencyList::incrementTimedOutInterestCount(const string& neighbor)
+AdjacencyList::incrementTimedOutInterestCount(const ndn::Name& neighbor)
 {
   std::list<Adjacent>::iterator it = find(neighbor);
   if (it == m_adjList.end())
@@ -130,7 +130,8 @@
 }
 
 void
-AdjacencyList::setTimedOutInterestCount(const string& neighbor, uint32_t count)
+AdjacencyList::setTimedOutInterestCount(const ndn::Name& neighbor,
+                                        uint32_t count)
 {
   std::list<Adjacent>::iterator it = find(neighbor);
   if (it != m_adjList.end())
@@ -140,7 +141,7 @@
 }
 
 int32_t
-AdjacencyList::getTimedOutInterestCount(const string& neighbor)
+AdjacencyList::getTimedOutInterestCount(const ndn::Name& neighbor)
 {
   std::list<Adjacent>::iterator it = find(neighbor);
   if (it == m_adjList.end())
@@ -151,7 +152,7 @@
 }
 
 uint32_t
-AdjacencyList::getStatusOfNeighbor(const string& neighbor)
+AdjacencyList::getStatusOfNeighbor(const ndn::Name& neighbor)
 {
   std::list<Adjacent>::iterator it = find(neighbor);
   if (it == m_adjList.end())
@@ -162,7 +163,7 @@
 }
 
 void
-AdjacencyList::setStatusOfNeighbor(const string& neighbor, int32_t status)
+AdjacencyList::setStatusOfNeighbor(const ndn::Name& neighbor, int32_t status)
 {
   std::list<Adjacent>::iterator it = find(neighbor);
   if (it != m_adjList.end())
@@ -220,12 +221,12 @@
 }
 
 std::list<Adjacent>::iterator
-AdjacencyList::find(std::string adjName)
+AdjacencyList::find(const ndn::Name& adjName)
 {
-  Adjacent adj(adjName);
   std::list<Adjacent>::iterator it = std::find_if(m_adjList.begin(),
                                                   m_adjList.end(),
-                                                  bind(&Adjacent::compareName, &adj, _1));
+                                                  ndn::bind(&Adjacent::compare,
+                                                            _1, ndn::cref(adjName)));
   return it;
 }
 
diff --git a/src/adjacency-list.hpp b/src/adjacency-list.hpp
index a88a6ba..c3c2195 100644
--- a/src/adjacency-list.hpp
+++ b/src/adjacency-list.hpp
@@ -21,31 +21,31 @@
   insert(Adjacent& adjacent);
 
   int32_t
-  updateAdjacentStatus(const std::string& adjName, int32_t s);
+  updateAdjacentStatus(const ndn::Name& adjName, int32_t s);
 
   int32_t
-  updateAdjacentLinkCost(const std::string& adjName, double lc);
+  updateAdjacentLinkCost(const ndn::Name& adjName, double lc);
 
   std::list<Adjacent>&
   getAdjList();
 
   bool
-  isNeighbor(const std::string& adjName);
+  isNeighbor(const ndn::Name& adjName);
 
   void
-  incrementTimedOutInterestCount(const std::string& neighbor);
+  incrementTimedOutInterestCount(const ndn::Name& neighbor);
 
   int32_t
-  getTimedOutInterestCount(const std::string& neighbor);
+  getTimedOutInterestCount(const ndn::Name& neighbor);
 
   uint32_t
-  getStatusOfNeighbor(const std::string& neighbor);
+  getStatusOfNeighbor(const ndn::Name& neighbor);
 
   void
-  setStatusOfNeighbor(const std::string& neighbor, int32_t status);
+  setStatusOfNeighbor(const ndn::Name& neighbor, int32_t status);
 
   void
-  setTimedOutInterestCount(const std::string& neighbor, uint32_t count);
+  setTimedOutInterestCount(const ndn::Name& neighbor, uint32_t count);
 
   void
   addAdjacents(AdjacencyList& adl);
@@ -57,7 +57,7 @@
   getNumOfActiveNeighbor();
 
   Adjacent
-  getAdjacent(const std::string& adjName);
+  getAdjacent(const ndn::Name& adjName);
 
   bool
   operator==(AdjacencyList& adl);
@@ -82,7 +82,7 @@
 
 private:
   std::list<Adjacent>::iterator
-  find(std::string adjName);
+  find(const ndn::Name& adjName);
 
 private:
   std::list<Adjacent> m_adjList;
diff --git a/src/adjacent.cpp b/src/adjacent.cpp
index f5a2c8e..94dceee 100644
--- a/src/adjacent.cpp
+++ b/src/adjacent.cpp
@@ -10,7 +10,8 @@
 
 using namespace std;
 
-Adjacent::Adjacent(const string& an, uint32_t cf, double lc, uint32_t s, uint32_t iton)
+Adjacent::Adjacent(const ndn::Name& an, uint32_t cf, double lc, uint32_t s,
+                   uint32_t iton)
 {
   m_name = an;
   m_connectingFace = cf;
@@ -29,9 +30,9 @@
 }
 
 bool
-Adjacent::compareName(const Adjacent& adjacent)
+Adjacent::compare(const ndn::Name& adjacencyName)
 {
-  return m_name == adjacent.getName();
+  return m_name == adjacencyName;
 }
 
 std::ostream&
diff --git a/src/adjacent.hpp b/src/adjacent.hpp
index b8b6695..bb043f8 100644
--- a/src/adjacent.hpp
+++ b/src/adjacent.hpp
@@ -1,5 +1,6 @@
 #include <string>
 #include <boost/cstdint.hpp>
+#include <ndn-cxx/face.hpp>
 
 #ifndef NLSR_ADJACENT_HPP
 #define NLSR_ADJACENT_HPP
@@ -10,7 +11,7 @@
 
 public:
   Adjacent()
-    : m_name("")
+    : m_name()
     , m_connectingFace(0)
     , m_linkCost(10.0)
     , m_status(0)
@@ -18,7 +19,7 @@
   {
   }
 
-  Adjacent(const std::string& an)
+  Adjacent(const ndn::Name& an)
     : m_connectingFace(0)
     , m_linkCost(0.0)
     , m_status(0)
@@ -27,16 +28,17 @@
     m_name = an;
   }
 
-  Adjacent(const std::string& an, uint32_t cf, double lc, uint32_t s, uint32_t iton);
+  Adjacent(const ndn::Name& an, uint32_t cf, double lc, uint32_t s,
+           uint32_t iton);
 
-  std::string
+  const ndn::Name&
   getName() const
   {
     return m_name;
   }
 
   void
-  setName(const std::string& an)
+  setName(const ndn::Name& an)
   {
     m_name = an;
   }
@@ -93,10 +95,10 @@
   operator==(const Adjacent& adjacent) const;
 
   bool
-  compareName(const Adjacent& adjacent);
-  
+  compare(const ndn::Name& adjacencyName);
+
 private:
-  std::string m_name;
+  ndn::Name m_name;
   uint32_t m_connectingFace;
   double m_linkCost;
   uint32_t m_status;
diff --git a/src/communication/data-manager.cpp b/src/communication/data-manager.cpp
deleted file mode 100644
index 3a153a3..0000000
--- a/src/communication/data-manager.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-#include <iostream>
-#include <cstdlib>
-
-#include <ndn-cxx/security/signature-sha256-with-rsa.hpp>
-#include <ndn-cxx/security/identity-certificate.hpp>
-#include <ndn-cxx/util/io.hpp>
-
-#include "nlsr.hpp"
-#include "data-manager.hpp"
-#include "utility/tokenizer.hpp"
-#include "lsdb.hpp"
-// #include "security/key-manager.hpp"
-
-namespace nlsr {
-
-using namespace std;
-using namespace ndn;
-
-void
-DataManager::processContent(const ndn::Interest& interest,
-                            const ndn::Data& data, InterestManager& im)
-{
-  std::cout << "I: " << interest.toUri() << std::endl;
-  string dataName(data.getName().toUri());
-  Tokenizer nt(dataName, "/");
-  std::string chkString("keys");
-  if (nt.doesTokenExist(chkString))
-  {
-    processContentKeys(data);
-  }
-  else
-  {
-    // if (m_nlsr.getKeyManager().verify(data))
-    {
-      std::cout << "Verified Data Content" << std::endl;
-      chkString = "info";
-      if (nt.doesTokenExist(chkString))
-      {
-        string dataContent((char*)data.getContent().value());
-        processContentInfo(dataName, dataContent);
-      }
-      chkString = "LSA";
-      if (nt.doesTokenExist(chkString))
-      {
-        string dataContent((char*)data.getContent().value());
-        processContentLsa(dataName, dataContent);
-      }
-    }
-    // else
-    // {
-    //   std::cout << "Unverified Data Content. Discarded" << std::endl;
-    // }
-  }
-}
-
-void
-DataManager::processContentInfo(const string& dataName,
-                                string& dataContent)
-{
-  Tokenizer nt(dataName, "/");
-  string chkString("info");
-  string neighbor = nt.getTokenString(0, nt.getTokenPosition(chkString) - 1);
-  int oldStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
-  int infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor);
-  //debugging purpose start
-  std::cout << "Before Updates: " << std::endl;
-  std::cout << "Neighbor : " << neighbor << std::endl;
-  std::cout << "Status: " << oldStatus << std::endl;
-  std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
-  //debugging purpose end
-  m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, 1);
-  m_nlsr.getAdjacencyList().setTimedOutInterestCount(neighbor, 0);
-  int newStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
-  infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor);
-  //debugging purpose
-  std::cout << "After Updates: " << std::endl;
-  std::cout << "Neighbor : " << neighbor << std::endl;
-  std::cout << "Status: " << newStatus << std::endl;
-  std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
-  //debugging purpose end
-  if ((oldStatus - newStatus) != 0)  // change in Adjacency list
-  {
-    m_nlsr.incrementAdjBuildCount();
-    /* Need to schedule event for Adjacency LSA building */
-    if (m_nlsr.getIsBuildAdjLsaSheduled() == 0)
-    {
-      m_nlsr.setIsBuildAdjLsaSheduled(1);
-      // event here
-      m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
-                                          ndn::bind(&Lsdb::scheduledAdjLsaBuild, m_nlsr.getLsdb(),
-                                                    boost::ref(m_nlsr)));
-    }
-  }
-}
-
-void
-DataManager::processContentLsa(const string& dataName, string& dataContent)
-{
-  Tokenizer nt(dataName, "/");
-  string chkString("LSA");
-  string origRouter = nt.getTokenString(nt.getTokenPosition(chkString) + 1,
-                                        nt.getTokenNumber() - 4);
-  string lsTypeString = nt.getToken(nt.getTokenNumber() - 3);
-  string lsSeNoString = nt.getToken(nt.getTokenNumber() - 2);
-  uint32_t interestedLsSeqNo;
-  try
-  {
-    interestedLsSeqNo = boost::lexical_cast<uint32_t>(lsSeNoString);
-  }
-  catch (std::exception& e)
-  {
-    return;
-  }
-  if (lsTypeString == "1")  //Name Lsa
-  {
-    processContentNameLsa(origRouter + "/" + lsTypeString,
-                          interestedLsSeqNo, dataContent);
-  }
-  else if (lsTypeString == "2")  //Adj Lsa
-  {
-    processContentAdjLsa(origRouter + "/" + lsTypeString,
-                         interestedLsSeqNo, dataContent);
-  }
-  else if (lsTypeString == "3")  //Cor Lsa
-  {
-    processContentCorLsa(origRouter + "/" + lsTypeString,
-                         interestedLsSeqNo, dataContent);
-  }
-  else
-  {
-    cout << "Unrecognized LSA Type :(" << endl;
-  }
-}
-
-void
-DataManager::processContentNameLsa(const string& lsaKey,
-                                   uint32_t lsSeqNo, string& dataContent)
-{
-  if (m_nlsr.getLsdb().isNameLsaNew(lsaKey, lsSeqNo))
-  {
-    NameLsa nameLsa;
-    if (nameLsa.initializeFromContent(dataContent))
-    {
-      m_nlsr.getLsdb().installNameLsa(m_nlsr, nameLsa);
-    }
-    else
-    {
-      std::cout << "LSA data decoding error :(" << std::endl;
-    }
-  }
-}
-
-void
-DataManager::processContentAdjLsa(const string& lsaKey,
-                                  uint32_t lsSeqNo, string& dataContent)
-{
-  if (m_nlsr.getLsdb().isAdjLsaNew(lsaKey, lsSeqNo))
-  {
-    AdjLsa adjLsa;
-    if (adjLsa.initializeFromContent(dataContent))
-    {
-      m_nlsr.getLsdb().installAdjLsa(m_nlsr, adjLsa);
-    }
-    else
-    {
-      std::cout << "LSA data decoding error :(" << std::endl;
-    }
-  }
-}
-
-void
-DataManager::processContentCorLsa(const string& lsaKey,
-                                  uint32_t lsSeqNo, string& dataContent)
-{
-  if (m_nlsr.getLsdb().isCoordinateLsaNew(lsaKey, lsSeqNo))
-  {
-    CoordinateLsa corLsa;
-    if (corLsa.initializeFromContent(dataContent))
-    {
-      m_nlsr.getLsdb().installCoordinateLsa(m_nlsr, corLsa);
-    }
-    else
-    {
-      std::cout << "LSA data decoding error :(" << std::endl;
-    }
-  }
-}
-
-void
-DataManager::processContentKeys(const ndn::Data& data)
-{
-  std::cout << " processContentKeys called " << std::endl;
-  ndn::shared_ptr<ndn::IdentityCertificate> cert =
-    ndn::make_shared<ndn::IdentityCertificate>();
-  cert->wireDecode(data.getContent().blockFromValue());
-  std::cout << *(cert) << std::endl;
-  std::string dataName = data.getName().toUri();
-  Tokenizer nt(dataName, "/");
-  std::string certName = nt.getTokenString(0, nt.getTokenNumber() - 3);
-  uint32_t seqNum = boost::lexical_cast<uint32_t>(nt.getToken(
-                                                    nt.getTokenNumber() - 2));
-  std::cout << "Cert Name: " << certName << " Seq Num: " << seqNum << std::endl;
-  // if (m_nlsr.getKeyManager().verify(m_nlsr, *(cert)))
-  // {
-  //   m_nlsr.getKeyManager().addCertificate(cert, seqNum, true);
-  // }
-  // else
-  // {
-  //   m_nlsr.getKeyManager().addCertificate(cert, seqNum, false);
-  // }
-  // m_nlsr.getKeyManager().printCertStore();
-}
-}//namespace nlsr
diff --git a/src/communication/data-manager.hpp b/src/communication/data-manager.hpp
deleted file mode 100644
index ce10b88..0000000
--- a/src/communication/data-manager.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef NLSR_DATA_MANAGER_HPP
-#define NLSR_DATA_MANAGER_HPP
-
-#include <boost/cstdint.hpp>
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/util/scheduler.hpp>
-
-#include "interest-manager.hpp"
-
-namespace nlsr {
-class Nlsr;
-
-class DataManager
-{
-public:
-  DataManager(Nlsr& nlsr)
-    : m_nlsr(nlsr)
-  {}
-  void
-  processContent(const ndn::Interest& interest,
-                 const ndn::Data& data, InterestManager& im);
-private:
-  void
-  processContentInfo(const std::string& dataName,
-                     std::string& dataContent);
-
-  void
-  processContentLsa(const std::string& dataName, std::string& dataContent);
-
-  void
-  processContentNameLsa(const std::string& lsaKey,
-                        uint32_t lsSeqNo, std::string& dataContent);
-
-  void
-  processContentAdjLsa(const std::string& lsaKey,
-                       uint32_t lsSeqNo, std::string& dataContent);
-
-  void
-  processContentCorLsa(const std::string& lsaKey,
-                       uint32_t lsSeqNo, std::string& dataContent);
-
-  void
-  processContentKeys(const ndn::Data& data);
-
-private:
-  Nlsr& m_nlsr;
-
-
-};
-
-}//namespace nlsr
-
-#endif //NLSR_DATA_MANAGER_HPP
diff --git a/src/communication/interest-manager.cpp b/src/communication/interest-manager.cpp
deleted file mode 100644
index 23ce579..0000000
--- a/src/communication/interest-manager.cpp
+++ /dev/null
@@ -1,334 +0,0 @@
-#include <iostream>
-#include <cstdlib>
-
-#include <ndn-cxx/security/identity-certificate.hpp>
-#include <ndn-cxx/util/io.hpp>
-
-#include "nlsr.hpp"
-#include "interest-manager.hpp"
-#include "data-manager.hpp"
-#include "utility/tokenizer.hpp"
-#include "lsdb.hpp"
-
-namespace nlsr {
-
-using namespace std;
-using namespace ndn;
-
-void
-InterestManager::processInterest(const ndn::Name& name,
-                                 const ndn::Interest& interest)
-{
-  cout << "<< I: " << interest << endl;
-  string intName = interest.getName().toUri();
-  cout << "Interest Received for Name: " << intName << endl;
-  Tokenizer nt(intName, "/");
-  string chkString("info");
-  if (nt.doesTokenExist(chkString))
-  {
-    string nbr = nt.getTokenString(nt.getTokenPosition(chkString) + 1);
-    cout << "Neighbor: " << nbr << endl;
-    processInterestInfo(nbr, interest);
-  }
-  chkString = "LSA";
-  if (nt.doesTokenExist(chkString))
-  {
-    processInterestLsa(interest);
-  }
-  chkString = "keys";
-  if (nt.doesTokenExist(chkString))
-  {
-    processInterestKeys(interest);
-  }
-}
-
-void
-InterestManager::processInterestInfo(const string& neighbor,
-                                     const ndn::Interest& interest)
-{
-  if (m_nlsr.getAdjacencyList().isNeighbor(neighbor))
-  {
-    Data data(ndn::Name(interest.getName()).appendVersion());
-    data.setFreshnessPeriod(time::seconds(10)); // 10 sec
-    data.setContent((const uint8_t*)"info", sizeof("info"));
-    // m_nlsr.getKeyManager().signData(data);
-    m_keyChain.sign(data);
-    cout << ">> D: " << data << endl;
-    m_nlsr.getNlsrFace().put(data);
-    int status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
-    if (status == 0)
-    {
-      string intName = neighbor + "/" + "info" +
-                       m_nlsr.getConfParameter().getRouterPrefix();
-      expressInterest(intName, 2,
-                      m_nlsr.getConfParameter().getInterestResendTime());
-    }
-  }
-}
-
-void
-InterestManager::processInterestLsa(const ndn::Interest& interest)
-{
-  string intName = interest.getName().toUri();
-  Tokenizer nt(intName, "/");
-  string chkString("LSA");
-  string origRouter = nt.getTokenString(nt.getTokenPosition(chkString) + 1,
-                                        nt.getTokenNumber() - 3);
-  string lsTypeString = nt.getToken(nt.getTokenNumber() - 2);
-  string lsSeqString = nt.getToken(nt.getTokenNumber() - 1);
-  std::cout << "Router Name: " << origRouter << std::endl;
-  std::cout << "Ls Type    : " << lsTypeString << std::endl;
-  std::cout << "Ls Seq     : " << lsSeqString << endl;
-  uint8_t interestedLsType;
-  uint32_t interestedLsSeqNo;
-  try
-  {
-    interestedLsType = boost::lexical_cast<uint8_t>(lsTypeString);
-    interestedLsSeqNo = boost::lexical_cast<uint32_t>(lsSeqString);
-  }
-  catch (std::exception& e)
-  {
-    return;
-  }
-  std::cout << "Ls Type: " << interestedLsType << std::endl;
-  if (lsTypeString == "1") //Name Lsa
-  {
-    processInterestForNameLsa(interest,
-                              origRouter + "/" + lsTypeString, interestedLsSeqNo);
-  }
-  else if (lsTypeString == "2") //Adj Lsa
-  {
-    processInterestForAdjLsa(interest,
-                             origRouter + "/" + lsTypeString, interestedLsSeqNo);
-  }
-  else if (lsTypeString == "3") //Cor Lsa
-  {
-    processInterestForCorLsa(interest,
-                             origRouter + "/" + lsTypeString, interestedLsSeqNo);
-  }
-  else
-  {
-    cout << "Unrecognized LSA Type :(" << endl;
-  }
-}
-
-void
-InterestManager::processInterestForNameLsa(const ndn::Interest& interest,
-                                           const string& lsaKey, uint32_t interestedlsSeqNo)
-{
-  NameLsa*  nameLsa = m_nlsr.getLsdb().findNameLsa(lsaKey);
-  if (nameLsa != 0)
-  {
-    if (nameLsa->getLsSeqNo() >= interestedlsSeqNo)
-    {
-      Data data(ndn::Name(interest.getName()).appendVersion());
-      data.setFreshnessPeriod(time::seconds(10)); // 10 sec
-      string content = nameLsa->getData();
-      data.setContent((const uint8_t*)content.c_str(), content.size());
-      // m_nlsr.getKeyManager().signData(data);
-      m_keyChain.sign(data);
-      std::cout << ">> D: " << data << std::endl;
-      m_nlsr.getNlsrFace().put(data);
-    }
-  }
-}
-
-void
-InterestManager::processInterestForAdjLsa(const ndn::Interest& interest,
-                                          const string& lsaKey, uint32_t interestedlsSeqNo)
-{
-  AdjLsa* adjLsa = m_nlsr.getLsdb().findAdjLsa(lsaKey);
-  if (adjLsa != 0)
-  {
-    if (adjLsa->getLsSeqNo() >= interestedlsSeqNo)
-    {
-      Data data(ndn::Name(interest.getName()).appendVersion());
-      data.setFreshnessPeriod(time::seconds(10)); // 10 sec
-      string content = adjLsa->getData();
-      data.setContent((const uint8_t*)content.c_str(), content.size());
-      // m_nlsr.getKeyManager().signData(data);
-      m_keyChain.sign(data);
-      std::cout << ">> D: " << data << std::endl;
-      m_nlsr.getNlsrFace().put(data);
-    }
-  }
-}
-
-void
-InterestManager::processInterestForCorLsa(const ndn::Interest& interest,
-                                          const string& lsaKey, uint32_t interestedlsSeqNo)
-{
-  CoordinateLsa* corLsa = m_nlsr.getLsdb().findCoordinateLsa(lsaKey);
-  if (corLsa != 0)
-  {
-    if (corLsa->getLsSeqNo() >= interestedlsSeqNo)
-    {
-      Data data(ndn::Name(interest.getName()).appendVersion());
-      data.setFreshnessPeriod(time::seconds(10)); // 10 sec
-      string content = corLsa->getData();
-      data.setContent((const uint8_t*)content.c_str(), content.size());
-      // m_nlsr.getKeyManager().signData(data);
-      m_keyChain.sign(data);
-      std::cout << ">> D: " << data << std::endl;
-      m_nlsr.getNlsrFace().put(data);
-    }
-  }
-}
-
-void
-InterestManager::processInterestKeys(const ndn::Interest& interest)
-{
-  std::cout << "processInterestKeys called " << std::endl;
-  // string intName = interest.getName().toUri();
-  // std::cout << "Interest Name for Key: " << intName << std::endl;
-  // Tokenizer nt(intName, "/");
-  // std::string chkString("ID-CERT");
-  // std::string certName;
-  // uint32_t seqNum;
-  // ndn::Name dataName;
-  // std::pair<ndn::shared_ptr<ndn::IdentityCertificate>, bool> chkCert;
-  // if (nt.getTokenPosition(chkString) == nt.getTokenNumber() - 1)
-  // {
-  //   certName = nt.getTokenString(0, nt.getTokenNumber() - 1);
-  //   cout << "Cert Name: " << certName << std::endl;
-  //   chkCert = m_nlsr.getKeyManager().getCertificateFromStore(certName);
-  // }
-  // else
-  // {
-  //   certName = nt.getTokenString(0, nt.getTokenNumber() - 2);
-  //   seqNum = boost::lexical_cast<uint32_t>(nt.getToken(nt.getTokenNumber() - 1));
-  //   std::cout << "Cert Name: " << certName << " Seq Num: " << seqNum << std::endl;
-  //   chkCert = m_nlsr.getKeyManager().getCertificateFromStore(certName, seqNum);
-  // }
-  // if (chkCert.second)
-  // {
-  //   if (nt.getTokenPosition(chkString) == nt.getTokenNumber() - 1)
-  //   {
-  //     std::string dn;
-  //     dataName = ndn::Name(interest.getName()).appendVersion();
-  //     std::pair<uint32_t, bool> seqChk =
-  //       m_nlsr.getKeyManager().getCertificateSeqNum(certName);
-  //     if (seqChk.second)
-  //     {
-  //       dn = dataName.toUri() + "/" + boost::lexical_cast<std::string>(seqChk.first);
-  //       dataName = ndn::Name(dn);
-  //     }
-  //     else
-  //     {
-  //       dn = dataName.toUri() + "/" + boost::lexical_cast<std::string>(10);
-  //       dataName = ndn::Name(dn);
-  //     }
-  //   }
-  //   else
-  //   {
-  //     dataName = ndn::Name(interest.getName());
-  //   }
-  //   Data data(dataName.appendVersion());
-  //   data.setFreshnessPeriod(time::seconds(10)); //10 sec
-  //   data.setContent(chkCert.first->wireEncode());
-  //   m_nlsr.getKeyManager().signData(data);
-  //   m_nlsr.getNlsrFace()->put(data);
-  // }
-}
-
-
-void
-InterestManager::processInterestTimedOut(const ndn::Interest& interest)
-{
-  std::cout << "Timed out interest : " << interest.getName().toUri() << std::endl;
-  string intName = interest.getName().toUri();
-  Tokenizer nt(intName, "/");
-  string chkString("info");
-  if (nt.doesTokenExist(chkString))
-  {
-    string nbr = nt.getTokenString(0, nt.getTokenPosition(chkString) - 1);
-    processInterestTimedOutInfo(nbr , interest);
-  }
-  chkString = "LSA";
-  if (nt.doesTokenExist(chkString))
-  {
-    processInterestTimedOutLsa(interest);
-  }
-}
-
-void
-InterestManager::processInterestTimedOutInfo(const string& neighbor,
-                                             const ndn::Interest& interest)
-{
-  m_nlsr.getAdjacencyList().incrementTimedOutInterestCount(neighbor);
-  int status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
-  uint32_t infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor);
-  std::cout << "Neighbor: " << neighbor << std::endl;
-  std::cout << "Status: " << status << std::endl;
-  std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
-  if ((infoIntTimedOutCount < m_nlsr.getConfParameter().getInterestRetryNumber()))
-  {
-    string intName = neighbor + "/" + "info" +
-                     m_nlsr.getConfParameter().getRouterPrefix();
-    expressInterest(intName, 2,
-                    m_nlsr.getConfParameter().getInterestResendTime());
-  }
-  else if ((status == 1) &&
-           (infoIntTimedOutCount == m_nlsr.getConfParameter().getInterestRetryNumber()))
-  {
-    m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, 0);
-    m_nlsr.incrementAdjBuildCount();
-    if (m_nlsr.getIsBuildAdjLsaSheduled() == 0)
-    {
-      m_nlsr.setIsBuildAdjLsaSheduled(1);
-      // event here
-      m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
-                                          ndn::bind(&Lsdb::scheduledAdjLsaBuild,
-                                                    &m_nlsr.getLsdb(),
-                                                    boost::ref(m_nlsr)));
-    }
-  }
-}
-
-void
-InterestManager::processInterestTimedOutLsa(const ndn::Interest& interest)
-{
-}
-
-void
-InterestManager::expressInterest(const string& interestNamePrefix,
-                                 int32_t scope, int32_t seconds)
-{
-  std::cout << "Expressing Interest :" << interestNamePrefix << std::endl;
-  ndn::Interest i((ndn::Name(interestNamePrefix)));
-  i.setInterestLifetime(time::seconds(seconds));
-  i.setMustBeFresh(true);
-  m_nlsr.getNlsrFace().expressInterest(i,
-                                       ndn::bind(&DataManager::processContent,
-                                                 &m_nlsr.getDataManager(),
-                                                 _1, _2, boost::ref(*this)),
-                                       ndn::bind(&InterestManager::processInterestTimedOut,
-                                                 this, _1));
-}
-
-
-void
-InterestManager::sendScheduledInfoInterest(int32_t seconds)
-{
-  std::list<Adjacent> adjList = m_nlsr.getAdjacencyList().getAdjList();
-  for (std::list<Adjacent>::iterator it = adjList.begin(); it != adjList.end();
-       ++it)
-  {
-    string adjName = (*it).getName() + "/" + "info" +
-                     m_nlsr.getConfParameter().getRouterPrefix();
-    expressInterest(adjName, 2,
-                    m_nlsr.getConfParameter().getInterestResendTime());
-  }
-  scheduleInfoInterest(m_nlsr.getConfParameter().getInfoInterestInterval());
-}
-
-void
-InterestManager::scheduleInfoInterest(int32_t seconds)
-{
-  EventId eid = m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(seconds),
-                                                    ndn::bind(&InterestManager::sendScheduledInfoInterest, this,
-                                                              seconds));
-}
-
-
-} //namespace nlsr
diff --git a/src/communication/interest-manager.hpp b/src/communication/interest-manager.hpp
deleted file mode 100644
index 00c798b..0000000
--- a/src/communication/interest-manager.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef NLSR_INTEREST_MANAGER_HPP
-#define NLSR_INTEREST_MANAGER_HPP
-
-#include <boost/cstdint.hpp>
-
-#include <ndn-cxx/face.hpp>
-#include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/util/scheduler.hpp>
-
-namespace nlsr {
-
-class Nlsr;
-
-class InterestManager
-{
-public:
-  InterestManager(Nlsr& nlsr)
-    : m_nlsr(nlsr)
-  {
-  }
-  void
-  processInterest(const ndn::Name& name, const ndn::Interest& interest);
-
-  void
-  processInterestInfo(const std::string& neighbor, const ndn::Interest& interest);
-
-  void
-  processInterestLsa(const ndn::Interest& interest);
-
-  void
-  processInterestForNameLsa(const ndn::Interest& interest,
-                            const std::string& lsaKey, uint32_t interestedlsSeqNo);
-
-  void
-  processInterestForAdjLsa(const ndn::Interest& interest,
-                           const std::string& lsaKey, uint32_t interestedlsSeqNo);
-
-  void
-  processInterestForCorLsa(const ndn::Interest& interest,
-                           const std::string& lsaKey, uint32_t interestedlsSeqNo);
-
-  void
-  processInterestKeys(const ndn::Interest& interest);
-
-  void
-  processInterestTimedOut(const ndn::Interest& interest);
-
-  void
-  processInterestTimedOutInfo(const std::string& neighbor,
-                              const ndn::Interest& interest);
-
-  void
-  processInterestTimedOutLsa(const ndn::Interest& interest);
-
-  void
-  expressInterest(const std::string& interestNamePrefix, int32_t scope, int32_t seconds);
-
-  void
-  sendScheduledInfoInterest(int32_t seconds);
-
-  void
-  scheduleInfoInterest(int32_t seconds);
-
-private:
-  Nlsr& m_nlsr;
-
-  ndn::KeyChain m_keyChain;
-};
-
-}//namespace nlsr
-
-#endif //NLSR_INTEREST_MANAGER_HPP
diff --git a/src/communication/sync-logic-handler.cpp b/src/communication/sync-logic-handler.cpp
index c8b5ec9..10a40ec 100644
--- a/src/communication/sync-logic-handler.cpp
+++ b/src/communication/sync-logic-handler.cpp
@@ -1,7 +1,7 @@
 #include "nlsr.hpp"
 #include "sync-logic-handler.hpp"
-// #include "security/key-manager.hpp"
-#include "utility/tokenizer.hpp"
+#include "utility/name-helper.hpp"
+#include "lsa.hpp"
 
 
 namespace nlsr {
@@ -13,7 +13,7 @@
 SyncLogicHandler::createSyncSocket(Nlsr& pnlsr)
 {
   std::cout << "Creating Sync socket ......" << std::endl;
-  std::cout << "Sync prefix: " << m_syncPrefix.toUri() << std::endl;
+  std::cout << "Sync prefix: " << m_syncPrefix << std::endl;
   m_syncSocket = make_shared<Sync::SyncSocket>(m_syncPrefix, m_validator,
                                                m_syncFace,
                                                bind(&SyncLogicHandler::nsyncUpdateCallBack, this,
@@ -43,116 +43,97 @@
 }
 
 void
-SyncLogicHandler::removeRouterFromSyncing(const string& routerPrefix)
+SyncLogicHandler::removeRouterFromSyncing(const ndn::Name& routerPrefix)
 {
 }
 
 void
-SyncLogicHandler::processUpdateFromSync(const std::string& updateName,
+SyncLogicHandler::processUpdateFromSync(const ndn::Name& updateName,
                                         uint64_t seqNo,  Nlsr& pnlsr)
 {
-  Tokenizer nt(updateName, "/");
+  //const ndn::Name name(updateName);
   string chkString("LSA");
-  if (nt.doesTokenExist(chkString))
+  int32_t lasPosition = util::getNameComponentPosition(updateName, chkString);
+  if (lasPosition >= 0)
   {
-    //process LSA Update here
-    string routerName = nt.getTokenString(nt.getTokenPosition(chkString) + 1);
+    ndn::Name routerName = updateName.getSubName(lasPosition + 1);
     processRoutingUpdateFromSync(routerName, seqNo, pnlsr);
-  }
-  chkString = "keys";
-  if (nt.doesTokenExist(chkString))
-  {
-    //process keys update here
-    std::string certName = nt.getTokenString(0);
-    // processKeysUpdateFromSync(certName, seqNo, pnlsr);
+    return;
   }
 }
 
 void
-SyncLogicHandler::processRoutingUpdateFromSync(const std::string& routerName,
+SyncLogicHandler::processRoutingUpdateFromSync(const ndn::Name& routerName,
                                                uint64_t seqNo,  Nlsr& pnlsr)
 {
+  ndn::Name rName = routerName;
   if (routerName != pnlsr.getConfParameter().getRouterPrefix())
   {
     SequencingManager sm(seqNo);
     std::cout << sm;
     std::cout << "Router Name: " << routerName << endl;
-    if (pnlsr.getLsdb().isNameLsaNew(routerName + "/1", sm.getNameLsaSeq()))
+    try
     {
-      std::cout << "Updated Name LSA. Need to fetch it" << std::endl;
-      string lsaPrefix =
-        pnlsr.getConfParameter().getChronosyncLsaPrefix() +
-        routerName + "/1/" +
-        boost::lexical_cast<std::string>(sm.getNameLsaSeq());
-      pnlsr.getInterestManager().expressInterest(lsaPrefix, 3,
-                                                 pnlsr.getConfParameter().getInterestResendTime());
+      if (pnlsr.getLsdb().isNameLsaNew(rName.append("name"), sm.getNameLsaSeq()))
+      {
+        std::cout << "Updated Name LSA. Need to fetch it" << std::endl;
+        ndn::Name interestName(pnlsr.getConfParameter().getChronosyncLsaPrefix());
+        interestName.append(routerName);
+        interestName.append("name");
+        interestName.appendNumber(sm.getNameLsaSeq());
+        pnlsr.getLsdb().expressInterest(interestName,
+                                        pnlsr.getConfParameter().getInterestResendTime());
+      }
+      if (pnlsr.getLsdb().isAdjLsaNew(rName.append("adjacency"),
+                                      sm.getAdjLsaSeq()))
+      {
+        std::cout << "Updated Adj LSA. Need to fetch it" << std::endl;
+        ndn::Name interestName(pnlsr.getConfParameter().getChronosyncLsaPrefix());
+        interestName.append(routerName);
+        interestName.append("adjacency");
+        interestName.appendNumber(sm.getAdjLsaSeq());
+        pnlsr.getLsdb().expressInterest(interestName,
+                                        pnlsr.getConfParameter().getInterestResendTime());
+      }
+      if (pnlsr.getLsdb().isCoordinateLsaNew(rName.append("coordinate"),
+                                             sm.getCorLsaSeq()))
+      {
+        std::cout << "Updated Cor LSA. Need to fetch it" << std::endl;
+        ndn::Name interestName(pnlsr.getConfParameter().getChronosyncLsaPrefix());
+        interestName.append(routerName);
+        interestName.append("coordinate");
+        interestName.appendNumber(sm.getCorLsaSeq());
+        pnlsr.getLsdb().expressInterest(interestName,
+                                        pnlsr.getConfParameter().getInterestResendTime());
+      }
     }
-    if (pnlsr.getLsdb().isAdjLsaNew(routerName + "/2", sm.getAdjLsaSeq()))
+    catch (std::exception& e)
     {
-      std::cout << "Updated Adj LSA. Need to fetch it" << std::endl;
-      string lsaPrefix =
-        pnlsr.getConfParameter().getChronosyncLsaPrefix() +
-        routerName + "/2/" +
-        boost::lexical_cast<std::string>(sm.getAdjLsaSeq());
-      pnlsr.getInterestManager().expressInterest(lsaPrefix, 3,
-                                                 pnlsr.getConfParameter().getInterestResendTime());
-    }
-    if (pnlsr.getLsdb().isCoordinateLsaNew(routerName + "/3", sm.getCorLsaSeq()))
-    {
-      std::cout << "Updated Cor LSA. Need to fetch it" << std::endl;
-      string lsaPrefix =
-        pnlsr.getConfParameter().getChronosyncLsaPrefix() +
-        routerName + "/3/" +
-        boost::lexical_cast<std::string>(sm.getCorLsaSeq());
-      pnlsr.getInterestManager().expressInterest(lsaPrefix, 3,
-                                                 pnlsr.getConfParameter().getInterestResendTime());
+      std::cerr << e.what() << std::endl;
+      return;
     }
   }
 }
 
-// void
-// SyncLogicHandler::processKeysUpdateFromSync(std::string certName,
-//                                             uint64_t seqNo, Nlsr& pnlsr)
-// {
-//   std::cout << "Cert Name: " << certName << std::endl;
-//   // if (pnlsr.getKeyManager().isNewCertificate(certName, seqNo))
-//   {
-//     string certNamePrefix = certName + "/" +
-//                             boost::lexical_cast<string>(seqNo);
-//     pnlsr.getIm().expressInterest(certNamePrefix, 3,
-//                                   pnlsr.getConfParameter().getInterestResendTime());
-//   }
-// }
-
 void
 SyncLogicHandler::publishRoutingUpdate(SequencingManager& sm,
-                                       const string& updatePrefix)
+                                       const ndn::Name& updatePrefix)
 {
   sm.writeSeqNoToFile();
   publishSyncUpdate(updatePrefix, sm.getCombinedSeqNo());
 }
 
-// void
-// SyncLogicHandler::publishKeyUpdate(KeyManager& km)
-// {
-//   publishSyncUpdate(km.getProcessCertName().toUri(), km.getCertSeqNo());
-// }
-
 void
-SyncLogicHandler::publishIdentityUpdate(const string& identityName)
-{
-  publishSyncUpdate(identityName, 0);
-}
-
-void
-SyncLogicHandler::publishSyncUpdate(const string& updatePrefix, uint64_t seqNo)
+SyncLogicHandler::publishSyncUpdate(const ndn::Name& updatePrefix,
+                                    uint64_t seqNo)
 {
   std::cout << "Publishing Sync Update ......" << std::endl;
   std::cout << "Update in prefix: " << updatePrefix << std::endl;
   std::cout << "Seq No: " << seqNo << std::endl;
   ndn::Name updateName(updatePrefix);
   string data("NoData");
-  m_syncSocket->publishData(updateName, 0, data.c_str(), data.size(), 1000,
+  m_syncSocket->publishData(updateName.toUri(), 0, data.c_str(), data.size(),
+                            1000,
                             seqNo);
 }
 
diff --git a/src/communication/sync-logic-handler.hpp b/src/communication/sync-logic-handler.hpp
index 9f6badd..1f62554 100644
--- a/src/communication/sync-logic-handler.hpp
+++ b/src/communication/sync-logic-handler.hpp
@@ -11,8 +11,6 @@
 
 #include "sequencing-manager.hpp"
 
-// class KeyManager;
-
 extern "C" {
 #include <unistd.h>
 }
@@ -42,16 +40,10 @@
   nsyncRemoveCallBack(const std::string& prefix, Nlsr& pnlsr);
 
   void
-  removeRouterFromSyncing(const std::string& routerPrefix);
+  removeRouterFromSyncing(const ndn::Name& routerPrefix);
 
   void
-  publishRoutingUpdate(SequencingManager& sm, const std::string& updatePrefix);
-
-  // void
-  // publishKeyUpdate(KeyManager& km);
-
-  void
-  publishIdentityUpdate(const std::string& identityName);
+  publishRoutingUpdate(SequencingManager& sm, const ndn::Name& updatePrefix);
 
   void
   setSyncPrefix(const std::string& sp)
@@ -62,17 +54,15 @@
 
 private:
   void
-  processUpdateFromSync(const std::string& updateName, uint64_t seqNo, Nlsr& pnlsr);
+  processUpdateFromSync(const ndn::Name& updateName, uint64_t seqNo,
+                        Nlsr& pnlsr);
 
   void
-  processRoutingUpdateFromSync(const std::string& routerName, uint64_t seqNo,
+  processRoutingUpdateFromSync(const ndn::Name& routerName, uint64_t seqNo,
                                Nlsr& pnlsr);
 
-  // void
-  // processKeysUpdateFromSync(std::string certName, uint64_t seqNo, Nlsr& pnlsr);
-
   void
-  publishSyncUpdate(const std::string& updatePrefix, uint64_t seqNo);
+  publishSyncUpdate(const ndn::Name& updatePrefix, uint64_t seqNo);
 
 private:
   ndn::shared_ptr<ndn::ValidatorNull> m_validator;
diff --git a/src/conf-file-processor.cpp b/src/conf-file-processor.cpp
index fcb8d33..18ae0a5 100644
--- a/src/conf-file-processor.cpp
+++ b/src/conf-file-processor.cpp
@@ -503,7 +503,7 @@
       stringstream sst(nt.getRestOfLine().c_str());
       int faceId;
       sst >> faceId;
-      Adjacent adj(nt.getFirstToken(), faceId, 0.0, 0, 0);
+      Adjacent adj(nt.getFirstToken(), faceId, 10, 0, 0);
       m_nlsr.getAdjacencyList().insert(adj);
     }
   }
diff --git a/src/conf-parameter.hpp b/src/conf-parameter.hpp
index 49a8a4d..5b5b560 100644
--- a/src/conf-parameter.hpp
+++ b/src/conf-parameter.hpp
@@ -3,6 +3,8 @@
 
 #include <iostream>
 #include <boost/cstdint.hpp>
+#include <ndn-cxx/common.hpp>
+#include <ndn-cxx/face.hpp>
 
 namespace nlsr {
 class ConfParameter
@@ -32,10 +34,10 @@
   void
   setRouterName(const std::string& rn)
   {
-    m_routerName = rn;
+    m_routerName = ndn::Name(rn);
   }
 
-  const std::string&
+  const ndn::Name&
   getRouterName()
   {
     return m_routerName;
@@ -44,10 +46,10 @@
   void
   setSiteName(const std::string& sn)
   {
-    m_siteName = sn;
+    m_siteName = ndn::Name(sn);
   }
 
-  const std::string&
+  const ndn::Name&
   getSiteName()
   {
     return m_siteName;
@@ -56,10 +58,10 @@
   void
   setNetwork(const std::string& nn)
   {
-    m_network = nn;
+    m_network = ndn::Name(nn);
   }
 
-  const std::string&
+  const ndn::Name&
   getNetwork()
   {
     return m_network;
@@ -68,16 +70,19 @@
   void
   buildRouterPrefix()
   {
-    m_routerPrefix = "/" + m_network + "/" + m_siteName + "/" + m_routerName;
+    //m_routerPrefix = "/" + m_network + "/" + m_siteName + "/" + m_routerName;
+    m_routerPrefix = m_network;
+    m_routerPrefix.append(m_siteName);
+    m_routerPrefix.append(m_routerName);
   }
 
-  const std::string&
+  const ndn::Name&
   getRouterPrefix()
   {
     return m_routerPrefix;
   }
 
-  const std::string&
+  const ndn::Name&
   getRootKeyPrefix()
   {
     return m_rootKeyPrefix;
@@ -86,7 +91,7 @@
   void
   setRootKeyPrefix(std::string rkp)
   {
-    m_rootKeyPrefix = rkp;
+    m_rootKeyPrefix = ndn::Name(rkp);
   }
 
   void
@@ -261,10 +266,10 @@
   void
   setChronosyncSyncPrefix(const std::string& csp)
   {
-    m_chronosyncSyncPrefix = csp;
+    m_chronosyncSyncPrefix = ndn::Name(csp);
   }
 
-  const std::string&
+  const ndn::Name&
   getChronosyncSyncPrefix()
   {
     return m_chronosyncSyncPrefix;
@@ -273,10 +278,10 @@
   void
   setChronosyncLsaPrefix(const std::string& clp)
   {
-    m_chronosyncLsaPrefix = clp;
+    m_chronosyncLsaPrefix = ndn::Name(clp);
   }
 
-  const std::string&
+  const ndn::Name&
   getChronosyncLsaPrefix()
   {
     return m_chronosyncLsaPrefix;
@@ -295,16 +300,16 @@
   }
 
 private:
-  std::string m_routerName;
-  std::string m_siteName;
-  std::string m_network;
+  ndn::Name m_routerName;
+  ndn::Name m_siteName;
+  ndn::Name m_network;
 
-  std::string m_routerPrefix;
-  std::string m_lsaRouterPrefix;
+  ndn::Name m_routerPrefix;
+  ndn::Name m_lsaRouterPrefix;
 
-  std::string m_chronosyncSyncPrefix;
-  std::string m_chronosyncLsaPrefix;
-  std::string m_rootKeyPrefix;
+  ndn::Name m_chronosyncSyncPrefix;
+  ndn::Name m_chronosyncLsaPrefix;
+  ndn::Name m_rootKeyPrefix;
 
   uint32_t m_interestRetryNumber;
   int32_t m_interestResendTime;
diff --git a/src/hello-protocol.cpp b/src/hello-protocol.cpp
new file mode 100644
index 0000000..ccc2f5b
--- /dev/null
+++ b/src/hello-protocol.cpp
@@ -0,0 +1,173 @@
+#include "nlsr.hpp"
+#include "lsdb.hpp"
+#include "hello-protocol.hpp"
+#include "utility/name-helper.hpp"
+
+namespace nlsr {
+
+void
+HelloProtocol::expressInterest(const ndn::Name& interestName, uint32_t seconds)
+{
+  std::cout << "Expressing Interest :" << interestName << std::endl;
+  ndn::Interest i(interestName);
+  i.setInterestLifetime(ndn::time::seconds(seconds));
+  i.setMustBeFresh(true);
+  m_nlsr.getNlsrFace().expressInterest(i,
+                                       ndn::bind(&HelloProtocol::processContent,
+                                                 this,
+                                                 _1, _2),
+                                       ndn::bind(&HelloProtocol::processInterestTimedOut,
+                                                 this, _1));
+}
+
+void
+HelloProtocol::sendScheduledInterest(uint32_t seconds)
+{
+  std::list<Adjacent> adjList = m_nlsr.getAdjacencyList().getAdjList();
+  for (std::list<Adjacent>::iterator it = adjList.begin(); it != adjList.end();
+       ++it)
+  {
+    ndn::Name interestName = (*it).getName() ;
+    interestName.append("info");
+    interestName.append(ndn::Name(m_nlsr.getConfParameter().getRouterPrefix()));
+    expressInterest(interestName,
+                    m_nlsr.getConfParameter().getInterestResendTime());
+  }
+  scheduleInterest(m_nlsr.getConfParameter().getInfoInterestInterval());
+}
+
+void
+HelloProtocol::scheduleInterest(uint32_t seconds)
+{
+  m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(seconds),
+                                      ndn::bind(&HelloProtocol::sendScheduledInterest,
+                                                this, seconds));
+}
+
+void
+HelloProtocol::processInterest(const ndn::Name& name,
+                               const ndn::Interest& interest)
+{
+  const ndn::Name interestName = interest.getName();
+  std::cout << "Interest Received for Name: " << interestName << std::endl;
+  std::string chkString("info");
+  int32_t infoPosition = util::getNameComponentPosition(interestName, chkString);
+  if (infoPosition < 0)
+  {
+    return;
+  }
+  ndn::Name neighbor = interestName.getSubName(infoPosition + 1);
+  std::cout << "Neighbor: " << neighbor << std::endl;
+  if (m_nlsr.getAdjacencyList().isNeighbor(neighbor))
+  {
+    ndn::Data data(ndn::Name(interest.getName()).appendVersion());
+    data.setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
+    data.setContent((const uint8_t*)"info", sizeof("info"));
+    m_keyChain.sign(data);
+    std::cout << ">> D: " << data << std::endl;
+    m_nlsr.getNlsrFace().put(data);
+    int status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
+    if (status == 0)
+    {
+      ndn::Name interestName(neighbor);
+      interestName.append("info");
+      interestName.append(m_nlsr.getConfParameter().getRouterPrefix());
+      expressInterest(interestName,
+                      m_nlsr.getConfParameter().getInterestResendTime());
+    }
+  }
+}
+
+void
+HelloProtocol::processInterestTimedOut(const ndn::Interest& interest)
+{
+  const ndn::Name interestName(interest.getName());
+  std::cout << "Interest timed out for Name: " << interestName << std::endl;
+  std::string chkString("info");
+  int32_t infoPosition = util::getNameComponentPosition(interestName, chkString);
+  if (infoPosition < 0)
+  {
+    return;
+  }
+  ndn::Name neighbor = interestName.getSubName(0, infoPosition);
+  std::cout << "Neighbor: " << neighbor << std::endl;
+  m_nlsr.getAdjacencyList().incrementTimedOutInterestCount(neighbor);
+  int status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
+  uint32_t infoIntTimedOutCount =
+    m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor);
+  std::cout << "Neighbor: " << neighbor << std::endl;
+  std::cout << "Status: " << status << std::endl;
+  std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
+  if ((infoIntTimedOutCount < m_nlsr.getConfParameter().getInterestRetryNumber()))
+  {
+    ndn::Name interestName(neighbor);
+    interestName.append("info");
+    interestName.append(m_nlsr.getConfParameter().getRouterPrefix());
+    expressInterest(interestName,
+                    m_nlsr.getConfParameter().getInterestResendTime());
+  }
+  else if ((status == 1) &&
+           (infoIntTimedOutCount == m_nlsr.getConfParameter().getInterestRetryNumber()))
+  {
+    m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, 0);
+    m_nlsr.incrementAdjBuildCount();
+    if (m_nlsr.getIsBuildAdjLsaSheduled() == 0)
+    {
+      m_nlsr.setIsBuildAdjLsaSheduled(1);
+      // event here
+      m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
+                                          ndn::bind(&Lsdb::scheduledAdjLsaBuild,
+                                                    &m_nlsr.getLsdb()));
+    }
+  }
+}
+
+
+void
+HelloProtocol::processContent(const ndn::Interest& interest,
+                              const ndn::Data& data)
+{
+  ndn::Name dataName = data.getName();
+  std::cout << "Data received for name: " << dataName << std::endl;
+  std::string chkString("info");
+  int32_t infoPosition = util::getNameComponentPosition(dataName, chkString);
+  if (infoPosition >= 0)
+  {
+    ndn::Name neighbor = dataName.getSubName(0, infoPosition);
+    int oldStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
+    int infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(
+                                 neighbor);
+    //debugging purpose start
+    std::cout << "Before Updates: " << std::endl;
+    std::cout << "Neighbor : " << neighbor << std::endl;
+    std::cout << "Status: " << oldStatus << std::endl;
+    std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
+    //debugging purpose end
+    m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, 1);
+    m_nlsr.getAdjacencyList().setTimedOutInterestCount(neighbor, 0);
+    int newStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
+    infoIntTimedOutCount = m_nlsr.getAdjacencyList().getTimedOutInterestCount(
+                             neighbor);
+    //debugging purpose
+    std::cout << "After Updates: " << std::endl;
+    std::cout << "Neighbor : " << neighbor << std::endl;
+    std::cout << "Status: " << newStatus << std::endl;
+    std::cout << "Info Interest Timed out: " << infoIntTimedOutCount << std::endl;
+    //debugging purpose end
+    if ((oldStatus - newStatus) != 0)  // change in Adjacency list
+    {
+      m_nlsr.incrementAdjBuildCount();
+      /* Need to schedule event for Adjacency LSA building */
+      if (m_nlsr.getIsBuildAdjLsaSheduled() == 0)
+      {
+        m_nlsr.setIsBuildAdjLsaSheduled(1);
+        // event here
+        m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
+                                            ndn::bind(&Lsdb::scheduledAdjLsaBuild,
+                                                      boost::ref(m_nlsr.getLsdb())));
+      }
+    }
+  }
+}
+
+} //namespace nlsr
diff --git a/src/hello-protocol.hpp b/src/hello-protocol.hpp
new file mode 100644
index 0000000..984413d
--- /dev/null
+++ b/src/hello-protocol.hpp
@@ -0,0 +1,48 @@
+#ifndef NLSR_HELLO_PROTOCOL_HPP
+#define NLSR_HELLO_PROTOCOL_HPP
+
+#include <boost/cstdint.hpp>
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/util/scheduler.hpp>
+
+namespace nlsr {
+
+class Nlsr;
+
+class HelloProtocol
+{
+
+public:
+  HelloProtocol(Nlsr& nlsr)
+    : m_nlsr(nlsr)
+  {
+  }
+
+public:
+  void
+  scheduleInterest(uint32_t seconds);
+
+  void
+  expressInterest(const ndn::Name& interestNamePrefix, uint32_t seconds);
+
+  void
+  sendScheduledInterest(uint32_t seconds);
+
+  void
+  processInterest(const ndn::Name& name, const ndn::Interest& interest);
+
+private:
+  void
+  processInterestTimedOut(const ndn::Interest& interest);
+
+  void
+  processContent(const ndn::Interest& interest, const ndn::Data& data);
+
+private:
+  Nlsr& m_nlsr;
+  ndn::KeyChain m_keyChain;
+};
+
+} //namespace nlsr
+
+#endif // NLSR_HELLO_PROTOCOL_HPP
diff --git a/src/lsa.cpp b/src/lsa.cpp
index 5f76eda..2ad95c5 100644
--- a/src/lsa.cpp
+++ b/src/lsa.cpp
@@ -4,6 +4,8 @@
 #include <algorithm>
 #include <cmath>
 #include <limits>
+#include <boost/tokenizer.hpp>
+#include <boost/algorithm/string.hpp>
 
 #include "nlsr.hpp"
 #include "lsa.hpp"
@@ -17,23 +19,24 @@
 using namespace std;
 
 
-string
+const ndn::Name
 NameLsa::getKey() const
 {
-  string key;
-  key = m_origRouter + "/" + boost::lexical_cast<std::string>(1);
+  ndn::Name key = m_origRouter;
+  key.append("name");
   return key;
 }
 
-NameLsa::NameLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt,
+NameLsa::NameLsa(const ndn::Name& origR, const string& lst, uint32_t lsn,
+                 uint32_t lt,
                  NamePrefixList& npl)
 {
   m_origRouter = origR;
   m_lsType = lst;
   m_lsSeqNo = lsn;
   m_lifeTime = lt;
-  std::list<string> nl = npl.getNameList();
-  for (std::list<string>::iterator it = nl.begin(); it != nl.end(); it++)
+  std::list<ndn::Name>& nl = npl.getNameList();
+  for (std::list<ndn::Name>::iterator it = nl.begin(); it != nl.end(); it++)
   {
     addName((*it));
   }
@@ -43,44 +46,45 @@
 NameLsa::getData()
 {
   string nameLsaData;
-  nameLsaData = m_origRouter + "|" + boost::lexical_cast<std::string>(1) + "|"
+  nameLsaData = m_origRouter.toUri() + "|" + "name" + "|"
                 + boost::lexical_cast<std::string>(m_lsSeqNo) + "|"
                 + boost::lexical_cast<std::string>(m_lifeTime);
   nameLsaData += "|";
   nameLsaData += boost::lexical_cast<std::string>(m_npl.getSize());
-  std::list<string> nl = m_npl.getNameList();
-  for (std::list<string>::iterator it = nl.begin(); it != nl.end(); it++)
+  std::list<ndn::Name> nl = m_npl.getNameList();
+  for (std::list<ndn::Name>::iterator it = nl.begin(); it != nl.end(); it++)
   {
     nameLsaData += "|";
-    nameLsaData += (*it);
+    nameLsaData += (*it).toUri();
   }
   return nameLsaData + "|";
 }
 
 bool
-NameLsa::initializeFromContent(string content)
+NameLsa::initializeFromContent(const std::string& content)
 {
   uint32_t numName = 0;
-  Tokenizer nt(content, "|");
-  m_origRouter = nt.getNextToken();
-  if (m_origRouter.empty())
+  boost::char_separator<char> sep("|");
+  boost::tokenizer<boost::char_separator<char> >tokens(content, sep);
+  boost::tokenizer<boost::char_separator<char> >::iterator tok_iter =
+                                               tokens.begin();
+  m_origRouter = ndn::Name(*tok_iter++);
+  if (!(m_origRouter.size() > 0))
   {
     return false;
   }
-  try
-  {
-    m_lsType = boost::lexical_cast<uint8_t>(nt.getNextToken());
-    m_lsSeqNo = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    m_lifeTime = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    numName = boost::lexical_cast<uint32_t>(nt.getNextToken());
+  try {
+    m_lsType = *tok_iter++;
+    m_lsSeqNo = boost::lexical_cast<uint32_t>(*tok_iter++);
+    m_lifeTime = boost::lexical_cast<uint32_t>(*tok_iter++);
+    numName = boost::lexical_cast<uint32_t>(*tok_iter++);
   }
-  catch (std::exception& e)
-  {
+  catch (std::exception& e) {
     return false;
   }
   for (uint32_t i = 0; i < numName; i++)
   {
-    string name = nt.getNextToken();
+    string name(*tok_iter++);
     addName(name);
   }
   return true;
@@ -96,13 +100,13 @@
 {
   os << "Name Lsa: " << endl;
   os << "  Origination Router: " << nLsa.getOrigRouter() << endl;
-  os << "  Ls Type: " << (unsigned short)nLsa.getLsType() << endl;
+  os << "  Ls Type: " << nLsa.getLsType() << endl;
   os << "  Ls Seq No: " << (unsigned int)nLsa.getLsSeqNo() << endl;
   os << "  Ls Lifetime: " << (unsigned int)nLsa.getLifeTime() << endl;
   os << "  Names: " << endl;
   int i = 1;
-  std::list<string> nl = nLsa.getNpl().getNameList();
-  for (std::list<string>::iterator it = nl.begin(); it != nl.end(); it++)
+  std::list<ndn::Name> nl = nLsa.getNpl().getNameList();
+  for (std::list<ndn::Name>::iterator it = nl.begin(); it != nl.end(); it++)
   {
     os << "    Name " << i << ": " << (*it) << endl;
   }
@@ -111,7 +115,8 @@
 
 
 
-CoordinateLsa::CoordinateLsa(string origR, uint8_t lst, uint32_t lsn,
+CoordinateLsa::CoordinateLsa(const ndn::Name& origR, const string lst,
+                             uint32_t lsn,
                              uint32_t lt
                              , double r, double theta)
 {
@@ -123,11 +128,11 @@
   m_corTheta = theta;
 }
 
-string
+const ndn::Name
 CoordinateLsa::getKey() const
 {
-  string key;
-  key = m_origRouter + "/" + boost::lexical_cast<std::string>(3);
+  ndn::Name key = m_origRouter;
+  key.append("coordinate");
   return key;
 }
 
@@ -144,8 +149,9 @@
 CoordinateLsa::getData()
 {
   string corLsaData;
-  corLsaData = m_origRouter + "|";
-  corLsaData += (boost::lexical_cast<std::string>(3) + "|");
+  corLsaData = m_origRouter.toUri() + "|";
+  corLsaData += "coordinate";
+  corLsaData += "|";
   corLsaData += (boost::lexical_cast<std::string>(m_lsSeqNo) + "|");
   corLsaData += (boost::lexical_cast<std::string>(m_lifeTime) + "|");
   corLsaData += (boost::lexical_cast<std::string>(m_corRad) + "|");
@@ -154,24 +160,25 @@
 }
 
 bool
-CoordinateLsa::initializeFromContent(string content)
+CoordinateLsa::initializeFromContent(const std::string& content)
 {
-  Tokenizer nt(content, "|");
-  m_origRouter = nt.getNextToken();
-  if (m_origRouter.empty())
+  boost::char_separator<char> sep("|");
+  boost::tokenizer<boost::char_separator<char> >tokens(content, sep);
+  boost::tokenizer<boost::char_separator<char> >::iterator tok_iter =
+                                               tokens.begin();
+  m_origRouter = ndn::Name(*tok_iter++);
+  if (!(m_origRouter.size() > 0))
   {
     return false;
   }
-  try
-  {
-    m_lsType   = boost::lexical_cast<uint8_t>(nt.getNextToken());
-    m_lsSeqNo  = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    m_lifeTime = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    m_corRad   = boost::lexical_cast<double>(nt.getNextToken());
-    m_corTheta = boost::lexical_cast<double>(nt.getNextToken());
+  try {
+    m_lsType   = *tok_iter++;
+    m_lsSeqNo  = boost::lexical_cast<uint32_t>(*tok_iter++);
+    m_lifeTime = boost::lexical_cast<uint32_t>(*tok_iter++);
+    m_corRad   = boost::lexical_cast<double>(*tok_iter++);
+    m_corTheta = boost::lexical_cast<double>(*tok_iter++);
   }
-  catch (std::exception& e)
-  {
+  catch (std::exception& e) {
     return false;
   }
   return true;
@@ -182,7 +189,7 @@
 {
   os << "Cor Lsa: " << endl;
   os << "  Origination Router: " << cLsa.getOrigRouter() << endl;
-  os << "  Ls Type: " << (unsigned short)cLsa.getLsType() << endl;
+  os << "  Ls Type: " << cLsa.getLsType() << endl;
   os << "  Ls Seq No: " << (unsigned int)cLsa.getLsSeqNo() << endl;
   os << "  Ls Lifetime: " << (unsigned int)cLsa.getLifeTime() << endl;
   os << "    Hyperbolic Radius: " << cLsa.getCorRadius() << endl;
@@ -191,7 +198,8 @@
 }
 
 
-AdjLsa::AdjLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt,
+AdjLsa::AdjLsa(const ndn::Name& origR, const string& lst, uint32_t lsn,
+               uint32_t lt,
                uint32_t nl , AdjacencyList& adl)
 {
   m_origRouter = origR;
@@ -209,11 +217,11 @@
   }
 }
 
-string
-AdjLsa::getKey()
+const ndn::Name
+AdjLsa::getKey() const
 {
-  string key;
-  key = m_origRouter + "/" + boost::lexical_cast<std::string>(2);
+  ndn::Name key = m_origRouter;
+  key.append("adjacency");
   return key;
 }
 
@@ -228,7 +236,7 @@
 AdjLsa::getData()
 {
   string adjLsaData;
-  adjLsaData = m_origRouter + "|" + boost::lexical_cast<std::string>(2) + "|"
+  adjLsaData = m_origRouter.toUri() + "|" + "adjacency" + "|"
                + boost::lexical_cast<std::string>(m_lsSeqNo) + "|"
                + boost::lexical_cast<std::string>(m_lifeTime);
   adjLsaData += "|";
@@ -237,7 +245,7 @@
   for (std::list<Adjacent>::iterator it = al.begin(); it != al.end(); it++)
   {
     adjLsaData += "|";
-    adjLsaData += (*it).getName();
+    adjLsaData += (*it).getName().toUri();
     adjLsaData += "|";
     adjLsaData += boost::lexical_cast<std::string>((*it).getConnectingFace());
     adjLsaData += "|";
@@ -247,38 +255,37 @@
 }
 
 bool
-AdjLsa::initializeFromContent(string content)
+AdjLsa::initializeFromContent(const std::string& content)
 {
   uint32_t numLink = 0;
-  Tokenizer nt(content, "|");
-  m_origRouter = nt.getNextToken();
-  if (m_origRouter.empty())
+  boost::char_separator<char> sep("|");
+  boost::tokenizer<boost::char_separator<char> >tokens(content, sep);
+  boost::tokenizer<boost::char_separator<char> >::iterator tok_iter =
+                                               tokens.begin();
+  m_origRouter = ndn::Name(*tok_iter++);
+  if (!(m_origRouter.size() > 0))
   {
     return false;
   }
-  try
-  {
-    m_lsType   = boost::lexical_cast<uint8_t>(nt.getNextToken());
-    m_lsSeqNo  = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    m_lifeTime = boost::lexical_cast<uint32_t>(nt.getNextToken());
-    numLink    = boost::lexical_cast<uint32_t>(nt.getNextToken());
+  try {
+    m_lsType   = *tok_iter++;
+    m_lsSeqNo  = boost::lexical_cast<uint32_t>(*tok_iter++);
+    m_lifeTime = boost::lexical_cast<uint32_t>(*tok_iter++);
+    numLink    = boost::lexical_cast<uint32_t>(*tok_iter++);
   }
-  catch (std::exception& e)
-  {
+  catch (std::exception& e) {
     return false;
   }
   for (uint32_t i = 0; i < numLink; i++)
   {
-    try
-    {
-      string adjName = nt.getNextToken();
-      int connectingFace = boost::lexical_cast<int>(nt.getNextToken());
-      double linkCost = boost::lexical_cast<double>(nt.getNextToken());
+    try {
+      string adjName(*tok_iter++);
+      int connectingFace = boost::lexical_cast<int>(*tok_iter++);
+      double linkCost = boost::lexical_cast<double>(*tok_iter++);
       Adjacent adjacent(adjName, connectingFace, linkCost, 0, 0);
       addAdjacent(adjacent);
     }
-    catch (std::exception& e)
-    {
+    catch (std::exception& e) {
       return false;
     }
   }
@@ -291,8 +298,7 @@
 {
   if (getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
   {
-    pnlsr.getNamePrefixTable().addEntry(getOrigRouter(), getOrigRouter(),
-                                                 pnlsr);
+    pnlsr.getNamePrefixTable().addEntry(getOrigRouter(), getOrigRouter());
   }
 }
 
@@ -302,7 +308,7 @@
 {
   if (getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
   {
-    pnlsr.getNamePrefixTable().removeEntry(getOrigRouter(), getOrigRouter(), pnlsr);
+    pnlsr.getNamePrefixTable().removeEntry(getOrigRouter(), getOrigRouter());
   }
 }
 
@@ -313,7 +319,7 @@
 {
   os << "Adj Lsa: " << endl;
   os << "  Origination Router: " << aLsa.getOrigRouter() << endl;
-  os << "  Ls Type: " << (unsigned short)aLsa.getLsType() << endl;
+  os << "  Ls Type: " << aLsa.getLsType() << endl;
   os << "  Ls Seq No: " << (unsigned int)aLsa.getLsSeqNo() << endl;
   os << "  Ls Lifetime: " << (unsigned int)aLsa.getLifeTime() << endl;
   os << "  No Link: " << (unsigned int)aLsa.getNoLink() << endl;
diff --git a/src/lsa.hpp b/src/lsa.hpp
index 3a86c09..0220897 100644
--- a/src/lsa.hpp
+++ b/src/lsa.hpp
@@ -8,6 +8,7 @@
 #include "adjacency-list.hpp"
 
 namespace nlsr {
+
 class Lsa
 {
 public:
@@ -21,12 +22,12 @@
 
 
   void
-  setLsType(uint8_t lst)
+  setLsType(const std::string& lst)
   {
     m_lsType = lst;
   }
 
-  uint8_t
+  const std::string&
   getLsType() const
   {
     return m_lsType;
@@ -44,14 +45,14 @@
     return m_lsSeqNo;
   }
 
-  std::string
+  const ndn::Name&
   getOrigRouter() const
   {
     return m_origRouter;
   }
 
   void
-  setOrigRouter(const std::string& org)
+  setOrigRouter(const ndn::Name& org)
   {
     m_origRouter = org;
   }
@@ -81,8 +82,8 @@
   }
 
 protected:
-  std::string m_origRouter;
-  uint8_t m_lsType;
+  ndn::Name m_origRouter;
+  std::string m_lsType;
   uint32_t m_lsSeqNo;
   uint32_t m_lifeTime;
   ndn::EventId m_expiringEventId;
@@ -95,10 +96,11 @@
     : Lsa()
     , m_npl()
   {
-    setLsType(1);
+    setLsType("name");
   }
 
-  NameLsa(std::string origR, uint8_t lst, uint32_t lsn, uint32_t lt,
+  NameLsa(const ndn::Name& origR, const std::string& lst, uint32_t lsn,
+          uint32_t lt,
           NamePrefixList& npl);
 
   NamePrefixList&
@@ -108,25 +110,25 @@
   }
 
   void
-  addName(std::string& name)
+  addName(const ndn::Name& name)
   {
     m_npl.insert(name);
   }
 
   void
-  removeName(std::string& name)
+  removeName(const ndn::Name& name)
   {
     m_npl.remove(name);
   }
 
-  std::string
+  const ndn::Name
   getKey() const;
 
   std::string
   getData();
 
   bool
-  initializeFromContent(std::string content);
+  initializeFromContent(const std::string& content);
 
   void
   writeLog();
@@ -146,10 +148,11 @@
     : Lsa()
     , m_adl()
   {
-    setLsType(2);
+    setLsType("adjacency");
   }
 
-  AdjLsa(std::string origR, uint8_t lst, uint32_t lsn, uint32_t lt,
+  AdjLsa(const ndn::Name& origR, const std::string& lst, uint32_t lsn,
+         uint32_t lt,
          uint32_t nl , AdjacencyList& adl);
 
   AdjacencyList&
@@ -164,14 +167,14 @@
     m_adl.insert(adj);
   }
 
-  std::string
-  getKey();
+  const ndn::Name
+  getKey() const;
 
   std::string
   getData();
 
   bool
-  initializeFromContent(std::string content);
+  initializeFromContent(const std::string& content);
 
   uint32_t
   getNoLink()
@@ -204,20 +207,21 @@
     , m_corRad(0)
     , m_corTheta(0)
   {
-    setLsType(3);
+    setLsType("coordinate");
   }
 
-  CoordinateLsa(std::string origR, uint8_t lst, uint32_t lsn, uint32_t lt
+  CoordinateLsa(const ndn::Name& origR, const std::string lst, uint32_t lsn,
+                uint32_t lt
                 , double r, double theta);
 
-  std::string
+  const ndn::Name
   getKey() const;
 
   std::string
   getData();
 
   bool
-  initializeFromContent(std::string content);
+  initializeFromContent(const std::string& content);
 
   double
   getCorRadius() const
diff --git a/src/lsdb.cpp b/src/lsdb.cpp
index 7cdd4b6..a5eb2b2 100644
--- a/src/lsdb.cpp
+++ b/src/lsdb.cpp
@@ -2,38 +2,39 @@
 #include <utility>
 #include "lsdb.hpp"
 #include "nlsr.hpp"
+#include "utility/name-helper.hpp"
 
 namespace nlsr {
 
 using namespace std;
 
 void
-Lsdb::cancelScheduleLsaExpiringEvent(Nlsr& pnlsr, ndn::EventId eid)
+Lsdb::cancelScheduleLsaExpiringEvent(ndn::EventId eid)
 {
-  pnlsr.getScheduler().cancelEvent(eid);
+  m_nlsr.getScheduler().cancelEvent(eid);
 }
 
 static bool
-nameLsaCompareByKey(const NameLsa& nlsa1, const string& key)
+nameLsaCompareByKey(const NameLsa& nlsa1, const ndn::Name& key)
 {
   return nlsa1.getKey() == key;
 }
 
 
 bool
-Lsdb::buildAndInstallOwnNameLsa(Nlsr& pnlsr)
+Lsdb::buildAndInstallOwnNameLsa()
 {
-  NameLsa nameLsa(pnlsr.getConfParameter().getRouterPrefix(),
-                  1,
-                  pnlsr.getSequencingManager().getNameLsaSeq() + 1,
-                  pnlsr.getConfParameter().getRouterDeadInterval(),
-                  pnlsr.getNamePrefixList());
-  pnlsr.getSequencingManager().increaseNameLsaSeq();
-  return installNameLsa(pnlsr, nameLsa);
+  NameLsa nameLsa(m_nlsr.getConfParameter().getRouterPrefix(),
+                  "name",
+                  m_nlsr.getSequencingManager().getNameLsaSeq() + 1,
+                  m_nlsr.getConfParameter().getRouterDeadInterval(),
+                  m_nlsr.getNamePrefixList());
+  m_nlsr.getSequencingManager().increaseNameLsaSeq();
+  return installNameLsa(nameLsa);
 }
 
 NameLsa*
-Lsdb::findNameLsa(const string key)
+Lsdb::findNameLsa(const ndn::Name& key)
 {
   std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
                                                  m_nameLsdb.end(),
@@ -46,7 +47,7 @@
 }
 
 bool
-Lsdb::isNameLsaNew(string key, uint64_t seqNo)
+Lsdb::isNameLsaNew(const ndn::Name& key, uint64_t seqNo)
 {
   NameLsa* nameLsaCheck = findNameLsa(key);
   if (nameLsaCheck != 0)
@@ -64,15 +65,15 @@
 }
 
 ndn::EventId
-Lsdb::scheduleNameLsaExpiration(Nlsr& pnlsr, string key, int seqNo, int expTime)
+Lsdb::scheduleNameLsaExpiration(const ndn::Name& key, int seqNo, int expTime)
 {
-  return pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
-                                            ndn::bind(&Lsdb::exprireOrRefreshNameLsa,
-                                                      this, boost::ref(pnlsr), key, seqNo));
+  return m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
+                                             ndn::bind(&Lsdb::exprireOrRefreshNameLsa,
+                                                       this, key, seqNo));
 }
 
 bool
-Lsdb::installNameLsa(Nlsr& pnlsr, NameLsa& nlsa)
+Lsdb::installNameLsa(NameLsa& nlsa)
 {
   int timeToExpire = m_lsaRefreshTime;
   NameLsa* chkNameLsa = findNameLsa(nlsa.getKey());
@@ -81,26 +82,25 @@
     addNameLsa(nlsa);
     nlsa.writeLog();
     printNameLsdb();
-    if (nlsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
     {
-      pnlsr.getNamePrefixTable().addEntry(nlsa.getOrigRouter(),
-                                          nlsa.getOrigRouter(), pnlsr);
-      std::list<string> nameList = nlsa.getNpl().getNameList();
-      for (std::list<string>::iterator it = nameList.begin(); it != nameList.end();
+      m_nlsr.getNamePrefixTable().addEntry(nlsa.getOrigRouter(),
+                                           nlsa.getOrigRouter());
+      std::list<ndn::Name> nameList = nlsa.getNpl().getNameList();
+      for (std::list<ndn::Name>::iterator it = nameList.begin(); it != nameList.end();
            it++)
       {
-        if ((*it) != pnlsr.getConfParameter().getRouterPrefix())
+        if ((*it) != m_nlsr.getConfParameter().getRouterPrefix())
         {
-          pnlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter(), pnlsr);
+          m_nlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter());
         }
       }
     }
-    if (nlsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
     {
       timeToExpire = nlsa.getLifeTime();
     }
-    nlsa.setExpiringEventId(scheduleNameLsaExpiration(pnlsr,
-                                                      nlsa.getKey(),
+    nlsa.setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
                                                       nlsa.getLsSeqNo(),
                                                       timeToExpire));
   }
@@ -113,50 +113,49 @@
       chkNameLsa->setLifeTime(nlsa.getLifeTime());
       chkNameLsa->getNpl().sort();
       nlsa.getNpl().sort();
-      std::list<string> nameToAdd;
+      std::list<ndn::Name> nameToAdd;
       std::set_difference(nlsa.getNpl().getNameList().begin(),
                           nlsa.getNpl().getNameList().end(),
                           chkNameLsa->getNpl().getNameList().begin(),
                           chkNameLsa->getNpl().getNameList().end(),
                           std::inserter(nameToAdd, nameToAdd.begin()));
-      for (std::list<string>::iterator it = nameToAdd.begin(); it != nameToAdd.end();
+      for (std::list<ndn::Name>::iterator it = nameToAdd.begin();
+           it != nameToAdd.end();
            ++it)
       {
         chkNameLsa->addName((*it));
-        if (nlsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+        if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
         {
-          if ((*it) != pnlsr.getConfParameter().getRouterPrefix())
+          if ((*it) != m_nlsr.getConfParameter().getRouterPrefix())
           {
-            pnlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter(), pnlsr);
+            m_nlsr.getNamePrefixTable().addEntry((*it), nlsa.getOrigRouter());
           }
         }
       }
-      std::list<string> nameToRemove;
+      std::list<ndn::Name> nameToRemove;
       std::set_difference(chkNameLsa->getNpl().getNameList().begin(),
                           chkNameLsa->getNpl().getNameList().end(),
                           nlsa.getNpl().getNameList().begin(),
                           nlsa.getNpl().getNameList().end(),
                           std::inserter(nameToRemove, nameToRemove.begin()));
-      for (std::list<string>::iterator it = nameToRemove.begin();
+      for (std::list<ndn::Name>::iterator it = nameToRemove.begin();
            it != nameToRemove.end(); ++it)
       {
         chkNameLsa->removeName((*it));
-        if (nlsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+        if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
         {
-          if ((*it) != pnlsr.getConfParameter().getRouterPrefix())
+          if ((*it) != m_nlsr.getConfParameter().getRouterPrefix())
           {
-            pnlsr.getNamePrefixTable().removeEntry((*it), nlsa.getOrigRouter(), pnlsr);
+            m_nlsr.getNamePrefixTable().removeEntry((*it), nlsa.getOrigRouter());
           }
         }
       }
-      if (nlsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+      if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
       {
         timeToExpire = nlsa.getLifeTime();
       }
-      cancelScheduleLsaExpiringEvent(pnlsr,
-                                     chkNameLsa->getExpiringEventId());
-      chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(pnlsr,
-                                                               nlsa.getKey(),
+      cancelScheduleLsaExpiringEvent(chkNameLsa->getExpiringEventId());
+      chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(nlsa.getKey(),
                                                                nlsa.getLsSeqNo(),
                                                                timeToExpire));
       chkNameLsa->writeLog();
@@ -181,7 +180,7 @@
 }
 
 bool
-Lsdb::removeNameLsa(Nlsr& pnlsr, string& key)
+Lsdb::removeNameLsa(const ndn::Name& key)
 {
   std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
                                                  m_nameLsdb.end(),
@@ -189,16 +188,17 @@
   if (it != m_nameLsdb.end())
   {
     (*it).writeLog();
-    if ((*it).getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if ((*it).getOrigRouter() !=
+        m_nlsr.getConfParameter().getRouterPrefix())
     {
-      pnlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
-                                             (*it).getOrigRouter(), pnlsr);
-      for (std::list<string>::iterator nit = (*it).getNpl().getNameList().begin();
+      m_nlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
+                                              (*it).getOrigRouter());
+      for (std::list<ndn::Name>::iterator nit = (*it).getNpl().getNameList().begin();
            nit != (*it).getNpl().getNameList().end(); ++nit)
       {
-        if ((*nit) != pnlsr.getConfParameter().getRouterPrefix())
+        if ((*nit) != m_nlsr.getConfParameter().getRouterPrefix())
         {
-          pnlsr.getNamePrefixTable().removeEntry((*nit), (*it).getOrigRouter(), pnlsr);
+          m_nlsr.getNamePrefixTable().removeEntry((*nit), (*it).getOrigRouter());
         }
       }
     }
@@ -209,7 +209,7 @@
 }
 
 bool
-Lsdb::doesNameLsaExist(string key)
+Lsdb::doesNameLsaExist(const ndn::Name& key)
 {
   std::list<NameLsa>::iterator it = std::find_if(m_nameLsdb.begin(),
                                                  m_nameLsdb.end(),
@@ -236,27 +236,27 @@
 
 
 static bool
-corLsaCompareByKey(const CoordinateLsa& clsa, const string& key)
+corLsaCompareByKey(const CoordinateLsa& clsa, const ndn::Name& key)
 {
   return clsa.getKey() == key;
 }
 
 bool
-Lsdb::buildAndInstallOwnCoordinateLsa(Nlsr& pnlsr)
+Lsdb::buildAndInstallOwnCoordinateLsa()
 {
-  CoordinateLsa corLsa(pnlsr.getConfParameter().getRouterPrefix(),
-                       3,
-                       pnlsr.getSequencingManager().getCorLsaSeq() + 1,
-                       pnlsr.getConfParameter().getRouterDeadInterval(),
-                       pnlsr.getConfParameter().getCorR(),
-                       pnlsr.getConfParameter().getCorTheta());
-  pnlsr.getSequencingManager().increaseCorLsaSeq();
-  installCoordinateLsa(pnlsr, corLsa);
+  CoordinateLsa corLsa(m_nlsr.getConfParameter().getRouterPrefix(),
+                       "coordinate",
+                       m_nlsr.getSequencingManager().getCorLsaSeq() + 1,
+                       m_nlsr.getConfParameter().getRouterDeadInterval(),
+                       m_nlsr.getConfParameter().getCorR(),
+                       m_nlsr.getConfParameter().getCorTheta());
+  m_nlsr.getSequencingManager().increaseCorLsaSeq();
+  installCoordinateLsa(corLsa);
   return true;
 }
 
 CoordinateLsa*
-Lsdb::findCoordinateLsa(const string& key)
+Lsdb::findCoordinateLsa(const ndn::Name& key)
 {
   std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
                                                        m_corLsdb.end(),
@@ -269,7 +269,7 @@
 }
 
 bool
-Lsdb::isCoordinateLsaNew(const string& key, uint64_t seqNo)
+Lsdb::isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo)
 {
   CoordinateLsa* clsa = findCoordinateLsa(key);
   if (clsa != 0)
@@ -287,17 +287,16 @@
 }
 
 ndn::EventId
-Lsdb::scheduleCoordinateLsaExpiration(Nlsr& pnlsr, const string& key, int seqNo,
+Lsdb::scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
                                       int expTime)
 {
-  return pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
-                                            ndn::bind(&Lsdb::exprireOrRefreshCoordinateLsa,
-                                                      this, boost::ref(pnlsr),
-                                                      key, seqNo));
+  return m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
+                                             ndn::bind(&Lsdb::exprireOrRefreshCoordinateLsa,
+                                                       this, key, seqNo));
 }
 
 bool
-Lsdb::installCoordinateLsa(Nlsr& pnlsr, CoordinateLsa& clsa)
+Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
 {
   int timeToExpire = m_lsaRefreshTime;
   CoordinateLsa* chkCorLsa = findCoordinateLsa(clsa.getKey());
@@ -305,20 +304,20 @@
   {
     addCoordinateLsa(clsa);
     printCorLsdb(); //debugging purpose
-    if (clsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
     {
-      pnlsr.getNamePrefixTable().addEntry(clsa.getOrigRouter(),
-                                          clsa.getOrigRouter(), pnlsr);
+      m_nlsr.getNamePrefixTable().addEntry(clsa.getOrigRouter(),
+                                           clsa.getOrigRouter());
     }
-    if (pnlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
+    if (m_nlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
     {
-      pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+      m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
     }
-    if (clsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
     {
       timeToExpire = clsa.getLifeTime();
     }
-    scheduleCoordinateLsaExpiration(pnlsr, clsa.getKey(),
+    scheduleCoordinateLsaExpiration(clsa.getKey(),
                                     clsa.getLsSeqNo(), timeToExpire);
   }
   else
@@ -331,19 +330,17 @@
       {
         chkCorLsa->setCorRadius(clsa.getCorRadius());
         chkCorLsa->setCorTheta(clsa.getCorTheta());
-        if (pnlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
+        if (m_nlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
         {
-          pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+          m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
         }
       }
-      if (clsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+      if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
       {
         timeToExpire = clsa.getLifeTime();
       }
-      cancelScheduleLsaExpiringEvent(pnlsr,
-                                     chkCorLsa->getExpiringEventId());
-      chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(pnlsr,
-                                                                    clsa.getKey(),
+      cancelScheduleLsaExpiringEvent(chkCorLsa->getExpiringEventId());
+      chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(clsa.getKey(),
                                                                     clsa.getLsSeqNo(),
                                                                     timeToExpire));
     }
@@ -367,17 +364,18 @@
 }
 
 bool
-Lsdb::removeCoordinateLsa(Nlsr& pnlsr, const string& key)
+Lsdb::removeCoordinateLsa(const ndn::Name& key)
 {
   std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
                                                        m_corLsdb.end(),
                                                        bind(corLsaCompareByKey, _1, key));
   if (it != m_corLsdb.end())
   {
-    if ((*it).getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    if ((*it).getOrigRouter() !=
+        m_nlsr.getConfParameter().getRouterPrefix())
     {
-      pnlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
-                                             (*it).getOrigRouter(), pnlsr);
+      m_nlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
+                                              (*it).getOrigRouter());
     }
     m_corLsdb.erase(it);
     return true;
@@ -386,7 +384,7 @@
 }
 
 bool
-Lsdb::doesCoordinateLsaExist(const string& key)
+Lsdb::doesCoordinateLsaExist(const ndn::Name& key)
 {
   std::list<CoordinateLsa>::iterator it = std::find_if(m_corLsdb.begin(),
                                                        m_corLsdb.end(),
@@ -413,43 +411,44 @@
 // Adj LSA and LSDB related function starts here
 
 static bool
-adjLsaCompareByKey(AdjLsa& alsa, string& key)
+adjLsaCompareByKey(AdjLsa& alsa, const ndn::Name& key)
 {
   return alsa.getKey() == key;
 }
 
 
 void
-Lsdb::scheduledAdjLsaBuild(Nlsr& pnlsr)
+Lsdb::scheduledAdjLsaBuild()
 {
   cout << "scheduledAdjLsaBuild Called" << endl;
-  pnlsr.setIsBuildAdjLsaSheduled(0);
-  if (pnlsr.getAdjacencyList().isAdjLsaBuildable(pnlsr))
+  m_nlsr.setIsBuildAdjLsaSheduled(0);
+  if (m_nlsr.getAdjacencyList().isAdjLsaBuildable(m_nlsr))
   {
-    int adjBuildCount = pnlsr.getAdjBuildCount();
+    int adjBuildCount = m_nlsr.getAdjBuildCount();
     if (adjBuildCount > 0)
     {
-      if (pnlsr.getAdjacencyList().getNumOfActiveNeighbor() > 0)
+      if (m_nlsr.getAdjacencyList().getNumOfActiveNeighbor() > 0)
       {
-        buildAndInstallOwnAdjLsa(pnlsr);
+        buildAndInstallOwnAdjLsa();
       }
       else
       {
-        string key = pnlsr.getConfParameter().getRouterPrefix() + "/2";
-        removeAdjLsa(pnlsr, key);
-        pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+        ndn::Name key = m_nlsr.getConfParameter().getRouterPrefix();
+        key.append("adjacency");
+        removeAdjLsa(key);
+        m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
       }
-      pnlsr.setAdjBuildCount(pnlsr.getAdjBuildCount() - adjBuildCount);
+      m_nlsr.setAdjBuildCount(m_nlsr.getAdjBuildCount() - adjBuildCount);
     }
   }
   else
   {
-    pnlsr.setIsBuildAdjLsaSheduled(1);
-    int schedulingTime = pnlsr.getConfParameter().getInterestRetryNumber() *
-                         pnlsr.getConfParameter().getInterestResendTime();
-    pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(schedulingTime),
-                                       ndn::bind(&Lsdb::scheduledAdjLsaBuild,
-                                                 pnlsr.getLsdb(), boost::ref(pnlsr)));
+    m_nlsr.setIsBuildAdjLsaSheduled(1);
+    int schedulingTime = m_nlsr.getConfParameter().getInterestRetryNumber() *
+                         m_nlsr.getConfParameter().getInterestResendTime();
+    m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(schedulingTime),
+                                        ndn::bind(&Lsdb::scheduledAdjLsaBuild,
+                                                  this));
   }
 }
 
@@ -470,7 +469,7 @@
 }
 
 AdjLsa*
-Lsdb::findAdjLsa(const string key)
+Lsdb::findAdjLsa(const ndn::Name& key)
 {
   std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
                                                 m_adjLsdb.end(),
@@ -484,7 +483,7 @@
 
 
 bool
-Lsdb::isAdjLsaNew(string key, uint64_t seqNo)
+Lsdb::isAdjLsaNew(const ndn::Name& key, uint64_t seqNo)
 {
   AdjLsa*  adjLsaCheck = findAdjLsa(key);
   if (adjLsaCheck != 0)
@@ -503,29 +502,28 @@
 
 
 ndn::EventId
-Lsdb::scheduleAdjLsaExpiration(Nlsr& pnlsr, string key, int seqNo, int expTime)
+Lsdb::scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo, int expTime)
 {
-  return pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
-                                            ndn::bind(&Lsdb::exprireOrRefreshAdjLsa,
-                                                      this, boost::ref(pnlsr),
-                                                      key, seqNo));
+  return m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(expTime),
+                                             ndn::bind(&Lsdb::exprireOrRefreshAdjLsa,
+                                                       this, key, seqNo));
 }
 
 bool
-Lsdb::installAdjLsa(Nlsr& pnlsr, AdjLsa& alsa)
+Lsdb::installAdjLsa(AdjLsa& alsa)
 {
   int timeToExpire = m_lsaRefreshTime;
   AdjLsa* chkAdjLsa = findAdjLsa(alsa.getKey());
   if (chkAdjLsa == 0)
   {
     addAdjLsa(alsa);
-    alsa.addNptEntries(pnlsr);
-    pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
-    if (alsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+    alsa.addNptEntries(m_nlsr);
+    m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
+    if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
     {
       timeToExpire = alsa.getLifeTime();
     }
-    scheduleAdjLsaExpiration(pnlsr, alsa.getKey(),
+    scheduleAdjLsaExpiration(alsa.getKey(),
                              alsa.getLsSeqNo(), timeToExpire);
   }
   else
@@ -538,15 +536,14 @@
       {
         chkAdjLsa->getAdl().reset();
         chkAdjLsa->getAdl().addAdjacents(alsa.getAdl());
-        pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+        m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
       }
-      if (alsa.getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix())
+      if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix())
       {
         timeToExpire = alsa.getLifeTime();
       }
-      cancelScheduleLsaExpiringEvent(pnlsr, chkAdjLsa->getExpiringEventId());
-      chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(pnlsr,
-                                                             alsa.getKey(),
+      cancelScheduleLsaExpiringEvent(chkAdjLsa->getExpiringEventId());
+      chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(alsa.getKey(),
                                                              alsa.getLsSeqNo(),
                                                              timeToExpire));
     }
@@ -555,31 +552,32 @@
 }
 
 bool
-Lsdb::buildAndInstallOwnAdjLsa(Nlsr& pnlsr)
+Lsdb::buildAndInstallOwnAdjLsa()
 {
-  AdjLsa adjLsa(pnlsr.getConfParameter().getRouterPrefix(),
-                2,
-                pnlsr.getSequencingManager().getAdjLsaSeq() + 1,
-                pnlsr.getConfParameter().getRouterDeadInterval(),
-                pnlsr.getAdjacencyList().getNumOfActiveNeighbor(),
-                pnlsr.getAdjacencyList());
-  pnlsr.getSequencingManager().increaseAdjLsaSeq();
-  string lsaPrefix = pnlsr.getConfParameter().getChronosyncLsaPrefix() +
-                     pnlsr.getConfParameter().getRouterPrefix();
-  pnlsr.getSyncLogicHandler().publishRoutingUpdate(pnlsr.getSequencingManager(),
-                                                   lsaPrefix);
-  return pnlsr.getLsdb().installAdjLsa(pnlsr, adjLsa);
+  AdjLsa adjLsa(m_nlsr.getConfParameter().getRouterPrefix(),
+                "adjacency",
+                m_nlsr.getSequencingManager().getAdjLsaSeq() + 1,
+                m_nlsr.getConfParameter().getRouterDeadInterval(),
+                m_nlsr.getAdjacencyList().getNumOfActiveNeighbor(),
+                m_nlsr.getAdjacencyList());
+  m_nlsr.getSequencingManager().increaseAdjLsaSeq();
+  // publish routing update
+  ndn::Name lsaPrefix = m_nlsr.getConfParameter().getChronosyncLsaPrefix();
+  lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
+  m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
+                                                    lsaPrefix);
+  return installAdjLsa(adjLsa);
 }
 
 bool
-Lsdb::removeAdjLsa(Nlsr& pnlsr, string& key)
+Lsdb::removeAdjLsa(const ndn::Name& key)
 {
   std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
                                                 m_adjLsdb.end(),
                                                 bind(adjLsaCompareByKey, _1, key));
   if (it != m_adjLsdb.end())
   {
-    (*it).removeNptEntries(pnlsr);
+    (*it).removeNptEntries(m_nlsr);
     m_adjLsdb.erase(it);
     return true;
   }
@@ -587,7 +585,7 @@
 }
 
 bool
-Lsdb::doesAdjLsaExist(string key)
+Lsdb::doesAdjLsaExist(const ndn::Name& key)
 {
   std::list<AdjLsa>::iterator it = std::find_if(m_adjLsdb.begin(),
                                                 m_adjLsdb.end(),
@@ -618,7 +616,7 @@
 }
 
 void
-Lsdb::exprireOrRefreshNameLsa(Nlsr& pnlsr, string lsaKey, uint64_t seqNo)
+Lsdb::exprireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo)
 {
   cout << "Lsdb::exprireOrRefreshNameLsa Called " << endl;
   cout << "LSA Key : " << lsaKey << " Seq No: " << seqNo << endl;
@@ -633,30 +631,29 @@
         chkNameLsa->writeLog();
         cout << "Own Name LSA, so refreshing name LSA" << endl;
         chkNameLsa->setLsSeqNo(chkNameLsa->getLsSeqNo() + 1);
-        pnlsr.getSequencingManager().setNameLsaSeq(chkNameLsa->getLsSeqNo());
+        m_nlsr.getSequencingManager().setNameLsaSeq(chkNameLsa->getLsSeqNo());
         chkNameLsa->writeLog();
         // schedule refreshing event again
-        chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(pnlsr,
-                                                                 chkNameLsa->getKey(),
+        chkNameLsa->setExpiringEventId(scheduleNameLsaExpiration(chkNameLsa->getKey(),
                                                                  chkNameLsa->getLsSeqNo(),
                                                                  m_lsaRefreshTime));
         // publish routing update
-        string lsaPrefix = pnlsr.getConfParameter().getChronosyncLsaPrefix()
-                           + pnlsr.getConfParameter().getRouterPrefix();
-        pnlsr.getSyncLogicHandler().publishRoutingUpdate(pnlsr.getSequencingManager(),
-                                                         lsaPrefix);
+        ndn::Name lsaPrefix = m_nlsr.getConfParameter().getChronosyncLsaPrefix();
+        lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
+        m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
+                                                          lsaPrefix);
       }
       else
       {
         cout << "Other's Name LSA, so removing form LSDB" << endl;
-        removeNameLsa(pnlsr, lsaKey);
+        removeNameLsa(lsaKey);
       }
     }
   }
 }
 
 void
-Lsdb::exprireOrRefreshAdjLsa(Nlsr& pnlsr, string lsaKey, uint64_t seqNo)
+Lsdb::exprireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
 {
   cout << "Lsdb::exprireOrRefreshAdjLsa Called " << endl;
   cout << "LSA Key : " << lsaKey << " Seq No: " << seqNo << endl;
@@ -670,31 +667,30 @@
       {
         cout << "Own Adj LSA, so refreshing Adj LSA" << endl;
         chkAdjLsa->setLsSeqNo(chkAdjLsa->getLsSeqNo() + 1);
-        pnlsr.getSequencingManager().setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
+        m_nlsr.getSequencingManager().setAdjLsaSeq(chkAdjLsa->getLsSeqNo());
         // schedule refreshing event again
-        chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(pnlsr,
-                                                               chkAdjLsa->getKey(),
+        chkAdjLsa->setExpiringEventId(scheduleAdjLsaExpiration(chkAdjLsa->getKey(),
                                                                chkAdjLsa->getLsSeqNo(),
                                                                m_lsaRefreshTime));
         // publish routing update
-        string lsaPrefix = pnlsr.getConfParameter().getChronosyncLsaPrefix()
-                           + pnlsr.getConfParameter().getRouterPrefix();
-        pnlsr.getSyncLogicHandler().publishRoutingUpdate(pnlsr.getSequencingManager(),
-                                                         lsaPrefix);
+        ndn::Name lsaPrefix = m_nlsr.getConfParameter().getChronosyncLsaPrefix();
+        lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
+        m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
+                                                          lsaPrefix);
       }
       else
       {
         cout << "Other's Adj LSA, so removing form LSDB" << endl;
-        removeAdjLsa(pnlsr, lsaKey);
+        removeAdjLsa(lsaKey);
       }
       // schedule Routing table calculaiton
-      pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+      m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
     }
   }
 }
 
 void
-Lsdb::exprireOrRefreshCoordinateLsa(Nlsr& pnlsr, const string& lsaKey,
+Lsdb::exprireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
                                     uint64_t seqNo)
 {
   cout << "Lsdb::exprireOrRefreshCorLsa Called " << endl;
@@ -709,26 +705,26 @@
       {
         cout << "Own Cor LSA, so refreshing Cor LSA" << endl;
         chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
-        pnlsr.getSequencingManager().setCorLsaSeq(chkCorLsa->getLsSeqNo());
+        m_nlsr.getSequencingManager().setCorLsaSeq(chkCorLsa->getLsSeqNo());
         // schedule refreshing event again
-        chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(pnlsr,
-                                                                      chkCorLsa->getKey(),
-                                                                      chkCorLsa->getLsSeqNo(),
-                                                                      m_lsaRefreshTime));
+        chkCorLsa->setExpiringEventId(scheduleCoordinateLsaExpiration(
+                                        chkCorLsa->getKey(),
+                                        chkCorLsa->getLsSeqNo(),
+                                        m_lsaRefreshTime));
         // publish routing update
-        string lsaPrefix = pnlsr.getConfParameter().getChronosyncLsaPrefix()
-                           + pnlsr.getConfParameter().getRouterPrefix();
-        pnlsr.getSyncLogicHandler().publishRoutingUpdate(pnlsr.getSequencingManager(),
-                                                         lsaPrefix);
+        ndn::Name lsaPrefix = m_nlsr.getConfParameter().getChronosyncLsaPrefix();
+        lsaPrefix.append(m_nlsr.getConfParameter().getRouterPrefix());
+        m_nlsr.getSyncLogicHandler().publishRoutingUpdate(m_nlsr.getSequencingManager(),
+                                                          lsaPrefix);
       }
       else
       {
         cout << "Other's Cor LSA, so removing form LSDB" << endl;
-        removeCoordinateLsa(pnlsr, lsaKey);
+        removeCoordinateLsa(lsaKey);
       }
-      if (pnlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
+      if (m_nlsr.getConfParameter().getIsHyperbolicCalc() >= 1)
       {
-        pnlsr.getRoutingTable().scheduleRoutingTableCalculation(pnlsr);
+        m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
       }
     }
   }
@@ -736,6 +732,240 @@
 
 
 void
+Lsdb::expressInterest(const ndn::Name& interestName, uint32_t interestLifeTime)
+{
+  std::cout << "Expressing Interest :" << interestName << std::endl;
+  ndn::Interest interest(interestName);
+  interest.setInterestLifetime(ndn::time::seconds(interestLifeTime));
+  interest.setMustBeFresh(true);
+  m_nlsr.getNlsrFace().expressInterest(interest,
+                                       ndn::bind(&Lsdb::processContent,
+                                                 this, _1, _2),
+                                       ndn::bind(&Lsdb::processInterestTimedOut,
+                                                 this, _1));
+}
+
+void
+Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
+{
+  const ndn::Name& intName(interest.getName());
+  std::cout << "Interest recevied for LSA: " << intName << std::endl;
+  string chkString("LSA");
+  int32_t lsaPosition = util::getNameComponentPosition(interest.getName(),
+                                                       chkString);
+  if (lsaPosition >= 0)
+  {
+    std::string interestedLsType;
+    uint64_t interestedLsSeqNo;
+    ndn::Name origRouter = intName.getSubName(lsaPosition + 1,
+                                              interest.getName().size() - lsaPosition - 3);
+    interestedLsType  = intName[-2].toEscapedString();
+    interestedLsSeqNo = intName[-1].toNumber();
+    std::cout << "Router Name: " << origRouter << std::endl;
+    std::cout << "Ls Type    : " << interestedLsType << std::endl;
+    std::cout << "Ls Seq     : " << interestedLsSeqNo << endl;
+    std::cout << "Ls Type: " << interestedLsType << std::endl;
+    if (interestedLsType == "name")
+    {
+      processInterestForNameLsa(interest,
+                                origRouter.append(interestedLsType),
+                                interestedLsSeqNo);
+      return;
+    }
+    else if (interestedLsType == "adjacency")
+    {
+      processInterestForAdjacencyLsa(interest,
+                                     origRouter.append(interestedLsType),
+                                     interestedLsSeqNo);
+      return;
+    }
+    else if (interestedLsType == "coordinate")
+    {
+      processInterestForCoordinateLsa(interest,
+                                      origRouter.append(interestedLsType),
+                                      interestedLsSeqNo);
+      return;
+    }
+    else
+    {
+      cout << "Unrecognized LSA Type :(" << endl;
+    }
+  }
+}
+
+void
+Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
+                                const ndn::Name& lsaKey,
+                                uint32_t interestedlsSeqNo)
+{
+  NameLsa*  nameLsa = m_nlsr.getLsdb().findNameLsa(lsaKey);
+  if (nameLsa != 0)
+  {
+    if (nameLsa->getLsSeqNo() >= interestedlsSeqNo)
+    {
+      ndn::Data data(ndn::Name(interest.getName()).appendVersion());
+      data.setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
+      std::string content = nameLsa->getData();
+      data.setContent(reinterpret_cast<const uint8_t*>(content.c_str()),
+                      content.size());
+      m_keyChain.sign(data);
+      std::cout << ">> D: " << data << std::endl;
+      m_nlsr.getNlsrFace().put(data);
+    }
+  }
+}
+
+void
+Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
+                                     const ndn::Name& lsaKey,
+                                     uint32_t interestedlsSeqNo)
+{
+  AdjLsa* adjLsa = m_nlsr.getLsdb().findAdjLsa(lsaKey);
+  if (adjLsa != 0)
+  {
+    if (adjLsa->getLsSeqNo() >= interestedlsSeqNo)
+    {
+      ndn::Data data(ndn::Name(interest.getName()).appendVersion());
+      data.setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
+      std::string content = adjLsa->getData();
+      data.setContent(reinterpret_cast<const uint8_t*>(content.c_str()),
+                      content.size());
+      m_keyChain.sign(data);
+      std::cout << ">> D: " << data << std::endl;
+      m_nlsr.getNlsrFace().put(data);
+    }
+  }
+}
+
+void
+Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
+                                      const ndn::Name& lsaKey,
+                                      uint32_t interestedlsSeqNo)
+{
+  CoordinateLsa* corLsa = m_nlsr.getLsdb().findCoordinateLsa(lsaKey);
+  if (corLsa != 0)
+  {
+    if (corLsa->getLsSeqNo() >= interestedlsSeqNo)
+    {
+      ndn::Data data(ndn::Name(interest.getName()).appendVersion());
+      data.setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
+      std::string content = corLsa->getData();
+      data.setContent(reinterpret_cast<const uint8_t*>(content.c_str()),
+                      content.size());
+      m_keyChain.sign(data);
+      std::cout << ">> D: " << data << std::endl;
+      m_nlsr.getNlsrFace().put(data);
+    }
+  }
+}
+
+void
+Lsdb::processContent(const ndn::Interest& interest, const ndn::Data& data)
+{
+  const ndn::Name& dataName = data.getName();
+  std::cout << "Data received for name: " << dataName << std::endl;
+  string dataContent(reinterpret_cast<const char*>(data.getContent().value()));
+  string chkString("LSA");
+  int32_t lsaPosition = util::getNameComponentPosition(dataName, chkString);
+  if (lsaPosition >= 0)
+  {
+    std::string interestedLsType;
+    uint64_t interestedLsSeqNo;
+    ndn::Name origRouter = dataName.getSubName(lsaPosition + 1,
+                                               dataName.size() - lsaPosition - 4);
+    interestedLsType  = dataName[-3].toEscapedString();
+    interestedLsSeqNo = dataName[-2].toNumber();
+    std::cout << "Ls Type    : " << interestedLsType << std::endl;
+    std::cout << "Ls Seq     : " << interestedLsSeqNo << std::endl;
+    std::cout << "Ls Type: " << interestedLsType << std::endl;
+    if (interestedLsType == "name")
+    {
+      processContentNameLsa(origRouter.append(interestedLsType),
+                            interestedLsSeqNo, dataContent);
+      return;
+    }
+    else if (interestedLsType == "adjacency")
+    {
+      processContentAdjacencyLsa(origRouter.append(interestedLsType),
+                                 interestedLsSeqNo, dataContent);
+      return;
+    }
+    else if (interestedLsType == "coordinate")
+    {
+      processContentCoordinateLsa(origRouter.append(interestedLsType),
+                                  interestedLsSeqNo, dataContent);
+      return;
+    }
+    else
+    {
+      cout << "Unrecognized LSA Type :(" << endl;
+    }
+  }
+}
+
+void
+Lsdb::processContentNameLsa(const ndn::Name& lsaKey,
+                            uint32_t lsSeqNo, std::string& dataContent)
+{
+  if (isNameLsaNew(lsaKey, lsSeqNo))
+  {
+    NameLsa nameLsa;
+    if (nameLsa.initializeFromContent(dataContent))
+    {
+      installNameLsa(nameLsa);
+    }
+    else
+    {
+      std::cout << "LSA data decoding error :(" << std::endl;
+    }
+  }
+}
+
+void
+Lsdb::processContentAdjacencyLsa(const ndn::Name& lsaKey,
+                                 uint32_t lsSeqNo, std::string& dataContent)
+{
+  if (isAdjLsaNew(lsaKey, lsSeqNo))
+  {
+    AdjLsa adjLsa;
+    if (adjLsa.initializeFromContent(dataContent))
+    {
+      installAdjLsa(adjLsa);
+    }
+    else
+    {
+      std::cout << "LSA data decoding error :(" << std::endl;
+    }
+  }
+}
+
+void
+Lsdb::processContentCoordinateLsa(const ndn::Name& lsaKey,
+                                  uint32_t lsSeqNo, std::string& dataContent)
+{
+  if (isCoordinateLsaNew(lsaKey, lsSeqNo))
+  {
+    CoordinateLsa corLsa;
+    if (corLsa.initializeFromContent(dataContent))
+    {
+      installCoordinateLsa(corLsa);
+    }
+    else
+    {
+      std::cout << "LSA data decoding error :(" << std::endl;
+    }
+  }
+}
+
+void
+Lsdb::processInterestTimedOut(const ndn::Interest& interest)
+{
+  const ndn::Name& interestName(interest.getName());
+  cout << "Interest timed out for Name: " << interestName << endl;
+}
+
+
+void
 Lsdb::printAdjLsdb()
 {
   cout << "---------------Adj LSDB-------------------" << endl;
@@ -748,17 +978,17 @@
 
 //-----utility function -----
 bool
-Lsdb::doesLsaExist(string key, int lsType)
+Lsdb::doesLsaExist(const ndn::Name& key, const std::string& lsType)
 {
-  if (lsType == 1)
+  if (lsType == "name")
   {
     return doesNameLsaExist(key);
   }
-  else if (lsType == 2)
+  else if (lsType == "adjacency")
   {
     return doesAdjLsaExist(key);
   }
-  else if (lsType == 3)
+  else if (lsType == "coordinate")
   {
     return doesCoordinateLsaExist(key);
   }
diff --git a/src/lsdb.hpp b/src/lsdb.hpp
index 9e8c207..3ad3007 100644
--- a/src/lsdb.hpp
+++ b/src/lsdb.hpp
@@ -3,6 +3,7 @@
 
 #include <utility>
 #include <boost/cstdint.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
 
 #include "lsa.hpp"
 
@@ -12,70 +13,71 @@
 class Lsdb
 {
 public:
-  Lsdb()
-    : m_lsaRefreshTime(0)
+  Lsdb(Nlsr& nlsr)
+    : m_nlsr(nlsr)
+    , m_lsaRefreshTime(0)
   {
   }
 
 
   bool
-  doesLsaExist(std::string key, int lsType);
+  doesLsaExist(const ndn::Name& key, const std::string& lsType);
   // function related to Name LSDB
 
   bool
-  buildAndInstallOwnNameLsa(Nlsr& pnlsr);
+  buildAndInstallOwnNameLsa();
 
   NameLsa*
-  findNameLsa(const std::string key);
+  findNameLsa(const ndn::Name& key);
 
   bool
-  installNameLsa(Nlsr& pnlsr, NameLsa& nlsa);
+  installNameLsa(NameLsa& nlsa);
 
   bool
-  removeNameLsa(Nlsr& pnlsr, std::string& key);
+  removeNameLsa(const ndn::Name& key);
 
   bool
-  isNameLsaNew(std::string key, uint64_t seqNo);
+  isNameLsaNew(const ndn::Name& key, uint64_t seqNo);
 
   void
   printNameLsdb(); //debugging
 
   //function related to Cor LSDB
   bool
-  buildAndInstallOwnCoordinateLsa(Nlsr& pnlsr);
+  buildAndInstallOwnCoordinateLsa();
 
   CoordinateLsa*
-  findCoordinateLsa(const std::string& key);
+  findCoordinateLsa(const ndn::Name& key);
 
   bool
-  installCoordinateLsa(Nlsr& pnlsr, CoordinateLsa& clsa);
+  installCoordinateLsa(CoordinateLsa& clsa);
 
   bool
-  removeCoordinateLsa(Nlsr& pnlsr, const std::string& key);
+  removeCoordinateLsa(const ndn::Name& key);
 
   bool
-  isCoordinateLsaNew(const std::string& key, uint64_t seqNo);
+  isCoordinateLsaNew(const ndn::Name& key, uint64_t seqNo);
 
   void
   printCorLsdb(); //debugging
 
   //function related to Adj LSDB
   void
-  scheduledAdjLsaBuild(Nlsr& pnlsr);
+  scheduledAdjLsaBuild();
 
   bool
-  buildAndInstallOwnAdjLsa(Nlsr& pnlsr);
+  buildAndInstallOwnAdjLsa();
 
   bool
-  removeAdjLsa(Nlsr& pnlsr, std::string& key);
+  removeAdjLsa(const ndn::Name& key);
 
   bool
-  isAdjLsaNew(std::string key, uint64_t seqNo);
+  isAdjLsaNew(const ndn::Name& key, uint64_t seqNo);
   bool
-  installAdjLsa(Nlsr& pnlsr, AdjLsa& alsa);
+  installAdjLsa(AdjLsa& alsa);
 
   AdjLsa*
-  findAdjLsa(std::string key);
+  findAdjLsa(const ndn::Name& key);
 
   std::list<AdjLsa>&
   getAdjLsdb();
@@ -95,46 +97,87 @@
   addNameLsa(NameLsa& nlsa);
 
   bool
-  doesNameLsaExist(std::string key);
+  doesNameLsaExist(const ndn::Name& key);
 
 
   bool
   addCoordinateLsa(CoordinateLsa& clsa);
 
   bool
-  doesCoordinateLsaExist(const std::string& key);
+  doesCoordinateLsaExist(const ndn::Name& key);
 
   bool
   addAdjLsa(AdjLsa& alsa);
 
   bool
-  doesAdjLsaExist(std::string key);
+  doesAdjLsaExist(const ndn::Name& key);
 
   ndn::EventId
-  scheduleNameLsaExpiration(Nlsr& pnlsr, std::string key, int seqNo, int expTime);
+  scheduleNameLsaExpiration(const ndn::Name& key, int seqNo, int expTime);
 
   void
-  exprireOrRefreshNameLsa(Nlsr& pnlsr, std::string lsaKey, uint64_t seqNo);
+  exprireOrRefreshNameLsa(const ndn::Name& lsaKey, uint64_t seqNo);
 
   ndn::EventId
-  scheduleAdjLsaExpiration(Nlsr& pnlsr, std::string key, int seqNo, int expTime);
+  scheduleAdjLsaExpiration(const ndn::Name& key, int seqNo, int expTime);
 
   void
-  exprireOrRefreshAdjLsa(Nlsr& pnlsr, std::string lsaKey, uint64_t seqNo);
+  exprireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo);
 
   ndn::EventId
-  scheduleCoordinateLsaExpiration(Nlsr& pnlsr, const std::string& key, int seqNo,
+  scheduleCoordinateLsaExpiration(const ndn::Name& key, int seqNo,
                                   int expTime);
 
   void
-  exprireOrRefreshCoordinateLsa(Nlsr& pnlsr, const std::string& lsaKey,
+  exprireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
                                 uint64_t seqNo);
+public:
+  void
+  expressInterest(const ndn::Name& interestName, uint32_t interestLifeTime);
 
+  void
+  processInterest(const ndn::Name& name, const ndn::Interest& interest);
 
 private:
   void
-  cancelScheduleLsaExpiringEvent(Nlsr& pnlsr, ndn::EventId eid);
+  processInterestForNameLsa(const ndn::Interest& interest,
+                            const ndn::Name& lsaKey,
+                            uint32_t interestedlsSeqNo);
 
+  void
+  processInterestForAdjacencyLsa(const ndn::Interest& interest,
+                                 const ndn::Name& lsaKey,
+                                 uint32_t interestedlsSeqNo);
+
+  void
+  processInterestForCoordinateLsa(const ndn::Interest& interest,
+                                  const ndn::Name& lsaKey,
+                                  uint32_t interestedlsSeqNo);
+
+  void
+  processContent(const ndn::Interest& interest, const ndn::Data& data);
+
+  void
+  processContentNameLsa(const ndn::Name& lsaKey,
+                        uint32_t lsSeqNo, std::string& dataContent);
+
+  void
+  processContentAdjacencyLsa(const ndn::Name& lsaKey,
+                             uint32_t lsSeqNo, std::string& dataContent);
+
+  void
+  processContentCoordinateLsa(const ndn::Name& lsaKey,
+                              uint32_t lsSeqNo, std::string& dataContent);
+
+  void
+  processInterestTimedOut(const ndn::Interest& interest);
+
+private:
+  void
+  cancelScheduleLsaExpiringEvent(ndn::EventId eid);
+
+  Nlsr& m_nlsr;
+  ndn::KeyChain m_keyChain;
   std::list<NameLsa> m_nameLsdb;
   std::list<AdjLsa> m_adjLsdb;
   std::list<CoordinateLsa> m_corLsdb;
diff --git a/src/main.cpp b/src/main.cpp
index d7657fa..59829b1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -66,9 +66,9 @@
   try {
     nlsr.startEventLoop();
   }
-  catch (std::exception& e){
+  catch (std::exception& e) {
     std::cerr << "ERROR: " << e.what() << std::endl;
-    nlsr.getFib().clean(nlsr);
+    nlsr.getFib().clean();
   }
   return EXIT_SUCCESS;
 }
diff --git a/src/name-prefix-list.cpp b/src/name-prefix-list.cpp
index 496a0e7..c8d9285 100644
--- a/src/name-prefix-list.cpp
+++ b/src/name-prefix-list.cpp
@@ -18,17 +18,18 @@
 }
 
 static bool
-nameCompare(const string& s1, const string& s2)
+nameCompare(const ndn::Name& name1, const ndn::Name& name2)
 {
-  return s1 == s2;
+  return name1 == name2;
 }
 
 int32_t
-NamePrefixList::insert(const string& name)
+NamePrefixList::insert(const ndn::Name& name)
 {
-  std::list<string>::iterator it = std::find_if(m_nameList.begin(),
-                                                m_nameList.end(),
-                                                ndn::bind(&nameCompare, _1 , name));
+  std::list<ndn::Name>::iterator it = std::find_if(m_nameList.begin(),
+                                                   m_nameList.end(),
+                                                   ndn::bind(&nameCompare, _1 ,
+                                                             ndn::cref(name)));
   if (it != m_nameList.end())
   {
     return -1;
@@ -38,11 +39,12 @@
 }
 
 int32_t
-NamePrefixList::remove(const string& name)
+NamePrefixList::remove(const ndn::Name& name)
 {
-  std::list<string>::iterator it = std::find_if(m_nameList.begin(),
-                                                m_nameList.end(),
-                                                ndn::bind(&nameCompare, _1 , name));
+  std::list<ndn::Name>::iterator it = std::find_if(m_nameList.begin(),
+                                                   m_nameList.end(),
+                                                   ndn::bind(&nameCompare, _1 ,
+                                                   ndn::cref(name)));
   if (it != m_nameList.end())
   {
     m_nameList.erase(it);
@@ -60,7 +62,7 @@
 NamePrefixList::print()
 {
   int i = 1;
-  for (std::list<string>::iterator it = m_nameList.begin();
+  for (std::list<ndn::Name>::iterator it = m_nameList.begin();
        it != m_nameList.end();
        it++)
   {
diff --git a/src/name-prefix-list.hpp b/src/name-prefix-list.hpp
index dda4508..7b7eba1 100644
--- a/src/name-prefix-list.hpp
+++ b/src/name-prefix-list.hpp
@@ -4,6 +4,7 @@
 #include <list>
 #include <string>
 #include <boost/cstdint.hpp>
+#include <ndn-cxx/name.hpp>
 
 
 namespace nlsr {
@@ -16,21 +17,21 @@
   ~NamePrefixList();
 
   int32_t
-  insert(const std::string& name);
+  insert(const ndn::Name& name);
 
   int32_t
-  remove(const std::string& name);
+  remove(const ndn::Name& name);
 
   void
   sort();
 
-  int32_t
+  size_t
   getSize()
   {
     return m_nameList.size();
   }
 
-  std::list<std::string>&
+  std::list<ndn::Name>&
   getNameList()
   {
     return m_nameList;
@@ -40,7 +41,7 @@
   print();
 
 private:
-  std::list<std::string> m_nameList;
+  std::list<ndn::Name> m_nameList;
 
 };
 
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index 22e7dc8..91b4c25 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -20,11 +20,25 @@
 
 
 void
-Nlsr::setInterestFilter(const string& name)
+Nlsr::setInfoInterestFilter()
 {
+  ndn::Name name(m_confParam.getRouterPrefix());
   getNlsrFace().setInterestFilter(name,
-                                  ndn::bind(&InterestManager::processInterest,
-                                            &m_interestManager, _1, _2),
+                                  ndn::bind(&HelloProtocol::processInterest,
+                                            &m_helloProtocol, _1, _2),
+                                  ndn::bind(&Nlsr::registrationFailed, this, _1));
+}
+
+void
+Nlsr::setLsaInterestFilter()
+{
+  // ndn::Name name(m_confParam.getChronosyncLsaPrefix() +
+  //                m_confParam.getRouterPrefix());
+  ndn::Name name = m_confParam.getChronosyncLsaPrefix();
+  name.append(m_confParam.getRouterPrefix());
+  getNlsrFace().setInterestFilter(name,
+                                  ndn::bind(&Lsdb::processInterest,
+                                            &m_nlsrLsdb, _1, _2),
                                   ndn::bind(&Nlsr::registrationFailed, this, _1));
 }
 
@@ -33,12 +47,8 @@
 {
   m_confParam.buildRouterPrefix();
   m_nlsrLsdb.setLsaRefreshTime(m_confParam.getLsaRefreshTime());
-  m_nlsrLsdb.setThisRouterPrefix(m_confParam.getRouterPrefix());
+  m_nlsrLsdb.setThisRouterPrefix(m_confParam.getRouterPrefix().toUri());
   m_fib.setEntryRefreshTime(2 * m_confParam.getLsaRefreshTime());
-  // if (!m_km.initialize(m_confParam))
-  // {
-  //   std::cerr << "Can not initiate/load certificate" << endl;
-  // }
   m_sequencingManager.setSeqFileName(m_confParam.getSeqFileDir());
   m_sequencingManager.initiateSeqNoFromFile();
   /* debugging purpose start */
@@ -46,16 +56,14 @@
   m_adjacencyList.print();
   m_namePrefixList.print();
   /* debugging purpose end */
-  m_nlsrLsdb.buildAndInstallOwnNameLsa(boost::ref(*this));
-  m_nlsrLsdb.buildAndInstallOwnCoordinateLsa(boost::ref(*this));
-  setInterestFilter(m_confParam.getRouterPrefix());
-  setInterestFilter(m_confParam.getChronosyncLsaPrefix() +
-                    m_confParam.getRouterPrefix());
-  setInterestFilter(m_confParam.getRootKeyPrefix());
-  m_syncLogicHandler.setSyncPrefix(m_confParam.getChronosyncSyncPrefix());
+  m_nlsrLsdb.buildAndInstallOwnNameLsa();
+  m_nlsrLsdb.buildAndInstallOwnCoordinateLsa();
+  setInfoInterestFilter();
+  setLsaInterestFilter();
+  m_syncLogicHandler.setSyncPrefix(m_confParam.getChronosyncSyncPrefix().toUri());
   m_syncLogicHandler.createSyncSocket(boost::ref(*this));
-  // m_slh.publishKeyUpdate(m_km);
-  m_interestManager.scheduleInfoInterest(10);
+  //m_interestManager.scheduleInfoInterest(10);
+  m_helloProtocol.scheduleInterest(10);
 }
 
 void
diff --git a/src/nlsr.hpp b/src/nlsr.hpp
index 0e59adc..6bf45bd 100644
--- a/src/nlsr.hpp
+++ b/src/nlsr.hpp
@@ -11,15 +11,13 @@
 #include "conf-parameter.hpp"
 #include "adjacency-list.hpp"
 #include "name-prefix-list.hpp"
-#include "communication/interest-manager.hpp"
-#include "communication/data-manager.hpp"
 #include "lsdb.hpp"
 #include "sequencing-manager.hpp"
 #include "route/routing-table.hpp"
 #include "route/name-prefix-table.hpp"
 #include "route/fib.hpp"
-// #include "security/key-manager.hpp"
 #include "communication/sync-logic-handler.hpp"
+#include "hello-protocol.hpp"
 
 
 namespace nlsr {
@@ -42,28 +40,29 @@
     , m_confParam()
     , m_adjacencyList()
     , m_namePrefixList()
-    , m_interestManager(*this)
-    , m_dataManager(*this)
     , m_sequencingManager()
-    // , m_km()
     , m_isDaemonProcess(false)
     , m_configFileName("nlsr.conf")
-    , m_nlsrLsdb()
+    , m_nlsrLsdb(*this)
     , m_adjBuildCount(0)
     , m_isBuildAdjLsaSheduled(false)
     , m_isRouteCalculationScheduled(false)
     , m_isRoutingTableCalculating(false)
     , m_routingTable()
-    , m_namePrefixTable()
-    , m_fib(m_nlsrFace)
+    , m_fib(*this, m_nlsrFace)
+    , m_namePrefixTable(*this)
     , m_syncLogicHandler(m_nlsrFace.getIoService())
+    , m_helloProtocol(*this)
   {}
 
   void
   registrationFailed(const ndn::Name& name);
 
   void
-  setInterestFilter(const std::string& name);
+  setInfoInterestFilter();
+
+  void
+  setLsaInterestFilter();
 
   void
   startEventLoop();
@@ -125,25 +124,6 @@
     return m_nlsrFace;
   }
 
-  // KeyManager&
-  // getKeyManager()
-  // {
-  //   return m_km;
-  // }
-
-
-  InterestManager&
-  getInterestManager()
-  {
-    return m_interestManager;
-  }
-
-  DataManager&
-  getDataManager()
-  {
-    return m_dataManager;
-  }
-
   SequencingManager&
   getSequencingManager()
   {
@@ -256,10 +236,7 @@
   ConfParameter m_confParam;
   AdjacencyList m_adjacencyList;
   NamePrefixList m_namePrefixList;
-  InterestManager m_interestManager;
-  DataManager m_dataManager;
   SequencingManager m_sequencingManager;
-  // KeyManager m_km;
   bool m_isDaemonProcess;
   std::string m_configFileName;
   Lsdb m_nlsrLsdb;
@@ -268,10 +245,11 @@
   bool m_isRouteCalculationScheduled;
   bool m_isRoutingTableCalculating;
   RoutingTable m_routingTable;
-  NamePrefixTable m_namePrefixTable;
   Fib m_fib;
+  NamePrefixTable m_namePrefixTable;
   SyncLogicHandler m_syncLogicHandler;
   int32_t m_apiPort;
+  HelloProtocol m_helloProtocol;
 };
 
 } //namespace nlsr
diff --git a/src/route/fib-entry.hpp b/src/route/fib-entry.hpp
index 88de53e..71ecb04 100644
--- a/src/route/fib-entry.hpp
+++ b/src/route/fib-entry.hpp
@@ -23,7 +23,7 @@
   {
   }
 
-  FibEntry(const std::string& name)
+  FibEntry(const ndn::Name& name)
     : m_timeToRefresh(0)
     , m_seqNo(0)
     , m_nexthopList()
@@ -31,7 +31,7 @@
     m_name = name;
   }
 
-  const std::string&
+  const ndn::Name&
   getName() const
   {
     return m_name;
@@ -83,7 +83,7 @@
   isEqualNextHops(NexthopList& nhlOther);
 
 private:
-  std::string m_name;
+  ndn::Name m_name;
   int32_t m_timeToRefresh;
   ndn::EventId m_expiringEventId;
   int32_t m_seqNo;
diff --git a/src/route/fib.cpp b/src/route/fib.cpp
index 1272ab1..fc823c1 100644
--- a/src/route/fib.cpp
+++ b/src/route/fib.cpp
@@ -14,32 +14,31 @@
 using namespace ndn;
 
 static bool
-fibEntryNameCompare(const FibEntry& fibEntry, const string& name)
+fibEntryNameCompare(const FibEntry& fibEntry, const ndn::Name& name)
 {
   return fibEntry.getName() == name ;
 }
 
 void
-Fib::cancelScheduledExpiringEvent(Nlsr& pnlsr, EventId eid)
+Fib::cancelScheduledExpiringEvent(EventId eid)
 {
-  pnlsr.getScheduler().cancelEvent(eid);
+  m_nlsr.getScheduler().cancelEvent(eid);
 }
 
 
 ndn::EventId
-Fib::scheduleEntryRefreshing(Nlsr& pnlsr, const string& name, int32_t feSeqNum,
+Fib::scheduleEntryRefreshing(const ndn::Name& name, int32_t feSeqNum,
                              int32_t refreshTime)
 {
   std::cout << "Fib::scheduleEntryRefreshing Called" << std::endl;
   std::cout << "Name: " << name << " Seq Num: " << feSeqNum << std::endl;
-  return pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(refreshTime),
-                                            ndn::bind(&Fib::refreshEntry, this,
-                                                      boost::ref(pnlsr), 
-                                                      name, feSeqNum));
+  return m_nlsr.getScheduler().scheduleEvent(ndn::time::seconds(refreshTime),
+                                             ndn::bind(&Fib::refreshEntry, this,
+                                                       name, feSeqNum));
 }
 
 void
-Fib::refreshEntry(Nlsr& nlsr, const string& name, int32_t feSeqNum)
+Fib::refreshEntry(const ndn::Name& name, int32_t feSeqNum)
 {
   std::cout << "Fib::refreshEntry Called" << std::endl;
   std::cout << "Name: " << name << " Seq Num: " << feSeqNum << std::endl;
@@ -53,26 +52,24 @@
     {
       std::cout << "Refreshing the FIB entry" << std::endl;
       for (std::list<NextHop>::iterator nhit =
-           (*it).getNexthopList().getNextHops().begin();
-         nhit != (*it).getNexthopList().getNextHops().end(); nhit++)
+             (*it).getNexthopList().getNextHops().begin();
+           nhit != (*it).getNexthopList().getNextHops().end(); nhit++)
       {
         // add entry to NDN-FIB
-        registerPrefixInNfd(it->getName(), nhit->getConnectingFace(), std::ceil(nhit->getRouteCost()));
+        registerPrefixInNfd(it->getName(), nhit->getConnectingFace(),
+                            std::ceil(nhit->getRouteCost()));
       }
-      
       // increase sequence number and schedule refresh again
       it->setSeqNo(feSeqNum + 1);
-      it->setExpiringEventId(scheduleEntryRefreshing(nlsr,
-                                                     it->getName() ,
-                                                     it->getSeqNo(), 
+      it->setExpiringEventId(scheduleEntryRefreshing(it->getName() ,
+                                                     it->getSeqNo(),
                                                      m_refreshTime));
-      
     }
   }
 }
 
 void
-Fib::remove(Nlsr& pnlsr, const std::string& name)
+Fib::remove(const ndn::Name& name)
 {
   std::list<FibEntry>::iterator it = std::find_if(m_table.begin(),
                                                   m_table.end(),
@@ -84,14 +81,14 @@
          nhit != (*it).getNexthopList().getNextHops().end(); nhit++)
     {
       //remove entry from NDN-FIB
-      if (!pnlsr.getAdjacencyList().isNeighbor(it->getName()))
+      if (!m_nlsr.getAdjacencyList().isNeighbor(it->getName()))
       {
         unregisterPrefixFromNfd(it->getName(), nhit->getConnectingFace());
       }
       else
       {
-        if(pnlsr.getAdjacencyList().getAdjacent(it->getName()).getConnectingFace() != 
-           nhit->getConnectingFace())
+        if (m_nlsr.getAdjacencyList().getAdjacent(it->getName()).getConnectingFace() !=
+            nhit->getConnectingFace())
         {
           unregisterPrefixFromNfd(it->getName(), nhit->getConnectingFace());
         }
@@ -99,19 +96,19 @@
     }
     std::cout << "Cancellling Scheduled event" << std::endl;
     std::cout << "Name: " << name << "Seq num: " << it->getSeqNo() << std::endl;
-    cancelScheduledExpiringEvent(pnlsr, (*it).getExpiringEventId());
+    cancelScheduledExpiringEvent((*it).getExpiringEventId());
     m_table.erase(it);
   }
 }
 
 
 void
-Fib::update(Nlsr& pnlsr, const string& name, NexthopList& nextHopList)
+Fib::update(const ndn::Name& name, NexthopList& nextHopList)
 {
   std::cout << "Fib::updateFib Called" << std::endl;
   int startFace = 0;
   int endFace = getNumberOfFacesForName(nextHopList,
-                                        pnlsr.getConfParameter().getMaxFacesPerPrefix());
+                                        m_nlsr.getConfParameter().getMaxFacesPerPrefix());
   std::list<FibEntry>::iterator it = std::find_if(m_table.begin(),
                                                   m_table.end(),
                                                   bind(&fibEntryNameCompare, _1, name));
@@ -127,13 +124,13 @@
       {
         newEntry.getNexthopList().addNextHop((*nhit));
         //Add entry to NDN-FIB
-        registerPrefixInNfd(name, nhit->getConnectingFace(), std::ceil(nhit->getRouteCost()));
+        registerPrefixInNfd(name, nhit->getConnectingFace(),
+                            std::ceil(nhit->getRouteCost()));
       }
       newEntry.getNexthopList().sort();
       newEntry.setTimeToRefresh(m_refreshTime);
       newEntry.setSeqNo(1);
-      newEntry.setExpiringEventId(scheduleEntryRefreshing(pnlsr,
-                                                          name , 1, m_refreshTime));
+      newEntry.setExpiringEventId(scheduleEntryRefreshing(name , 1, m_refreshTime));
       m_table.push_back(newEntry);
     }
   }
@@ -148,8 +145,9 @@
         std::list<NextHop> nhl = nextHopList.getNextHops();
         std::list<NextHop>::iterator nhit = nhl.begin();
         // Add first Entry to NDN-FIB
-        registerPrefixInNfd(name, nhit->getConnectingFace(), std::ceil(nhit->getRouteCost()));
-        removeHop(pnlsr, it->getNexthopList(), nhit->getConnectingFace(), name);
+        registerPrefixInNfd(name, nhit->getConnectingFace(),
+                            std::ceil(nhit->getRouteCost()));
+        removeHop(it->getNexthopList(), nhit->getConnectingFace(), name);
         it->getNexthopList().reset();
         it->getNexthopList().addNextHop((*nhit));
         ++startFace;
@@ -158,21 +156,21 @@
         {
           it->getNexthopList().addNextHop((*nhit));
           //Add Entry to NDN_FIB
-          registerPrefixInNfd(name, nhit->getConnectingFace(), std::ceil(nhit->getRouteCost()));
+          registerPrefixInNfd(name, nhit->getConnectingFace(),
+                              std::ceil(nhit->getRouteCost()));
         }
       }
       it->setTimeToRefresh(m_refreshTime);
       std::cout << "Cancellling Scheduled event" << std::endl;
       std::cout << "Name: " << name << "Seq num: " << it->getSeqNo() << std::endl;
-      cancelScheduledExpiringEvent(pnlsr, it->getExpiringEventId());
+      cancelScheduledExpiringEvent(it->getExpiringEventId());
       it->setSeqNo(it->getSeqNo() + 1);
-      (*it).setExpiringEventId(scheduleEntryRefreshing(pnlsr,
-                                                       it->getName() ,
+      (*it).setExpiringEventId(scheduleEntryRefreshing(it->getName() ,
                                                        it->getSeqNo(), m_refreshTime));
     }
     else
     {
-      remove(pnlsr, name);
+      remove(name);
     }
   }
 }
@@ -180,27 +178,28 @@
 
 
 void
-Fib::clean(Nlsr& pnlsr)
+Fib::clean()
 {
   for (std::list<FibEntry>::iterator it = m_table.begin(); it != m_table.end();
        ++it)
   {
     std::cout << "Cancellling Scheduled event" << std::endl;
-    std::cout << "Name: " << it->getName() << "Seq num: " << it->getSeqNo() << std::endl;
-    cancelScheduledExpiringEvent(pnlsr, (*it).getExpiringEventId());
+    std::cout << "Name: " << it->getName() << "Seq num: " << it->getSeqNo() <<
+              std::endl;
+    cancelScheduledExpiringEvent((*it).getExpiringEventId());
     for (std::list<NextHop>::iterator nhit =
            (*it).getNexthopList().getNextHops().begin();
          nhit != (*it).getNexthopList().getNextHops().end(); nhit++)
     {
       //Remove entry from NDN-FIB
-      if (!pnlsr.getAdjacencyList().isNeighbor(it->getName()))
+      if (!m_nlsr.getAdjacencyList().isNeighbor(it->getName()))
       {
         unregisterPrefixFromNfd(it->getName(), nhit->getConnectingFace());
       }
       else
       {
-        if(pnlsr.getAdjacencyList().getAdjacent(it->getName()).getConnectingFace() != 
-           nhit->getConnectingFace())
+        if (m_nlsr.getAdjacencyList().getAdjacent(it->getName()).getConnectingFace() !=
+            nhit->getConnectingFace())
         {
           unregisterPrefixFromNfd(it->getName(), nhit->getConnectingFace());
         }
@@ -214,7 +213,8 @@
 }
 
 int
-Fib::getNumberOfFacesForName(NexthopList& nextHopList, uint32_t maxFacesPerPrefix)
+Fib::getNumberOfFacesForName(NexthopList& nextHopList,
+                             uint32_t maxFacesPerPrefix)
 {
   int endFace = 0;
   if ((maxFacesPerPrefix == 0) || (nextHopList.getSize() <= maxFacesPerPrefix))
@@ -229,8 +229,8 @@
 }
 
 void
-Fib::removeHop(Nlsr& pnlsr, NexthopList& nl, uint32_t doNotRemoveHopFaceId,
-               const std::string& name)
+Fib::removeHop(NexthopList& nl, uint32_t doNotRemoveHopFaceId,
+               const ndn::Name& name)
 {
   for (std::list<NextHop>::iterator it = nl.getNextHops().begin();
        it != nl.getNextHops().end();   ++it)
@@ -238,14 +238,14 @@
     if (it->getConnectingFace() != doNotRemoveHopFaceId)
     {
       //Remove FIB Entry from NDN-FIB
-      if (!pnlsr.getAdjacencyList().isNeighbor(name))
+      if (!m_nlsr.getAdjacencyList().isNeighbor(name))
       {
         unregisterPrefixFromNfd(name, it->getConnectingFace());
       }
       else
       {
-        if(pnlsr.getAdjacencyList().getAdjacent(name).getConnectingFace() != 
-           it->getConnectingFace())
+        if (m_nlsr.getAdjacencyList().getAdjacent(name).getConnectingFace() !=
+            it->getConnectingFace())
         {
           unregisterPrefixFromNfd(name, it->getConnectingFace());
         }
@@ -255,32 +255,31 @@
 }
 
 void
-Fib::registerPrefixInNfd(const std::string& namePrefix, uint64_t faceId, uint64_t faceCost)
+Fib::registerPrefixInNfd(const ndn::Name& namePrefix, uint64_t faceId,
+                         uint64_t faceCost)
 {
   ndn::nfd::ControlParameters controlParameters;
   controlParameters
-    .setName(namePrefix)
-    .setCost(faceCost)
-    .setFaceId(faceId)
-    .setExpirationPeriod(ndn::time::milliseconds(m_refreshTime*1000))
-    .setOrigin(128);
-
+  .setName(namePrefix)
+  .setCost(faceCost)
+  .setFaceId(faceId)
+  .setExpirationPeriod(ndn::time::milliseconds(m_refreshTime * 1000))
+  .setOrigin(128);
   m_controller.start<ndn::nfd::RibRegisterCommand>(controlParameters,
                                                    ndn::bind(&Fib::onSuccess, this, _1,
                                                              "Successful in name registration"),
                                                    ndn::bind(&Fib::onFailure, this, _1, _2,
                                                              "Failed in name registration"));
 }
-  
+
 void
-Fib::unregisterPrefixFromNfd(const std::string& namePrefix, uint64_t faceId)
+Fib::unregisterPrefixFromNfd(const ndn::Name& namePrefix, uint64_t faceId)
 {
   ndn::nfd::ControlParameters controlParameters;
   controlParameters
-    .setName(namePrefix)
-    .setFaceId(faceId)
-    .setOrigin(128);
-
+  .setName(namePrefix)
+  .setFaceId(faceId)
+  .setOrigin(128);
   m_controller.start<ndn::nfd::RibUnregisterCommand>(controlParameters,
                                                      ndn::bind(&Fib::onSuccess, this, _1,
                                                                "Successful in unregistering name"),
@@ -289,13 +288,15 @@
 }
 
 void
-Fib::onSuccess(const ndn::nfd::ControlParameters& commandSuccessResult, const std::string& message)
+Fib::onSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
+               const std::string& message)
 {
   std::cout << message << ": " << commandSuccessResult << std::endl;
 }
 
 void
-Fib::onFailure(uint32_t code, const std::string& error, const std::string& message)
+Fib::onFailure(uint32_t code, const std::string& error,
+               const std::string& message)
 {
   std::cout << message << ": " << error << " (code: " << code << ")";
 }
diff --git a/src/route/fib.hpp b/src/route/fib.hpp
index 2a90fc1..0f58351 100644
--- a/src/route/fib.hpp
+++ b/src/route/fib.hpp
@@ -16,8 +16,9 @@
 class Fib
 {
 public:
-  Fib(ndn::Face& face)
-    : m_table()
+  Fib(Nlsr& nlsr, ndn::Face& face)
+    : m_nlsr(nlsr)
+    , m_table()
     , m_refreshTime(0)
     , m_controller(face)
   {
@@ -27,13 +28,13 @@
   }
 
   void
-  remove(Nlsr& pnlsr, const std::string& name);
+  remove(const ndn::Name& name);
 
   void
-  update(Nlsr& pnlsr, const std::string& name, NexthopList& nextHopList);
+  update(const ndn::Name& name, NexthopList& nextHopList);
 
   void
-  clean(Nlsr& pnlsr);
+  clean();
 
   void
   setEntryRefreshTime(int32_t fert)
@@ -46,35 +47,38 @@
 
 private:
   void
-  removeHop(Nlsr& pnlsr, NexthopList& nl, uint32_t doNotRemoveHopFaceId,
-            const std::string& name);
+  removeHop(NexthopList& nl, uint32_t doNotRemoveHopFaceId,
+            const ndn::Name& name);
 
   int
   getNumberOfFacesForName(NexthopList& nextHopList, uint32_t maxFacesPerPrefix);
 
   ndn::EventId
-  scheduleEntryRefreshing(Nlsr& pnlsr, const std::string& name, int32_t feSeqNum,
+  scheduleEntryRefreshing(const ndn::Name& name, int32_t feSeqNum,
                           int32_t refreshTime);
 
   void
-  cancelScheduledExpiringEvent(Nlsr& pnlsr, ndn::EventId eid);
+  cancelScheduledExpiringEvent(ndn::EventId eid);
 
   void
-  refreshEntry(Nlsr& nlsr, const std::string& name, int32_t feSeqNum);
+  refreshEntry(const ndn::Name& name, int32_t feSeqNum);
 
   void
-  registerPrefixInNfd(const std::string& namePrefix, uint64_t faceId, uint64_t faceCost);
+  registerPrefixInNfd(const ndn::Name& namePrefix, uint64_t faceId,
+                      uint64_t faceCost);
 
   void
-  unregisterPrefixFromNfd(const std::string& namePrefix, uint64_t faceId);
-  
+  unregisterPrefixFromNfd(const ndn::Name& namePrefix, uint64_t faceId);
+
   void
-  onSuccess(const ndn::nfd::ControlParameters& commandSuccessResult, const std::string& message);
+  onSuccess(const ndn::nfd::ControlParameters& commandSuccessResult,
+            const std::string& message);
 
   void
   onFailure(uint32_t code, const std::string& error, const std::string& message);
 
 private:
+  Nlsr& m_nlsr;
   std::list<FibEntry> m_table;
   int32_t m_refreshTime;
   ndn::nfd::Controller m_controller;
diff --git a/src/route/map-entry.hpp b/src/route/map-entry.hpp
index 9174345..0c54145 100644
--- a/src/route/map-entry.hpp
+++ b/src/route/map-entry.hpp
@@ -2,8 +2,9 @@
 #define NLSR_MAP_ENTRY_HPP
 
 #include <boost/cstdint.hpp>
+#include <ndn-cxx/name.hpp>
 
-namespace nlsr{
+namespace nlsr {
 
 class MapEntry
 {
@@ -18,13 +19,13 @@
   {
   }
 
-  MapEntry(const std::string& rtr, int32_t mn)
+  MapEntry(const ndn::Name& rtr, int32_t mn)
   {
     m_router = rtr;
     m_mappingNumber = mn;
   }
 
-  const std::string&
+  const ndn::Name&
   getRouter() const
   {
     return m_router;
@@ -37,7 +38,7 @@
   }
 
 private:
-  std::string m_router;
+  ndn::Name m_router;
   int32_t m_mappingNumber;
 };
 
diff --git a/src/route/map.cpp b/src/route/map.cpp
index 4701a05..07310e7 100644
--- a/src/route/map.cpp
+++ b/src/route/map.cpp
@@ -12,7 +12,7 @@
 using namespace std;
 
 static bool
-mapEntryCompareByRouter(MapEntry& mpe1, const string& rtrName)
+mapEntryCompareByRouter(MapEntry& mpe1, const ndn::Name& rtrName)
 {
   return mpe1.getRouter() == rtrName;
 }
@@ -24,7 +24,7 @@
 }
 
 void
-Map::addEntry(const string& rtrName)
+Map::addEntry(const ndn::Name& rtrName)
 {
   MapEntry me(rtrName, m_mappingIndex);
   if (addEntry(me))
@@ -48,7 +48,7 @@
   return false;
 }
 
-string
+const ndn::Name
 Map::getRouterNameByMappingNo(int32_t mn)
 {
   std::list<MapEntry>::iterator it = std::find_if(m_table.begin(),
@@ -59,11 +59,11 @@
   {
     return (*it).getRouter();
   }
-  return "";
+  return ndn::Name();
 }
 
 int32_t
-Map::getMappingNoByRouterName(string& rName)
+Map::getMappingNoByRouterName(const ndn::Name& rName)
 {
   std::list<MapEntry>::iterator it = std::find_if(m_table.begin(),
                                                   m_table.end(),
@@ -83,14 +83,14 @@
   for (std::list<AdjLsa>::iterator it = adjLsdb.begin();
        it != adjLsdb.end() ; it++)
   {
-    string linkStartRouter = (*it).getOrigRouter();
-    addEntry(linkStartRouter);
+    //ndn::Name& linkStartRouter = (*it).getOrigRouter();
+    addEntry((*it).getOrigRouter());
     std::list<Adjacent> adl = (*it).getAdl().getAdjList();
     for (std::list<Adjacent>::iterator itAdl = adl.begin();
          itAdl != adl.end() ; itAdl++)
     {
-      string linkEndRouter = (*itAdl).getName();
-      addEntry(linkEndRouter);
+      //ndn::Name& linkEndRouter = (*itAdl).getName();
+      addEntry((*itAdl).getName());
     }
   }
 }
diff --git a/src/route/map.hpp b/src/route/map.hpp
index cc08771..1c8da32 100644
--- a/src/route/map.hpp
+++ b/src/route/map.hpp
@@ -23,16 +23,16 @@
 
 
   void
-  addEntry(const std::string& rtrName);
+  addEntry(const ndn::Name& rtrName);
 
   void
   createFromAdjLsdb(Nlsr& pnlsr);
 
-  std::string
+  const ndn::Name
   getRouterNameByMappingNo(int32_t mn);
 
   int32_t
-  getMappingNoByRouterName(std::string& rName);
+  getMappingNoByRouterName(const ndn::Name& rName);
 
   void
   reset();
@@ -43,7 +43,7 @@
     return m_table;
   }
 
-  int
+  size_t
   getMapSize() const
   {
     return m_table.size();
diff --git a/src/route/name-prefix-table-entry.cpp b/src/route/name-prefix-table-entry.cpp
index 01eea0d..0ca9bcb 100644
--- a/src/route/name-prefix-table-entry.cpp
+++ b/src/route/name-prefix-table-entry.cpp
@@ -27,7 +27,7 @@
 
 
 static bool
-rteCompare(RoutingTableEntry& rte, string& destRouter)
+rteCompare(RoutingTableEntry& rte, ndn::Name& destRouter)
 {
   return rte.getDestination() == destRouter;
 }
@@ -57,7 +57,8 @@
   else
   {
     (*it).getNexthopList().reset(); // reseting existing routing table's next hop
-    for (std::list<NextHop>::iterator nhit = rte.getNexthopList().getNextHops().begin();
+    for (std::list<NextHop>::iterator nhit =
+           rte.getNexthopList().getNextHops().begin();
          nhit != rte.getNexthopList().getNextHops().end(); ++nhit)
     {
       (*it).getNexthopList().addNextHop((*nhit));
diff --git a/src/route/name-prefix-table-entry.hpp b/src/route/name-prefix-table-entry.hpp
index 0ee28fa..ab507d7 100644
--- a/src/route/name-prefix-table-entry.hpp
+++ b/src/route/name-prefix-table-entry.hpp
@@ -16,13 +16,13 @@
   {
   }
 
-  NamePrefixTableEntry(const std::string& namePrefix)
-    : m_nexthopList()
+  NamePrefixTableEntry(const ndn::Name& namePrefix)
+    : m_namePrefix(namePrefix)
+    , m_nexthopList()
   {
-    m_namePrefix = namePrefix;
   }
 
-  const std::string&
+  const ndn::Name&
   getNamePrefix() const
   {
     return m_namePrefix;
@@ -69,7 +69,7 @@
   addRoutingTableEntry(RoutingTableEntry& rte);
 
 private:
-  std::string m_namePrefix;
+  ndn::Name m_namePrefix;
   std::list<RoutingTableEntry> m_rteList;
   NexthopList m_nexthopList;
 };
diff --git a/src/route/name-prefix-table.cpp b/src/route/name-prefix-table.cpp
index e6a7ccf..f791d0a 100644
--- a/src/route/name-prefix-table.cpp
+++ b/src/route/name-prefix-table.cpp
@@ -5,6 +5,7 @@
 #include "nlsr.hpp"
 #include "name-prefix-table.hpp"
 #include "name-prefix-table-entry.hpp"
+#include "routing-table.hpp"
 
 
 
@@ -13,7 +14,7 @@
 using namespace std;
 
 static bool
-npteCompare(NamePrefixTableEntry& npte, const string& name)
+npteCompare(NamePrefixTableEntry& npte, const ndn::Name& name)
 {
   return npte.getNamePrefix() == name;
 }
@@ -21,7 +22,7 @@
 
 
 void
-NamePrefixTable::addEntry(const string& name, RoutingTableEntry& rte, Nlsr& pnlsr)
+NamePrefixTable::addEntry(const ndn::Name& name, RoutingTableEntry& rte)
 {
   std::list<NamePrefixTableEntry>::iterator it = std::find_if(m_table.begin(),
                                                               m_table.end(), bind(&npteCompare, _1, name));
@@ -34,7 +35,7 @@
     m_table.push_back(newEntry);
     if (rte.getNexthopList().getSize() > 0)
     {
-      pnlsr.getFib().update(pnlsr, name, newEntry.getNexthopList());
+      m_nlsr.getFib().update(name, newEntry.getNexthopList());
     }
   }
   else
@@ -44,77 +45,82 @@
       (*it).addRoutingTableEntry(rte);
       (*it).generateNhlfromRteList();
       (*it).getNexthopList().sort();
-      pnlsr.getFib().update(pnlsr, name, (*it).getNexthopList());
+      m_nlsr.getFib().update(name, (*it).getNexthopList());
     }
     else
     {
       (*it).resetRteListNextHop();
       (*it).getNexthopList().reset();
-      pnlsr.getFib().remove(pnlsr, name);
+      m_nlsr.getFib().remove(name);
     }
   }
 }
 
 void
-NamePrefixTable::removeEntry(const string& name, RoutingTableEntry& rte, Nlsr& pnlsr)
+NamePrefixTable::removeEntry(const ndn::Name& name, RoutingTableEntry& rte)
 {
   std::list<NamePrefixTableEntry>::iterator it = std::find_if(m_table.begin(),
                                                               m_table.end(), bind(&npteCompare, _1, name));
   if (it != m_table.end())
   {
-    string destRouter = rte.getDestination();
+    ndn::Name destRouter = rte.getDestination();
     (*it).removeRoutingTableEntry(rte);
     if (((*it).getRteListSize() == 0) &&
-        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/1", 1)) &&
-        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/2", 2)) &&
-        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/3", 3)))
+        (!m_nlsr.getLsdb().doesLsaExist(destRouter.append("/name"),
+                                        std::string("name"))) &&
+        (!m_nlsr.getLsdb().doesLsaExist(destRouter.append("/adjacency"),
+                                        std::string("adjacency"))) &&
+        (!m_nlsr.getLsdb().doesLsaExist(destRouter.append("/coordinate"),
+                                        std::string("coordinate"))))
     {
       m_table.erase(it);
-      pnlsr.getFib().remove(pnlsr, name);
+      m_nlsr.getFib().remove(name);
     }
     else
     {
       (*it).generateNhlfromRteList();
-      pnlsr.getFib().update(pnlsr, name, (*it).getNexthopList());
+      m_nlsr.getFib().update(name, (*it).getNexthopList());
     }
   }
 }
 
 
 void
-NamePrefixTable::addEntry(const string& name, const string& destRouter, Nlsr& pnlsr)
+NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
 {
+  //
   RoutingTableEntry* rteCheck =
-    pnlsr.getRoutingTable().findRoutingTableEntry(destRouter);
+    m_nlsr.getRoutingTable().findRoutingTableEntry(destRouter);
   if (rteCheck != 0)
   {
-    addEntry(name, *(rteCheck) , pnlsr);
+    addEntry(name, *(rteCheck));
   }
   else
   {
     RoutingTableEntry rte(destRouter);
-    addEntry(name, rte, pnlsr);
+    addEntry(name, rte);
   }
 }
 
 void
-NamePrefixTable::removeEntry(const string& name, const string& destRouter, Nlsr& pnlsr)
+NamePrefixTable::removeEntry(const ndn::Name& name, const ndn::Name& destRouter)
 {
+  //
   RoutingTableEntry* rteCheck =
-    pnlsr.getRoutingTable().findRoutingTableEntry(destRouter);
+    m_nlsr.getRoutingTable().findRoutingTableEntry(destRouter);
   if (rteCheck != 0)
   {
-    removeEntry(name, *(rteCheck), pnlsr);
+    removeEntry(name, *(rteCheck));
   }
   else
   {
     RoutingTableEntry rte(destRouter);
-    removeEntry(name, rte, pnlsr);
+    removeEntry(name, rte);
   }
 }
 
 void
-NamePrefixTable::updateWithNewRoute(Nlsr& pnlsr)
+NamePrefixTable::updateWithNewRoute()
 {
   for (std::list<NamePrefixTableEntry>::iterator it = m_table.begin();
        it != m_table.end(); ++it)
@@ -124,15 +130,15 @@
          rteit != rteList.end(); ++rteit)
     {
       RoutingTableEntry* rteCheck =
-        pnlsr.getRoutingTable().findRoutingTableEntry((*rteit).getDestination());
+        m_nlsr.getRoutingTable().findRoutingTableEntry((*rteit).getDestination());
       if (rteCheck != 0)
       {
-        addEntry((*it).getNamePrefix(), *(rteCheck), pnlsr);
+        addEntry((*it).getNamePrefix(), *(rteCheck));
       }
       else
       {
         RoutingTableEntry rte((*rteit).getDestination());
-        addEntry((*it).getNamePrefix(), rte, pnlsr);
+        addEntry((*it).getNamePrefix(), rte);
       }
     }
   }
diff --git a/src/route/name-prefix-table.hpp b/src/route/name-prefix-table.hpp
index 4f7fbb4..b872161 100644
--- a/src/route/name-prefix-table.hpp
+++ b/src/route/name-prefix-table.hpp
@@ -13,30 +13,32 @@
 class NamePrefixTable
 {
 public:
-  NamePrefixTable()
+  NamePrefixTable(Nlsr& nlsr)
+    : m_nlsr(nlsr)
   {
   }
 
   void
-  addEntry(const std::string& name, const std::string& destRouter, Nlsr& pnlsr);
+  addEntry(const ndn::Name& name, const ndn::Name& destRouter);
 
   void
-  removeEntry(const std::string& name, const std::string& destRouter, Nlsr& pnlsr);
+  removeEntry(const ndn::Name& name, const ndn::Name& destRouter);
 
   void
-  updateWithNewRoute(Nlsr& pnlsr);
+  updateWithNewRoute();
 
   void
   print();
 
 private:
   void
-  addEntry(const std::string& name, RoutingTableEntry& rte, Nlsr& pnlsr);
+  addEntry(const ndn::Name& name, RoutingTableEntry& rte);
 
   void
-  removeEntry(const std::string& name, RoutingTableEntry& rte, Nlsr& pnlsr);
+  removeEntry(const ndn::Name& name, RoutingTableEntry& rte);
 
 private:
+  Nlsr& m_nlsr;
   std::list<NamePrefixTableEntry> m_table;
 };
 
diff --git a/src/route/routing-table-calculator.cpp b/src/route/routing-table-calculator.cpp
index 7ec8a23..33a703d 100644
--- a/src/route/routing-table-calculator.cpp
+++ b/src/route/routing-table-calculator.cpp
@@ -38,14 +38,12 @@
   for (std::list<AdjLsa>::iterator it = adjLsdb.begin();
        it != adjLsdb.end() ; it++)
   {
-    string linkStartRouter = (*it).getOrigRouter();
-    int row = pMap.getMappingNoByRouterName(linkStartRouter);
+    int row = pMap.getMappingNoByRouterName((*it).getOrigRouter());
     std::list<Adjacent> adl = (*it).getAdl().getAdjList();
     for (std::list<Adjacent>::iterator itAdl = adl.begin();
          itAdl != adl.end() ; itAdl++)
     {
-      string linkEndRouter = (*itAdl).getName();
-      int col = pMap.getMappingNoByRouterName(linkEndRouter);
+      int col = pMap.getMappingNoByRouterName((*itAdl).getName());
       double cost = (*itAdl).getLinkCost();
       if ((row >= 0 && row < numOfRouter) && (col >= 0 && col < numOfRouter))
       {
@@ -158,8 +156,7 @@
   makeAdjMatrix(pnlsr, pMap);
   std::cout << pMap;
   printAdjMatrix();
-  string routerName = pnlsr.getConfParameter().getRouterPrefix();
-  int sourceRouter = pMap.getMappingNoByRouterName(routerName);
+  int sourceRouter = pMap.getMappingNoByRouterName(pnlsr.getConfParameter().getRouterPrefix());
   //int noLink=getNumOfLinkfromAdjMatrix(sourceRouter);
   allocateParent();
   allocateDistance();
@@ -259,8 +256,7 @@
       if (nextHopRouter != NO_NEXT_HOP)
       {
         double routeCost = m_distance[i];
-        string nextHopRouterName =
-          pMap.getRouterNameByMappingNo(nextHopRouter);
+        ndn::Name nextHopRouterName = pMap.getRouterNameByMappingNo(nextHopRouter);
         int nxtHopFace =
           pnlsr.getAdjacencyList().getAdjacent(nextHopRouterName).getConnectingFace();
         std::cout << "Dest Router: " << pMap.getRouterNameByMappingNo(i) << std::endl;
@@ -382,7 +378,7 @@
                                          RoutingTable& rt, Nlsr& pnlsr)
 {
   makeAdjMatrix(pnlsr, pMap);
-  string routerName = pnlsr.getConfParameter().getRouterPrefix();
+  ndn::Name routerName = pnlsr.getConfParameter().getRouterPrefix();
   int sourceRouter = pMap.getMappingNoByRouterName(routerName);
   int noLink = getNumOfLinkfromAdjMatrix(sourceRouter);
   setNoLink(noLink);
@@ -399,7 +395,7 @@
       allocateDistFromNbrToDest();
       for (int j = 0; j < vNoLink; j++)
       {
-        string nextHopRouterName = pMap.getRouterNameByMappingNo(links[j]);
+        ndn::Name nextHopRouterName = pMap.getRouterNameByMappingNo(links[j]);
         int nextHopFace =
           pnlsr.getAdjacencyList().getAdjacent(nextHopRouterName).getConnectingFace();
         double distToNbr = getHyperbolicDistance(pnlsr, pMap,
@@ -431,7 +427,7 @@
 {
   for (int i = 0 ; i < noFaces ; ++i)
   {
-    string destRouter = pMap.getRouterNameByMappingNo(dest);
+    ndn::Name destRouter = pMap.getRouterNameByMappingNo(dest);
     NextHop nh(m_linkFaces[i], m_distFromNbrToDest[i]);
     rt.addNextHop(destRouter, nh);
     if (m_isDryRun)
@@ -446,8 +442,10 @@
                                                  Map& pMap, int src, int dest)
 {
   double distance = 0.0;
-  string srcRouterKey = pMap.getRouterNameByMappingNo(src) + "/3";
-  string destRouterKey = pMap.getRouterNameByMappingNo(dest) + "/3";
+  ndn::Name srcRouterKey = pMap.getRouterNameByMappingNo(src);
+  srcRouterKey.append("coordinate");
+  ndn::Name destRouterKey = pMap.getRouterNameByMappingNo(dest);
+  destRouterKey.append("coordinate");
   double srcRadius = (pnlsr.getLsdb().findCoordinateLsa(
                         srcRouterKey))->getCorRadius();
   double srcTheta = (pnlsr.getLsdb().findCoordinateLsa(
diff --git a/src/route/routing-table-entry.hpp b/src/route/routing-table-entry.hpp
index 0d0b662..fbba243 100644
--- a/src/route/routing-table-entry.hpp
+++ b/src/route/routing-table-entry.hpp
@@ -2,7 +2,7 @@
 #define NLSR_ROUTING_TABLE_ENTRY_HPP
 
 #include <iostream>
-
+#include <ndn-cxx/name.hpp>
 #include "nexthop-list.hpp"
 
 namespace nlsr {
@@ -18,13 +18,13 @@
   {
   }
 
-  RoutingTableEntry(const std::string& dest)
+  RoutingTableEntry(const ndn::Name& dest)
   {
     m_destination = dest;
   }
 
-  std::string
-  getDestination()
+  const ndn::Name&
+  getDestination() const
   {
     return m_destination;
   }
@@ -36,7 +36,7 @@
   }
 
 private:
-  std::string m_destination;
+  ndn::Name m_destination;
   NexthopList m_nexthopList;
 };
 
diff --git a/src/route/routing-table.cpp b/src/route/routing-table.cpp
index bb7d3fa..7664b89 100644
--- a/src/route/routing-table.cpp
+++ b/src/route/routing-table.cpp
@@ -17,7 +17,6 @@
 RoutingTable::calculate(Nlsr& pnlsr)
 {
   //debugging purpose
-  std::cout << pnlsr.getConfParameter() << std::endl;
   pnlsr.getNamePrefixTable().print();
   pnlsr.getLsdb().printAdjLsdb();
   pnlsr.getLsdb().printCorLsdb();
@@ -26,7 +25,8 @@
   {
     pnlsr.setIsRoutingTableCalculating(1); //setting routing table calculation
     if (pnlsr.getLsdb().doesLsaExist(
-          pnlsr.getConfParameter().getRouterPrefix() + "/" + "2", 2))
+          pnlsr.getConfParameter().getRouterPrefix().toUri() + "/" + "adjacency",
+          std::string("adjacency")))
     {
       if (pnlsr.getIsBuildAdjLsaSheduled() != 1)
       {
@@ -50,7 +50,7 @@
           calculateHypDryRoutingTable(pnlsr);
         }
         //need to update NPT here
-        pnlsr.getNamePrefixTable().updateWithNewRoute(pnlsr);
+        pnlsr.getNamePrefixTable().updateWithNewRoute();
         //debugging purpose
         printRoutingTable();
         pnlsr.getNamePrefixTable().print();
@@ -71,7 +71,7 @@
       clearDryRoutingTable(); // for dry run options
       // need to update NPT here
       std::cout << "Calling Update NPT With new Route" << std::endl;
-      pnlsr.getNamePrefixTable().updateWithNewRoute(pnlsr);
+      pnlsr.getNamePrefixTable().updateWithNewRoute();
       //debugging purpose
       printRoutingTable();
       pnlsr.getNamePrefixTable().print();
@@ -131,14 +131,14 @@
 }
 
 static bool
-routingTableEntryCompare(RoutingTableEntry& rte, string& destRouter)
+routingTableEntryCompare(RoutingTableEntry& rte, ndn::Name& destRouter)
 {
   return rte.getDestination() == destRouter;
 }
 
 // function related to manipulation of routing table
 void
-RoutingTable::addNextHop(string destRouter, NextHop& nh)
+RoutingTable::addNextHop(const ndn::Name& destRouter, NextHop& nh)
 {
   RoutingTableEntry* rteChk = findRoutingTableEntry(destRouter);
   if (rteChk == 0)
@@ -154,7 +154,7 @@
 }
 
 RoutingTableEntry*
-RoutingTable::findRoutingTableEntry(const string destRouter)
+RoutingTable::findRoutingTableEntry(const ndn::Name& destRouter)
 {
   std::list<RoutingTableEntry>::iterator it = std::find_if(m_rTable.begin(),
                                                            m_rTable.end(),
@@ -180,7 +180,7 @@
 
 //function related to manipulation of dry routing table
 void
-RoutingTable::addNextHopToDryTable(string destRouter, NextHop& nh)
+RoutingTable::addNextHopToDryTable(const ndn::Name& destRouter, NextHop& nh)
 {
   std::list<RoutingTableEntry>::iterator it = std::find_if(m_dryTable.begin(),
                                                            m_dryTable.end(),
diff --git a/src/route/routing-table.hpp b/src/route/routing-table.hpp
index 35f563e..983596b 100644
--- a/src/route/routing-table.hpp
+++ b/src/route/routing-table.hpp
@@ -24,19 +24,19 @@
   calculate(Nlsr& pnlsr);
 
   void
-  addNextHop(std::string destRouter, NextHop& nh);
+  addNextHop(const ndn::Name& destRouter, NextHop& nh);
 
   void
   printRoutingTable();
 
   void
-  addNextHopToDryTable(std::string destRouter, NextHop& nh);
+  addNextHopToDryTable(const ndn::Name& destRouter, NextHop& nh);
 
   void
   printDryRoutingTable();
 
   RoutingTableEntry*
-  findRoutingTableEntry(const std::string destRouter);
+  findRoutingTableEntry(const ndn::Name& destRouter);
 
   void
   scheduleRoutingTableCalculation(Nlsr& pnlsr);
diff --git a/src/utility/name-helper.hpp b/src/utility/name-helper.hpp
new file mode 100644
index 0000000..5a01a1a
--- /dev/null
+++ b/src/utility/name-helper.hpp
@@ -0,0 +1,37 @@
+#ifndef NLSR_NAME_HELPER_HPP
+#define NLSR_NAME_HELPER_HPP
+
+#include <boost/cstdint.hpp>
+#include <ndn-cxx/name-component.hpp>
+#include <ndn-cxx/name.hpp>
+
+namespace nlsr {
+namespace util {
+/**
+ * @brief search a name component in ndn::Name and return the position of the component
+ * @param name where to search the searchString
+ * @param searchString, the string to search in name
+ * @retrun int32_t -1 if searchString not found else return the position
+ * starting from 0
+ */
+
+inline static int32_t
+getNameComponentPosition(const ndn::Name& name, const std::string& searchString)
+{
+  ndn::name::Component component(searchString);
+  size_t nameSize = name.size();
+  for (uint32_t i = 0; i < nameSize; i++)
+  {
+    if (component == name[i])
+    {
+      return (int32_t)i;
+    }
+  }
+  return -1;
+}
+
+} //namespace util
+
+} // namespace nlsr
+
+#endif //NLSR_NAME_HELPER_HPP