diff --git a/nlsr.cpp b/nlsr.cpp
index 145fa47..a21aa3f 100644
--- a/nlsr.cpp
+++ b/nlsr.cpp
@@ -65,7 +65,7 @@
 	
 	
 /* debugging purpose start */
-	cout <<	nlsr.getConfParameter(); ;
+	cout <<	nlsr.getConfParameter();
 	nlsr.getAdl().printAdl();
 	nlsr.getNpl().printNpl();
 	nlsr.getLsdb().printNameLsdb();
diff --git a/nlsr.hpp b/nlsr.hpp
index c78caac..8b325fe 100644
--- a/nlsr.hpp
+++ b/nlsr.hpp
@@ -33,6 +33,10 @@
     , nameLsaSeq(0)
     , adjLsaSeq(0)
     , corLsaSeq(0)
+    , adjBuildCount(0)
+    , isBuildAdjLsaSheduled(0)
+    , isRouteCalculationScheduled(0)
+    , isRoutingTableCalculating(0)
 	{
 		isDaemonProcess=false;
 		configFileName="nlsr.conf";	
@@ -49,6 +53,10 @@
     , im()
     , dm()
     , nlsrLsdb()
+    , adjBuildCount(0)
+    , isBuildAdjLsaSheduled(0)
+    , isRouteCalculationScheduled(0)
+    , isRoutingTableCalculating(0)
 	{
 		isDaemonProcess=false;
 		configFileName=confFile;
@@ -151,7 +159,32 @@
 	void setCorLsaSeq(uint32_t clsn){
 		corLsaSeq=clsn;
 	}
-		
+
+	long int getAdjBuildCount()
+	{
+		return adjBuildCount;
+	}
+
+	void incrementAdjBuildCount()
+	{
+		adjBuildCount++;
+	}
+
+	void setAdjBuildCount(long int abc)
+	{
+		adjBuildCount=abc;
+	}
+
+	int getIsBuildAdjLsaSheduled()
+	{
+		return isBuildAdjLsaSheduled;
+	}
+
+	void setIsBuildAdjLsaSheduled(int iabls)
+	{
+		isBuildAdjLsaSheduled=iabls;
+	}
+	
 private:
 	ConfParameter confParam;
 	Adl adl;
@@ -168,6 +201,11 @@
 	uint32_t nameLsaSeq;
 	uint32_t adjLsaSeq;
 	uint32_t corLsaSeq;
+
+	long int adjBuildCount;
+	int isBuildAdjLsaSheduled;
+	int isRouteCalculationScheduled;
+	int isRoutingTableCalculating;
 	
 
 };
diff --git a/nlsr_adl.cpp b/nlsr_adl.cpp
index 0cbdb4a..0f4be8f 100644
--- a/nlsr_adl.cpp
+++ b/nlsr_adl.cpp
@@ -3,6 +3,7 @@
 
 #include "nlsr_adl.hpp"
 #include "nlsr_adjacent.hpp"
+#include "nlsr.hpp"
 
 Adl::Adl(){
 }
@@ -151,6 +152,51 @@
 	return adjList;
 }
 
