diff --git a/nlsr.cpp b/nlsr.cpp
index 61f9424..99552b0 100644
--- a/nlsr.cpp
+++ b/nlsr.cpp
@@ -16,14 +16,14 @@
 nlsr::nlsrRegistrationFailed(const ptr_lib::shared_ptr<const Name>&)
 {
   cerr << "ERROR: Failed to register prefix in local hub's daemon" << endl;
-  nlsrFace.shutdown();
+  getNlsrFace().shutdown();
 }
 
 
 void
 nlsr::setInterestFilterNlsr(const string& name)
 {
-  nlsrFace.setInterestFilter(name,
+  getNlsrFace().setInterestFilter(name,
                         func_lib::bind(&interestManager::processInterest, &im, 
                         boost::ref(*this), _1, _2),
                         func_lib::bind(&nlsr::nlsrRegistrationFailed, this, _1));
@@ -33,7 +33,7 @@
 void
 nlsr::startEventLoop()
 {
-	nlsrFace.processEvents();
+	getNlsrFace().processEvents();
 }
 
 int 
@@ -57,14 +57,14 @@
 	nlsr.setConfFileName("nlsr.conf");
 	ConfFileProcessor cfp(nlsr.getConfFileName());
 	cfp.processConfFile(nlsr);
-	nlsr.confParam.buildRouterPrefix();
+	nlsr.getConfParameter().buildRouterPrefix();
 /* debugging purpose start */
-	cout <<	nlsr.confParam ;
-	nlsr.adl.printAdl();
-	nlsr.npl.printNpl();
+	cout <<	nlsr.getConfParameter(); ;
+	nlsr.getAdl().printAdl();
+	nlsr.getNpl().printNpl();
 /* debugging purpose end */
-	nlsr.setInterestFilterNlsr(nlsr.confParam.getRouterPrefix());
-	nlsr.im.scheduleInfoInterest(nlsr,1);
+	nlsr.setInterestFilterNlsr(nlsr.getConfParameter().getRouterPrefix());
+	nlsr.getIm().scheduleInfoInterest(nlsr,1);
 
 	
 	
diff --git a/nlsr.hpp b/nlsr.hpp
index ed2e4d2..a041738 100644
--- a/nlsr.hpp
+++ b/nlsr.hpp
@@ -60,6 +60,44 @@
     isDaemonProcess=value;
   }
 
+	ConfParameter& getConfParameter(){
+		return confParam;
+	}
+
+	Adl& getAdl(){
+		return adl;
+	}
+
+	Npl& getNpl(){
+		return npl;
+	}
+
+	ndn::shared_ptr<boost::asio::io_service>& getIo()
+	{
+		return io;
+	}
+
+	ndn::Scheduler& getScheduler(){
+		return scheduler;
+	}
+
+	ndn::Face& getNlsrFace(){
+		return nlsrFace;
+	}
+
+	ndn::KeyChain& getKeyChain(){
+		return kChain;
+	}
+
+	interestManager& getIm(){
+		return im;
+	}
+
+	DataManager& getDm(){
+		return dm;
+	}
+		
+private:
 	ConfParameter confParam;
 	Adl adl;
 	Npl npl;
@@ -69,9 +107,6 @@
 	ndn::KeyChain kChain;
 	interestManager im;
 	DataManager dm;
-
-private:
-	
 	bool isDaemonProcess;
 	string configFileName;
 
diff --git a/nlsr_adjacent.hpp b/nlsr_adjacent.hpp
index 09eef16..dc4a712 100644
--- a/nlsr_adjacent.hpp
+++ b/nlsr_adjacent.hpp
@@ -9,7 +9,7 @@
 		Adjacent()
 			:adjacentName()
 			,connectingFace(0)
-			,linkCost(0.0)
+			,linkCost(10.0)
 			,status(0)
 			,interestTimedOutNo(0)
 		{
diff --git a/nlsr_adl.cpp b/nlsr_adl.cpp
index 0b22d80..0cbdb4a 100644
--- a/nlsr_adl.cpp
+++ b/nlsr_adl.cpp
@@ -62,6 +62,90 @@
 
 }
 
+bool 
+Adl::isNeighbor(string adjName){
+	Adjacent adj(adjName);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return false;
+	}
+
+	return true;
+}
+
+void 
+Adl::incrementTimedOutInterestCount(string& neighbor){
+	Adjacent adj(neighbor);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return ;
+	}
+
+	(*it).setInterestTimedOutNo((*it).getInterestTimedOutNo()+1);
+
+}
+
+void 
+Adl::setTimedOutInterestCount(string& neighbor, int count){
+	Adjacent adj(neighbor);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it != adjList.end()){
+		(*it).setInterestTimedOutNo(count);
+	}
+}
+
+int
+Adl::getTimedOutInterestCount(string& neighbor)
+{
+	Adjacent adj(neighbor);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return -1;
+	}
+
+	return (*it).getInterestTimedOutNo();
+}
+
+int 
+Adl::getStatusOfNeighbor(string& neighbor)
+{
+	Adjacent adj(neighbor);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it == adjList.end()){
+		return -1;
+	}
+
+	return (*it).getStatus();
+}
+
+void
+Adl::setStatusOfNeighbor(string& neighbor, int status)
+{
+	Adjacent adj(neighbor);
+	std::list<Adjacent >::iterator it = std::find_if( adjList.begin(), 
+								adjList.end(),	
+   								bind(&adjacent_compare, _1, adj));
+
+	if( it != adjList.end()){
+		(*it).setStatus(status);
+	}
+}
+
 std::list<Adjacent> 
 Adl::getAdjList(){
 	return adjList;
diff --git a/nlsr_adl.hpp b/nlsr_adl.hpp
index 2f388c8..71829c1 100644
--- a/nlsr_adl.hpp
+++ b/nlsr_adl.hpp
@@ -15,9 +15,15 @@
 	int insert(Adjacent& adj);
 	int updateAdjacentStatus(string adjName, int s);
 	int updateAdjacentLinkCost(string adjName, double lc);	
-	void printAdl();
 	std::list<Adjacent> getAdjList();
+	bool isNeighbor(string adjName);
+	void incrementTimedOutInterestCount(string& neighbor);
+	int getTimedOutInterestCount(string& neighbor);
+	int getStatusOfNeighbor(string& neighbor);
+	void setStatusOfNeighbor(string& neighbor, int status);
+	void setTimedOutInterestCount(string& neighbor, int count);
 
+	void printAdl();
 
 private:	
 	std::list< Adjacent > adjList;
diff --git a/nlsr_conf_param.cpp b/nlsr_conf_param.cpp
index fad9f10..8ae7647 100644
--- a/nlsr_conf_param.cpp
+++ b/nlsr_conf_param.cpp
@@ -5,28 +5,22 @@
 
 ostream&
 operator << (ostream &os, ConfParameter& cfp){
-	os  <<"Router Name: "<< cfp.getRouterName()<<endl;
-    os  <<"Site Name: "<< cfp.getSiteName()<<endl;
-    os  <<"Network: "<< cfp.getNetwork()<<endl;
-
-    os  <<"Router Prefix: "<< cfp.getRouterPrefix()<<endl;
-
-    os  <<"ChronoSync sync Prifex: "<< cfp.getChronosyncSyncPrefix()<<endl;
- 
-    os  <<"Interest Retry number: "<< cfp.getInterestRetryNumber()<<endl;
-    os  <<"Interest Resend second: "<< cfp.getInterestResendTime()<<endl;
+  os  <<"Router Name: "<< cfp.getRouterName()<<endl;
+  os  <<"Site Name: "<< cfp.getSiteName()<<endl;
+  os  <<"Network: "<< cfp.getNetwork()<<endl;
+  os  <<"Router Prefix: "<< cfp.getRouterPrefix()<<endl;
+  os  <<"ChronoSync sync Prifex: "<< cfp.getChronosyncSyncPrefix()<<endl;
+  os  <<"Interest Retry number: "<< cfp.getInterestRetryNumber()<<endl;
+  os  <<"Interest Resend second: "<< cfp.getInterestResendTime()<<endl;
 	os  <<"Info Interest Interval: "<<cfp.getInfoInterestInterval()<<endl;
-    os  <<"LSA refresh time: "<< cfp.getLsaRefreshTime()<<endl;
-       
-    os  <<"Max Faces Per Prefix: "<< cfp.getMaxFacesPerPrefix()<<endl;
-    os  <<"Log Dir: "<< cfp.getLogDir()<<endl;
-    os  <<"Detalied logging: "<< cfp.getDetailedLogging()<<endl;
-    os  <<"Debugging: "<< cfp.getDebugging()<<endl;
-
-    os  <<"Hyperbolic ROuting: "<< cfp.getIsHyperbolicCalc()<<endl;
-    os  <<"Hyp R: "<< cfp.getCorR()<<endl;
-    os  <<"Hyp theta: "<< cfp.getCorTheta()<<endl;
-
+  os  <<"LSA refresh time: "<< cfp.getLsaRefreshTime()<<endl;     
+  os  <<"Max Faces Per Prefix: "<< cfp.getMaxFacesPerPrefix()<<endl;
+  os  <<"Log Dir: "<< cfp.getLogDir()<<endl;
+  os  <<"Detalied logging: "<< cfp.getDetailedLogging()<<endl;
+  os  <<"Debugging: "<< cfp.getDebugging()<<endl;
+  os  <<"Hyperbolic ROuting: "<< cfp.getIsHyperbolicCalc()<<endl;
+  os  <<"Hyp R: "<< cfp.getCorR()<<endl;
+  os  <<"Hyp theta: "<< cfp.getCorTheta()<<endl;
 	os  <<"Tunnel Type: "<< cfp.getTunnelType()<<endl;
 
 	return os;
diff --git a/nlsr_conf_param.hpp b/nlsr_conf_param.hpp
index 69d2eff..f8290d2 100644
--- a/nlsr_conf_param.hpp
+++ b/nlsr_conf_param.hpp
@@ -178,44 +178,42 @@
 			infoInterestInterval=iii;
 		}
 
-	private:
-        string routerName;
-        string siteName;
-        string network;
+private:
+	string routerName;
+	string siteName;
+	string network;
 
-        string routerPrefix;
-        string lsaRouterPrefix;
+	string routerPrefix;
+	string lsaRouterPrefix;
 
-        string chronosyncSyncPrefix;
-        string chronosyncLsaPrefix;             
+	string chronosyncSyncPrefix;
+	string chronosyncLsaPrefix;             
 
-        int interestRetryNumber;
-        int interestResendTime;
-		int infoInterestInterval;
-        int lsaRefreshTime;
-        int routerDeadInterval;
+	int interestRetryNumber;
+	int interestResendTime;
+	int infoInterestInterval;
+	int lsaRefreshTime;
+	int routerDeadInterval;
         
-        int maxFacesPerPrefix;
-        string logDir;
-        string logFile;
-        int detailedLogging;
-        int debugging;
+	int maxFacesPerPrefix;
+	string logDir;
+	string logFile;
+	int detailedLogging;
+	int debugging;
 
-        int isHyperbolicCalc;
-        double corR;
-        double corTheta;
+	int isHyperbolicCalc;
+	double corR;
+	double corTheta;
 
-		int tunnelType;
+	int tunnelType;
 
-		int adjBuildFlag;
-        long int adjBuildCount;
-        int isBuildAdjLsaSheduled;
-        int isRouteCalculationScheduled;
+	int adjBuildFlag;
+	long int adjBuildCount;
+	int isBuildAdjLsaSheduled;
+	int isRouteCalculationScheduled;
 
-        int isRoutingTableCalculating;
-        int isStrictHierchicalKeyCheck;
-
-        
+	int isRoutingTableCalculating;
+	int isStrictHierchicalKeyCheck;
 
 };
 
