Data Passing for Info Interest
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++;
+			
 		}
 	}