diff --git a/nlsr.cpp b/nlsr.cpp
index 248382e..cff9c3c 100644
--- a/nlsr.cpp
+++ b/nlsr.cpp
@@ -5,115 +5,40 @@
 #include <cstdlib>
 
 #include "nlsr.hpp"
-#include "conf_processor.hpp"
 #include "conf_param.hpp"
-#include "nlsr_tokenizer.hpp"
-#include "adl.hpp"
-#include "adjacent.hpp"
+#include "conf_processor.hpp"
 
 
 using namespace ndn;
 using namespace std;
 
-void 
-nlsr::processInterest(const ptr_lib::shared_ptr<const Name> &name, 
-							const ptr_lib::shared_ptr<const Interest> &interest)
-{
-
-	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"));
-
-    kChain.sign(data);
-
-    cout << ">> D: " << data << endl;
-    nlsrFace.put(data);
-}
-
 void
 nlsr::nlsrRegistrationFailed(const ptr_lib::shared_ptr<const Name>&)
 {
-	cerr << "ERROR: Failed to register prefix in local hub's daemon" << endl;
-    nlsrFace.shutdown();
+  cerr << "ERROR: Failed to register prefix in local hub's daemon" << endl;
+  nlsrFace.shutdown();
 }
 
+
 void
-nlsr::processContent(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
-								 const ndn::ptr_lib::shared_ptr<ndn::Data> &data)
+nlsr::setInterestFilterNlsr(const string& name)
 {
-
-	cout << "I: " << interest->toUri() << endl;
-  	cout << "D: " << data->getName().toUri() << endl;
-	cout << "Data Content: " << data->getContent() << endl;
-
-}
-
-void
-nlsr::processInterestTimedOut(
-				const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest)
-{
-	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;
-	}
-
-}
-
-void
-nlsr::setInterestFilterNlsr(const string& name){
-	nlsrFace.setInterestFilter(name,
-                        	func_lib::bind(&nlsr::processInterest, this, _1, _2),
+  nlsrFace.setInterestFilter(name,
+                        func_lib::bind(&interestManager::processInterest, &im, 
+                        boost::ref(*this), _1, _2),
                         func_lib::bind(&nlsr::nlsrRegistrationFailed, this, _1));
 }
 
+
 void
-nlsr::expressInterest(const string& interestNamePrefix, int scope, int seconds)
+nlsr::startEventLoop()
 {
-	Interest i((ndn::Name(interestNamePrefix)));
-    //i.setScope(scope);
-    i.setInterestLifetime(seconds*1000);
-    i.setMustBeFresh(true);
-
-	nlsrFace.expressInterest(i,
-                          ndn::func_lib::bind(&nlsr::processContent, this, _1, _2),
-                          ndn::func_lib::bind(&nlsr::processInterestTimedOut, this, _1));
-
-}
-
-
-void
-nlsr::scheduleInfoInterest(int seconds){
-	scheduler.scheduleEvent(ndn::time::seconds(seconds),
-							ndn::bind(&nlsr::sendScheduledInfoInterest, this,seconds));
-}
-
-void
-nlsr::sendScheduledInfoInterest(int seconds){
-
-	std::list<Adjacent> adjList=adl.getAdjList();
-	for(std::list<Adjacent>::iterator it	=adjList.begin(); it!= adjList.end(); ++it){
-		string adjName=(*it).getAdjacentName()+"/"+"info"+confParam.getRouterPrefix();
-		expressInterest(	adjName,2,confParam.getInterestResendTime());
-	}
-
-	scheduleInfoInterest(confParam.getInfoInterestInterval());
-}
-
-void
-nlsr::startEventLoop(){
 	nlsrFace.processEvents();
 }
 
 int 
-nlsr::usage(const string& progname){
+nlsr::usage(const string& progname)
+{
 
         cout << "Usage: " << progname << " [OPTIONS...]"<<endl;
         cout << "   NDN routing...." << endl;
@@ -138,9 +63,8 @@
 	nlsr.adl.printAdl();
 	nlsr.npl.printNpl();
 /* debugging purpose end */
-	nlsr.setInterestFilterNlsr("/ndn/memphis.edu/cs/pollux/");
-	
-	nlsr.scheduleInfoInterest(1);
+	nlsr.setInterestFilterNlsr(nlsr.confParam.getRouterPrefix());
+	nlsr.im.scheduleInfoInterest(nlsr,1);
 
 	
 	
diff --git a/nlsr.hpp b/nlsr.hpp
index c9f1032..495bf84 100644
--- a/nlsr.hpp
+++ b/nlsr.hpp
@@ -8,6 +8,8 @@
 #include "conf_param.hpp"
 #include "adl.hpp"
 #include "npl.hpp"
+#include "nlsr_im.hpp"
+#include "nlsr_dm.hpp"
 
 
 using namespace ndn;
@@ -15,64 +17,61 @@
 
 class nlsr
 {
-	public:
+public:
 	nlsr()
 		: io(ndn::make_shared<boost::asio::io_service>())
-        , nlsrFace(io)
+		, nlsrFace(io)
 		, scheduler(*io)
 		, configFileName()	
 		, confParam()
 		, adl()
 		, npl()
+    , im()
+    , dm()
 	{
 		isDaemonProcess=false;
 		configFileName="nlsr.conf";	
 	}
 
-	void processInterest(const ptr_lib::shared_ptr<const Name> &name, 
-							const ptr_lib::shared_ptr<const Interest> &interest);
-	void processContent(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
-								 const ndn::ptr_lib::shared_ptr<ndn::Data> &data);
 	void nlsrRegistrationFailed(const ptr_lib::shared_ptr<const Name>&);
-	void processInterestTimedOut(const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest);
 
 	void setInterestFilterNlsr(const string& name);
-
-	void expressInterest(const string& interestNamePrefix, int scope, int seconds);
-
-	//void scheduleSomeInterest(const string& interestName);
-
-	void sendScheduledInfoInterest(int seconds);
-	void scheduleInfoInterest(int seconds);
-
 	void startEventLoop();
 	
 	int usage(const string& progname);
 
-	string getConfFileName(){
+	string getConfFileName()
+  {
 		return configFileName;
 	}
 
-	void setConfFileName(const string& fileName){
-		configFileName=fileName;
-	}
+  void setConfFileName(const string& fileName)
+  {
+    configFileName=fileName;
+  }
 
-	bool isSetDaemonProcess(){
-		return isDaemonProcess;
-	}
+  bool isSetDaemonProcess()
+  {
+    return isDaemonProcess;
+  }
 
-	void setIsDaemonProcess(bool value){
-		isDaemonProcess=value;
-	}
+  void setIsDaemonProcess(bool value)
+  {
+    isDaemonProcess=value;
+  }
 
 	ConfParameter confParam;
 	Adl adl;
 	Npl npl;
-	private:
 	ndn::shared_ptr<boost::asio::io_service> io;
 	ndn::Scheduler scheduler;
 	ndn::Face nlsrFace;
 	ndn::KeyChain kChain;
+	interestManager im;
+	DataManager dm;
+
+private:
+	
 	bool isDaemonProcess;
 	string configFileName;
 