diff --git a/nlsr_conf_processor.cpp b/nlsr_conf_processor.cpp
index 5f80b29..691a285 100644
--- a/nlsr_conf_processor.cpp
+++ b/nlsr_conf_processor.cpp
@@ -108,7 +108,7 @@
 		if(command[0] == '/' ){
 			command.erase(0,1);
 		}
-		pnlsr.confParam.setNetwork(command);
+		pnlsr.getConfParameter().setNetwork(command);
 	}
 	return 0;
 }
@@ -125,7 +125,7 @@
 		if(command[0] == '/' ){
 			command.erase(0,1);
 		}
-		pnlsr.confParam.setSiteName(command);
+		pnlsr.getConfParameter().setSiteName(command);
 	}
 	return 0;
 }
@@ -142,7 +142,7 @@
 		if(command[0] == '/' ){
 			command.erase(0,1);
 		}
-		pnlsr.confParam.setRouterName(command);
+		pnlsr.getConfParameter().setRouterName(command);
 	}
 	return 0;
 }
@@ -156,7 +156,7 @@
 		stringstream ss(command.c_str());
 		ss>>irn;
 		if ( irn >=1 && irn <=5){
-			pnlsr.confParam.setInterestRetryNumber(irn);
+			pnlsr.getConfParameter().setInterestRetryNumber(irn);
 		}
 	}
 	return 0;