+bool
+Adl::isAdjLsaBuildable(nlsr& pnlsr)
+{
+	int nbrCount=0;
+	for( std::list<Adjacent>::iterator it=adjList.begin(); 
+	                                                   it!= adjList.end() ; it++)
+	{
+		if ( ((*it).getStatus() == 1 ) )
+		{
+			nbrCount++;
+		}
+		else
+		{
+			if ( (*it).getInterestTimedOutNo() >= 
+				                       pnlsr.getConfParameter().getInterestRetryNumber())
+			{
+					nbrCount++;
+			}
+		} 
+	}
+
+	if( nbrCount == adjList.size())
+	{
+		return true;
+	}
+
+	return false;
+}
+
+int 
+Adl::getNumOfActiveNeighbor()
+{
+	int actNbrCount=0;
+	for( std::list<Adjacent>::iterator it=adjList.begin(); 
+	                                                   it!= adjList.end() ; it++)
+	{
+		if ( ((*it).getStatus() == 1 ) )
+		{
+			actNbrCount++;
+		}
+	}
+
+	return actNbrCount;
+}
+
 // used for debugging purpose
 void
 Adl::printAdl(){
diff --git a/nlsr_adl.hpp b/nlsr_adl.hpp
index 71829c1..d6923e1 100644
--- a/nlsr_adl.hpp
+++ b/nlsr_adl.hpp
@@ -5,6 +5,8 @@
 #include "nlsr_adjacent.hpp"
 #include<list>
 
+class nlsr;
+
 using namespace std;
 
 class Adl{
@@ -23,6 +25,14 @@
 	void setStatusOfNeighbor(string& neighbor, int status);
 	void setTimedOutInterestCount(string& neighbor, int count);
 
+	bool isAdjLsaBuildable(nlsr& pnlsr);
+	int getNumOfActiveNeighbor();
+
+	int getAdlSize()
+	{
+		return adjList.size();
+	}
+
 	void printAdl();
 
 private:	
diff --git a/nlsr_conf_param.hpp b/nlsr_conf_param.hpp
index ce56c72..817bf2e 100644
--- a/nlsr_conf_param.hpp
+++ b/nlsr_conf_param.hpp
@@ -7,17 +7,12 @@
 
 class ConfParameter{
 	
-	public:
-		ConfParameter()
-			:chronosyncSyncPrefix("ndn/nlsr/sync")
-			,chronosyncLsaPrefix("/ndn/nlsr/LSA")
+public:
+	ConfParameter()
+		:chronosyncSyncPrefix("ndn/nlsr/sync")
+		,chronosyncLsaPrefix("/ndn/nlsr/LSA")
 		{
-			adjBuildFlag=0;
-        		adjBuildCount=0;
-        		isBuildAdjLsaSheduled=0;
-        		isRouteCalculationScheduled=0;
-			isRoutingTableCalculating=0;
-        		isStrictHierchicalKeyCheck=0;
+      isStrictHierchicalKeyCheck=0;
 
 			interestRetryNumber=3;
 			interestResendTime=5;
@@ -27,10 +22,8 @@
 			maxFacesPerPrefix=0;
 			tunnelType=0;
 			detailedLogging=0;
-        		debugging=0;
-			isHyperbolicCalc=0;
-			
-			
+      debugging=0;
+			isHyperbolicCalc=0;	
 		}
 
 		void setRouterName(const string& rn){  
@@ -206,13 +199,6 @@
 	double corTheta;
 
 	int tunnelType;
-
-	int adjBuildFlag;
-	long int adjBuildCount;
-	int isBuildAdjLsaSheduled;
-	int isRouteCalculationScheduled;
-
-	int isRoutingTableCalculating;
 	int isStrictHierchicalKeyCheck;
 
 };
diff --git a/nlsr_dm.cpp b/nlsr_dm.cpp
index 7b958de..1ff7555 100644
--- a/nlsr_dm.cpp
+++ b/nlsr_dm.cpp
@@ -6,6 +6,7 @@
 #include "nlsr.hpp"
 #include "nlsr_dm.hpp"
 #include "nlsr_tokenizer.hpp"
+#include "nlsr_lsdb.hpp"
 
 using namespace std;
 using namespace ndn;
@@ -40,28 +41,43 @@
 	string chkString("info");
 	string neighbor="/" + nt.getFirstToken()
 							+nt.getTokenString(0,nt.getTokenPosition(chkString)-1);
-	int status=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
+	int oldStatus=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<<"Status: "<< oldStatus << 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);
+	int newStatus=pnlsr.getAdl().getStatusOfNeighbor(neighbor);
 	infoIntTimedOutCount=pnlsr.getAdl().getTimedOutInterestCount(neighbor);
 
 	//debugging purpose
 	cout <<"After Updates: " <<endl;
 	cout <<"Neighbor : "<<neighbor<<endl;
-	cout<<"Status: "<< status << endl;
+	cout<<"Status: "<< newStatus << endl;
 	cout<<"Info Interest Timed out: "<< infoIntTimedOutCount <<endl;
 	//debugging purpose end
 
-	/* Need to schedule event for Adjacency LSA building */
+	if ( ( oldStatus-newStatus)!= 0 ) // change in Adjacency list
+	{
+		pnlsr.incrementAdjBuildCount();
+		/* Need to schedule event for Adjacency LSA building */
+		if ( pnlsr.getIsBuildAdjLsaSheduled() == 0 )
+		{
+			pnlsr.setIsBuildAdjLsaSheduled(1);
+			// event here
+			pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
+							ndn::bind(&Lsdb::scheduledAdjLsaBuild, pnlsr.getLsdb(), 
+																									boost::ref(pnlsr)));
+		}
+		
+	}
+
+	
 	
 }