@@ -171,7 +171,7 @@
 		stringstream ss(command.c_str());
 		ss>>irt;
 		if( irt>=1 && irt <=20){
-			pnlsr.confParam.setInterestResendTime(irt);
+			pnlsr.getConfParameter().setInterestResendTime(irt);
 		}
 	}
 	return 0;
@@ -186,7 +186,7 @@
 		stringstream ss(command.c_str());
 		ss>>lrt;
 		if ( lrt>= 240 && lrt<=7200){
-			pnlsr.confParam.setLsaRefreshTime(lrt);
+			pnlsr.getConfParameter().setLsaRefreshTime(lrt);
 		}
 	}
 	return 0;
@@ -201,7 +201,7 @@
 		stringstream ss(command.c_str());
 		ss>>mfpp;
 		if ( mfpp>=0 && mfpp<=60){
-			pnlsr.confParam.setMaxFacesPerPrefix(mfpp);
+			pnlsr.getConfParameter().setMaxFacesPerPrefix(mfpp);
 		}
 	}
 	return 0;
@@ -213,10 +213,10 @@
 		cerr <<" Wrong command format ! [tunnel-type tcp/udp]!"<<endl;
 	}else{
 		if(command == "tcp" || command == "TCP" ){
-			pnlsr.confParam.setTunnelType(1);
+			pnlsr.getConfParameter().setTunnelType(1);
 		}
 		else if(command == "udp" || command == "UDP"){
-			pnlsr.confParam.setTunnelType(0);
+			pnlsr.getConfParameter().setTunnelType(0);
 		}else{
 			cerr <<" Wrong command format ! [tunnel-type tcp/udp]!"<<endl;
 		}
@@ -230,7 +230,7 @@
 	if(command.empty() ){
 		cerr <<" Wrong command format ! [chronosync-sync-prefix name/prefix]!"<<endl;
 	}else{
-		pnlsr.confParam.setChronosyncSyncPrefix(command);
+		pnlsr.getConfParameter().setChronosyncSyncPrefix(command);
 	}
 	return 0;
 }