diff --git a/nlsr_im.cpp b/nlsr_im.cpp
index a29fac9..cdcba5f 100644
--- a/nlsr_im.cpp
+++ b/nlsr_im.cpp
@@ -7,6 +7,7 @@
 #include "nlsr_im.hpp"
 #include "nlsr_dm.hpp"
 #include "nlsr_tokenizer.hpp"
+#include "nlsr_lsdb.hpp"
 
 using namespace std;
 using namespace ndn;
@@ -98,7 +99,15 @@
 	  (infoIntTimedOutCount == pnlsr.getConfParameter().getInterestRetryNumber()))
 	{
 		pnlsr.getAdl().setStatusOfNeighbor(neighbor,0);
-		// schedule event for building adjacency LSA
+		pnlsr.incrementAdjBuildCount();
+		if ( pnlsr.getIsBuildAdjLsaSheduled() == 0 )
+		{
+			pnlsr.setIsBuildAdjLsaSheduled(1);
+			// event here
+			pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(5),
+							ndn::bind(&Lsdb::scheduledAdjLsaBuild,pnlsr.getLsdb(), 
+																									boost::ref(pnlsr)));
+		}
 	}
 	
 }
diff --git a/nlsr_lsa.cpp b/nlsr_lsa.cpp
index a92687e..5495859 100644
--- a/nlsr_lsa.cpp
+++ b/nlsr_lsa.cpp
@@ -4,6 +4,7 @@
 
 #include "nlsr_lsa.hpp"
 #include "nlsr_npl.hpp"
+#include "nlsr_adjacent.hpp"
 
 using namespace std;
 
@@ -15,7 +16,7 @@
 	return key;
 }
 
-NameLsa::NameLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, Npl& npl)
+NameLsa::NameLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, Npl npl)
 {
 	origRouter=origR;
 	lsType=lst;
@@ -110,3 +111,68 @@
 	return os;
 }
 
+
+AdjLsa::AdjLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, 
+	                                                        uint32_t nl ,Adl padl)
+{
+	origRouter=origR;
+	lsType=lst;
+	lsSeqNo=lsn;
+	lifeTime=lt;
+	noLink=nl;
+
+	std::list<Adjacent> al=padl.getAdjList();
+	for( std::list<Adjacent>::iterator it=al.begin(); it != al.end(); it++)
+	{
+		if((*it).getStatus()==1)
+		{
+				addAdjacentToLsa((*it));
+		}
+	}
+}
+
+string 
+AdjLsa::getAdjLsaData(){
+	string adjLsaData;
+	adjLsaData=origRouter + "|" + boost::lexical_cast<std::string>(lsType) + "|" 
+	    + boost::lexical_cast<std::string>(lsSeqNo) + "|" 
+	    + boost::lexical_cast<std::string>(lifeTime);
+	adjLsaData+="|";
+	adjLsaData+=boost::lexical_cast<std::string>(adl.getAdlSize());
+
+	std::list<Adjacent> al=adl.getAdjList();
+	for( std::list<Adjacent>::iterator it=al.begin(); it != al.end(); it++)
+	{
+		adjLsaData+="|";
+		adjLsaData+=(*it).getAdjacentName();
+		adjLsaData+="|";
+		adjLsaData+=boost::lexical_cast<std::string>((*it).getConnectingFace());
+		adjLsaData+="|";
+		adjLsaData+=boost::lexical_cast<std::string>((*it).getLinkCost());
+		
+	}
+	return adjLsaData;
+}
+
+std::ostream& 
+operator<<(std::ostream& os, AdjLsa& aLsa) 
+{
+	os<<"Adj Lsa: "<<endl;
+	os<<"  Origination Router: "<<aLsa.getOrigRouter()<<endl;
+	os<<"  Ls Type: "<<(unsigned short)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;
+	os<<"  Adjacents: "<<endl;
+	int i=1;
+	std::list<Adjacent> al=aLsa.getAdl().getAdjList();
+	for( std::list<Adjacent>::iterator it=al.begin(); it != al.end(); it++)
+	{
+		os<<"    Adjacent "<<i<<": "<<endl;
+		os<<"      Adjacent Name: "<<(*it).getAdjacentName()<<endl;
+		os<<"      Connecting Face: "<<(*it).getConnectingFace()<<endl;
+		os<<"      Link Cost: "<<(*it).getLinkCost()<<endl;
+	}
+	
+	return os;  
+}
diff --git a/nlsr_lsa.hpp b/nlsr_lsa.hpp
index 18a09d3..225229f 100644
--- a/nlsr_lsa.hpp
+++ b/nlsr_lsa.hpp
@@ -73,7 +73,7 @@
 		setLsType(1);
 	}
 