@@ -241,7 +241,7 @@
 	if(command.empty() ){
 		cerr <<" Wrong command format ! [log-dir /path/to/log/dir]!"<<endl;
 	}else{
-		pnlsr.confParam.setLogDir(command);
+		pnlsr.getConfParameter().setLogDir(command);
 	}
 	return 0;
 }
@@ -252,10 +252,10 @@
 		cerr <<" Wrong command format ! [debugging on/of]!"<<endl;
 	}else{
 		if(command == "on" || command == "ON" ){
-			pnlsr.confParam.setDebugging(1);
+			pnlsr.getConfParameter().setDebugging(1);
 		}
 		else if(command == "off" || command == "off"){
-			pnlsr.confParam.setDebugging(0);
+			pnlsr.getConfParameter().setDebugging(0);
 		}else{
 			cerr <<" Wrong command format ! [debugging on/off]!"<<endl;
 		}
@@ -269,10 +269,10 @@
 		cerr <<" Wrong command format ! [detailed-logging on/off]!"<<endl;
 	}else{
 		if(command == "on" || command == "ON" ){
-			pnlsr.confParam.setDetailedLogging(1);
+			pnlsr.getConfParameter().setDetailedLogging(1);
 		}
 		else if(command == "off" || command == "off"){
-			pnlsr.confParam.setDetailedLogging(0);
+			pnlsr.getConfParameter().setDetailedLogging(0);
 		}else{
 			cerr <<" Wrong command format ! [detailed-logging on/off]!"<<endl;
 		}
@@ -286,13 +286,13 @@
 		cerr <<" Wrong command format ! [hyperbolic-routing on/off/dry-run]!"<<endl;
 	}else{
 		if(command == "on" || command == "ON" ){
-			pnlsr.confParam.setIsHyperbolicCalc(1);
+			pnlsr.getConfParameter().setIsHyperbolicCalc(1);
 		}
 		else if(command == "dry-run" || command == "DRY-RUN"){
-			pnlsr.confParam.setIsHyperbolicCalc(2);
+			pnlsr.getConfParameter().setIsHyperbolicCalc(2);
 		}
 		else if(command == "off" || command == "off"){
-			pnlsr.confParam.setIsHyperbolicCalc(0);
+			pnlsr.getConfParameter().setIsHyperbolicCalc(0);
 		}else{
 			cerr <<" Wrong command format ! [hyperbolic-routing on/off/dry-run]!"<<endl;
 		}
@@ -304,7 +304,7 @@
 ConfFileProcessor::processConfCommandHyperbolicCordinate(nlsr& pnlsr, string command){
 	if(command.empty() ){
 		cerr <<" Wrong command format ! [hyperbolic-cordinate r 0]!"<<endl;
-		if (pnlsr.confParam.getIsHyperbolicCalc() > 0 ){
+		if (pnlsr.getConfParameter().getIsHyperbolicCalc() > 0 ){
 			return -1;
 		}
 	}else{
@@ -316,8 +316,8 @@
 		ssr>>r;
 		sst>>theta;
 		
-		pnlsr.confParam.setCorR(r);
-		pnlsr.confParam.setCorTheta(theta);
+		pnlsr.getConfParameter().setCorR(r);
+		pnlsr.getConfParameter().setCorTheta(theta);
 	}
 	return 0;
 }
@@ -330,7 +330,7 @@
 	}else{
 		nlsrTokenizer nt(command," ");
 		Adjacent adj(nt.getFirstToken(),0,0.0,0,0);
-		pnlsr.adl.insert(adj);
+		pnlsr.getAdl().insert(adj);
 	}
 	return 0;	
 }