-	NameLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, Npl& npl);
+	NameLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, Npl npl);
 
 	Npl& getNpl(){
 		return npl;
@@ -100,6 +100,24 @@
 		: Lsa()
 		, adl()
 	{
+		setLsType(2);
+	}
+
+	AdjLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt, 
+	                                                        uint32_t nl ,Adl padl);
+	Adl& getAdl(){
+		return adl;
+	}
+
+	void addAdjacentToLsa(Adjacent adj)
+	{
+		adl.insert(adj);
+	}
+
+	string getAdjLsaData();
+	uint32_t getNoLink()
+	{
+		return noLink;
 	}
 
 private:
@@ -107,11 +125,15 @@
 	Adl adl;
 };
 
+std::ostream& 
+operator<<(std::ostream& os, AdjLsa& aLsa);
+
 class CorLsa:public Lsa{
 public:
 	CorLsa()
 		:Lsa()
 	{
+		setLsType(3);
 	}
 
 	CorLsa(string origR, uint8_t lst, uint32_t lsn, uint32_t lt
diff --git a/nlsr_lsdb.cpp b/nlsr_lsdb.cpp
index c6ae523..f62d12b 100644
--- a/nlsr_lsdb.cpp
+++ b/nlsr_lsdb.cpp
@@ -148,7 +148,7 @@
 bool 
 Lsdb::buildAndInstallOwnCorLsa(nlsr& pnlsr){
 	CorLsa corLsa(pnlsr.getConfParameter().getRouterPrefix()
-					, 1
+					, 3
 					, pnlsr.getCorLsaSeq()+1
 					, pnlsr.getConfParameter().getRouterDeadInterval()
 					, pnlsr.getConfParameter().getCorR()
@@ -248,7 +248,109 @@
 }
 
 
+void 
+Lsdb::scheduledAdjLsaBuild(nlsr& pnlsr)
+{
+	cout<<"scheduledAdjLsaBuild Called"<<endl;
+	pnlsr.setIsBuildAdjLsaSheduled(0);
 
+	if( pnlsr.getAdl().isAdjLsaBuildable(pnlsr))
+	{
+		int adjBuildCount=pnlsr.getAdjBuildCount();
+		if(adjBuildCount>0 )
+		{
+			if (pnlsr.getAdl().getNumOfActiveNeighbor()>0)
+			{
+				buildAndInstallOwnAdjLsa(pnlsr);
+			}
+			else
+			{
+				//remove if there is any adj lsa in LSDB
+			}
+			pnlsr.setAdjBuildCount(pnlsr.getAdjBuildCount()-adjBuildCount);
+		}		
+	}
+	else
+	{
+		pnlsr.setIsBuildAdjLsaSheduled(1);
+		int schedulingTime=pnlsr.getConfParameter().getInterestRetryNumber()*
+		                   pnlsr.getConfParameter().getInterestRetryNumber();
+		pnlsr.getScheduler().scheduleEvent(ndn::time::seconds(schedulingTime),
+							ndn::bind(&Lsdb::scheduledAdjLsaBuild, pnlsr.getLsdb(), 
+																									boost::ref(pnlsr)));
+	}
+
+}
+
+
+bool 
+Lsdb::addAdjLsa(AdjLsa &alsa)
+{
+	std::list<AdjLsa >::iterator it = std::find_if( adjLsdb.begin(), 
+																		adjLsdb.end(),	
+   																	bind(adjLsaCompare, _1, alsa));
+
+	if( it == adjLsdb.end()){
+		adjLsdb.push_back(alsa);
+		return true;
+	}
+	return false;
+	
+}
+
+AdjLsa& 
+Lsdb::getAdjLsa(string key)
+{
+	std::list<AdjLsa >::iterator it = std::find_if( adjLsdb.begin(), 
+																		adjLsdb.end(),	
+   																	bind(adjLsaCompareByKey, _1, key));
+
+	if( it != adjLsdb.end()){
+		return (*it);
+	}
+	
+}
+
+bool 
+Lsdb::installAdjLsa(AdjLsa &alsa)
+{
+	bool doesLsaExist_ = doesAdjLsaExist(alsa.getLsaKey());
+	if ( !doesLsaExist_ )
+	{
+		// add Adj LSA
+		addAdjLsa(alsa);
+		// schedule routing table calculation
+	}
+	else
+	{
+		// check for newer name LSA
+		AdjLsa oldAdjLsa=getAdjLsa(alsa.getLsaKey());
+		
+	}
+
+	printAdjLsdb();
+	
+	return true;
+}
+
+bool 
+Lsdb::buildAndInstallOwnAdjLsa(nlsr& pnlsr)
+{
+	AdjLsa adjLsa(pnlsr.getConfParameter().getRouterPrefix()
+					, 2
+					, pnlsr.getAdjLsaSeq()+1
+					, pnlsr.getConfParameter().getRouterDeadInterval()
+					, pnlsr.getAdl().getNumOfActiveNeighbor()
+					, pnlsr.getAdl() );
+	pnlsr.setAdjLsaSeq(pnlsr.getAdjLsaSeq()+1);
+	return installAdjLsa(adjLsa);
+}
+
+bool 
+Lsdb::removeAdjLsa(string& key)
+{
+	
+}
 
 bool 
 Lsdb::doesAdjLsaExist(string key)
@@ -264,4 +366,13 @@
 	return true;
 }
 
+void 
+Lsdb::printAdjLsdb()
+{
+	for( std::list<AdjLsa>::iterator it=adjLsdb.begin(); 
+	                                                 it!= adjLsdb.end() ; it++)
+	{
+		cout<< (*it) <<endl;
+	}
+}
 
diff --git a/nlsr_lsdb.hpp b/nlsr_lsdb.hpp
index 0b0e664..58e0d53 100644
--- a/nlsr_lsdb.hpp
+++ b/nlsr_lsdb.hpp
@@ -28,14 +28,26 @@
 	bool installCorLsa(CorLsa &clsa);
 	bool removeCorLsa(string& key);
 	void printCorLsdb(); //debugging
+
+	//function related to Cor LSDB
+	void scheduledAdjLsaBuild(nlsr& pnlsr);
+	bool buildAndInstallOwnAdjLsa(nlsr& pnlsr);
+	bool removeAdjLsa(string& key);
+	bool installAdjLsa(AdjLsa &alsa);
+	AdjLsa& getAdjLsa(string key);
+	void printAdjLsdb();
 	
 private:
 	bool addNameLsa(NameLsa &nlsa);
-	bool addCorLsa(CorLsa& clsa);
 	bool doesNameLsaExist(string key);
-	bool doesAdjLsaExist(string key);
+	
+	bool addCorLsa(CorLsa& clsa);
 	bool doesCorLsaExist(string key);
 
+	bool addAdjLsa(AdjLsa &alsa);
+	bool doesAdjLsaExist(string key);
+	
+
 private:
 	std::list<NameLsa> nameLsdb;
 	std::list<AdjLsa> adjLsdb;