@@ -340,7 +340,7 @@
 	if(command.empty() ){
 		cerr <<" Wrong command format ! [ndnname name/prefix]!"<<endl;
 	}else{
-		pnlsr.npl.insertIntoNpl(command);
+		pnlsr.getNpl().insertIntoNpl(command);
 	}
 	return 0;
 }
@@ -350,7 +350,7 @@
 ConfFileProcessor::processConfCommandLinkCost(nlsr& pnlsr, string command){
 	if(command.empty() ){
 		cerr <<" Wrong command format ! [link-cost nbr/name cost]!"<<endl;
-		if (pnlsr.confParam.getIsHyperbolicCalc() > 0 ){
+		if (pnlsr.getConfParameter().getIsHyperbolicCalc() > 0 ){
 			return -1;
 		}
 	}else{
@@ -360,7 +360,7 @@
 		double cost;
 		sst>>cost;
 		
-		pnlsr.adl.updateAdjacentLinkCost(nt.getFirstToken(),cost);
+		pnlsr.getAdl().updateAdjacentLinkCost(nt.getFirstToken(),cost);
 	}
 	return 0;
 }
diff --git a/nlsr_dm.cpp b/nlsr_dm.cpp
index 70089dc..7b958de 100644
--- a/nlsr_dm.cpp
+++ b/nlsr_dm.cpp
@@ -11,13 +11,57 @@
 using namespace ndn;
 
 void
-DataManager::processContent(const nlsr& pnlsr, 
+DataManager::processContent(nlsr& pnlsr, 
                   const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
 								               const ndn::ptr_lib::shared_ptr<ndn::Data> &data)
 {
 
 	cout << "I: " << interest->toUri() << endl;
-  	cout << "D: " << data->getName().toUri() << endl;
-	cout << "Data Content: " << data->getContent() << endl;
 
+	string dataName(data->getName().toUri());
+	string dataContent((char *)data->getContent().value());
+	
+  	cout << "D: " << dataName << endl;
+	cout << "Data Content: " << dataContent << endl;
+
+	nlsrTokenizer nt(dataName,"/");
+	string chkString("info");
+	if( nt.doesTokenExist(chkString) ){
+		processContentInfo(pnlsr,dataName,dataContent);
+	}
+
+}
+
+void
+DataManager::processContentInfo(nlsr& pnlsr, string& dataName,
+                                                           string& dataContent)
+{
+	nlsrTokenizer nt(dataName,"/");
+	string chkString("info");
+	string neighbor="/" + nt.getFirstToken()
+							+nt.getTokenString(0,nt.getTokenPosition(chkString)-1);
+	int status=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
+	int infoIntTimedOutCount=pnlsr.getAdl().getTimedOutInterestCount(neighbor);
+	//debugging purpose start
+	cout <<"Before Updates: " <<endl;
+	cout <<"Neighbor : "<<neighbor<<endl;
+	cout<<"Status: "<< status << endl;
+	cout<<"Info Interest Timed out: "<< infoIntTimedOutCount <<endl;
+	//debugging purpose end
+
+	pnlsr.getAdl().setStatusOfNeighbor(neighbor,1);
+	pnlsr.getAdl().setTimedOutInterestCount(neighbor,0);
+
+	status=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
+	infoIntTimedOutCount=pnlsr.getAdl().getTimedOutInterestCount(neighbor);
+
+	//debugging purpose
+	cout <<"After Updates: " <<endl;
+	cout <<"Neighbor : "<<neighbor<<endl;
+	cout<<"Status: "<< status << endl;
+	cout<<"Info Interest Timed out: "<< infoIntTimedOutCount <<endl;
+	//debugging purpose end
+
+	/* Need to schedule event for Adjacency LSA building */
+	
 }
diff --git a/nlsr_dm.hpp b/nlsr_dm.hpp
index da513ed..c174e02 100644
--- a/nlsr_dm.hpp
+++ b/nlsr_dm.hpp
@@ -14,9 +14,11 @@
 class DataManager
 {
 public:
-  void processContent(const nlsr& pnlsr, 
+  void processContent(nlsr& pnlsr, 
                   const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
 								               const ndn::ptr_lib::shared_ptr<ndn::Data> &data);
+	void processContentInfo(nlsr& pnlsr, string& dataName,
+                                                           string& dataContent);
 private:
   
 };
diff --git a/nlsr_im.cpp b/nlsr_im.cpp
index 6a432a5..a29fac9 100644
--- a/nlsr_im.cpp
+++ b/nlsr_im.cpp
@@ -18,12 +18,46 @@
 {
 
 	cout << "<< I: " << *interest << endl;
-  Data data(ndn::Name(interest->getName()).append("testApp").appendVersion());
-  data.setFreshnessPeriod(1000); // 10 sec
-  data.setContent((const uint8_t*)"HELLO KITTY", sizeof("HELLO KITTY"));
-  pnlsr.kChain.sign(data);
-  cout << ">> D: " << data << endl;
-  pnlsr.nlsrFace.put(data);
+	string intName=interest->getName().toUri();
+	cout << "Interest Received for Name: "<< intName <<endl;
+	nlsrTokenizer nt(intName,"/");
+	string chkString("info");
+	if( nt.doesTokenExist(chkString) ){
+		string nbr=nt.getTokenString(nt.getTokenPosition(chkString)+1);
+		cout <<"Neighbor: " << nbr <<endl;
+		processInterestInfo(pnlsr,nbr,interest);
+	}
+	
+  //Data data(ndn::Name(interest->getName()).append("testApp").appendVersion());
+  //data.setFreshnessPeriod(1000); // 10 sec
+  //data.setContent((const uint8_t*)"HELLO KITTY", sizeof("HELLO KITTY"));
+  //pnlsr.getKeyChain().sign(data);
+  //cout << ">> D: " << data << endl;
+  //pnlsr.getNlsrFace().put(data);
+}
+
+void 
+interestManager::processInterestInfo(nlsr& pnlsr, string& neighbor,
+							            const ptr_lib::shared_ptr<const Interest> &interest)
+{
+	if ( pnlsr.getAdl().isNeighbor(neighbor) )
+	{
+		Data data(ndn::Name(interest->getName()).appendVersion());
+  		data.setFreshnessPeriod(1000); // 10 sec
+  		data.setContent((const uint8_t*)"info", sizeof("info"));
+  		pnlsr.getKeyChain().sign(data);
+  		cout << ">> D: " << data << endl;
+  		pnlsr.getNlsrFace().put(data);
+
+  		int status=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
+  		if ( status == 0 )
+  		{
+			string intName=neighbor +"/"+"info"+
+                                     pnlsr.getConfParameter().getRouterPrefix();
+    		expressInterest(	pnlsr,intName,2,
+                              pnlsr.getConfParameter().getInterestResendTime());
+  		}
+	}
 }
 
 void 
@@ -32,17 +66,44 @@
 {
   	cout << "Timed out interest : " << interest->getName().toUri() << endl;
 	string intName=	interest->getName().toUri();
-	cout << intName <<endl;
 	nlsrTokenizer nt(intName,"/");
 	string chkString("info");
 	if( nt.doesTokenExist(chkString) ){
-		string nbr=nt.getTokenString(0,nt.getTokenPosition(chkString)-1);
-		cout<<"Neighbor :"<<nbr<<endl;
+		string nbr="/" + nt.getFirstToken()
+							+nt.getTokenString(0,nt.getTokenPosition(chkString)-1);
+		processInterestTimedOutInfo( pnlsr , nbr , interest);
 	}
 
 }
 
 void 
+interestManager::processInterestTimedOutInfo(nlsr& pnlsr, string& neighbor,
+                 const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest)
+{
+	pnlsr.getAdl().incrementTimedOutInterestCount(neighbor);
+	int status=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
+	int infoIntTimedOutCount=pnlsr.getAdl().getTimedOutInterestCount(neighbor);
+	cout<<"Neighbor: "<< neighbor << endl;
+	cout<<"Status: "<< status << endl;
+	cout<<"Info Interest Timed out: "<< infoIntTimedOutCount <<endl;
+
+	if((infoIntTimedOutCount < pnlsr.getConfParameter().getInterestRetryNumber()))
+	{
+		string intName=neighbor +"/"+"info"+
+                                     pnlsr.getConfParameter().getRouterPrefix();
+    expressInterest(	pnlsr,intName,2,
+                              pnlsr.getConfParameter().getInterestResendTime());
+	}
+	else if ( (status == 1) && 
+	  (infoIntTimedOutCount == pnlsr.getConfParameter().getInterestRetryNumber()))
+	{
+		pnlsr.getAdl().setStatusOfNeighbor(neighbor,0);
+		// schedule event for building adjacency LSA
+	}
+	
+}
+
+void 
 interestManager::expressInterest(nlsr& pnlsr,const string& interestNamePrefix, 
                                   											int scope, int seconds)
 {
@@ -51,9 +112,9 @@
   i.setInterestLifetime(seconds*1000);
 	i.setMustBeFresh(true);
 
-	pnlsr.nlsrFace.expressInterest(i,
+	pnlsr.getNlsrFace().expressInterest(i,
                   ndn::func_lib::bind(&DataManager::processContent, 
-                  &pnlsr.dm, boost::ref(pnlsr),_1, _2),
+                  &pnlsr.getDm(), boost::ref(pnlsr),_1, _2),
                   ndn::func_lib::bind(&interestManager::processInterestTimedOut,
                                                     this,boost::ref(pnlsr),_1));
 }
@@ -62,22 +123,22 @@
 void 
 interestManager::sendScheduledInfoInterest(nlsr& pnlsr, int seconds)
 {
-	std::list<Adjacent> adjList=pnlsr.adl.getAdjList();
+	std::list<Adjacent> adjList=pnlsr.getAdl().getAdjList();
 	for(std::list<Adjacent>::iterator it=adjList.begin(); it!=adjList.end();++it)
   {
 		string adjName=(*it).getAdjacentName()+"/"+"info"+
-                                              pnlsr.confParam.getRouterPrefix();
-		expressInterest(	pnlsr,adjName,2,pnlsr.confParam.getInterestResendTime());
+                                              pnlsr.getConfParameter().getRouterPrefix();
+		expressInterest(	pnlsr,adjName,2,pnlsr.getConfParameter().getInterestResendTime());
 	}
 
-	scheduleInfoInterest(pnlsr, pnlsr.confParam.getInfoInterestInterval());
+	scheduleInfoInterest(pnlsr, pnlsr.getConfParameter().getInfoInterestInterval());
 
 }
 
 void 
 interestManager::scheduleInfoInterest(nlsr& pnlsr, int seconds)
 {
-	pnlsr.scheduler.scheduleEvent(ndn::time::seconds(seconds),
+	pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(seconds),
 							ndn::bind(&interestManager::sendScheduledInfoInterest, this, 
 																									boost::ref(pnlsr),seconds));
 }
diff --git a/nlsr_im.hpp b/nlsr_im.hpp
index 7e3eb9c..de6ba74 100644
--- a/nlsr_im.hpp
+++ b/nlsr_im.hpp
@@ -18,8 +18,12 @@
 	}
   void processInterest(nlsr& pnlsr, const ptr_lib::shared_ptr<const Name> &name, 
 							            const ptr_lib::shared_ptr<const Interest> &interest);
+	void processInterestInfo(nlsr& pnlsr, string& neighbor, 
+							            const ptr_lib::shared_ptr<const Interest> &interest);
   void processInterestTimedOut(nlsr& pnlsr,
                  const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest);
+  void processInterestTimedOutInfo(nlsr& pnlsr, string& neighbor,
+                 const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest);
   void expressInterest(nlsr& pnlsr,const string& interestNamePrefix, int scope, 
                                                                    int seconds);
   void sendScheduledInfoInterest(nlsr& pnlsr, int seconds);
diff --git a/nlsr_tokenizer.cpp b/nlsr_tokenizer.cpp
index 7c82ecd..e03d2d2 100644
--- a/nlsr_tokenizer.cpp
+++ b/nlsr_tokenizer.cpp
@@ -57,16 +57,17 @@
 nlsrTokenizer::getTokenString(int from , int to){
 	string returnString;
 	if ( from >=0 && to < tokenList.size()){
-		int i=1;
+		int i=0;
 		for(std::list<string>::iterator it=tokenList.begin();
 													it!=tokenList.end();it++){
+			i++;
 			if( i >= from && i<= to ){
 				string oneToken((*it));
 				returnString+=seps;
 				returnString+=oneToken;
 				
 			}
-			i++;
+			
 		}
 	}
 
@@ -78,16 +79,17 @@
 nlsrTokenizer::getTokenString(int from){
 	string returnString;
 	if ( from >=0 && from < tokenList.size()){
-		int i=1;
+		int i=0;
 		for(std::list<string>::iterator it=tokenList.begin();
 													it!=tokenList.end();it++){
+			i++;
 			if( i >= from){
 				string oneToken((*it));
 				returnString+=seps;
 				returnString+=oneToken;
 				
 			}
-			i++;
+			
 		}
 	}
 
