diff --git a/nlsr_km.c b/nlsr_km.c
index 81c4a80..e3fa463 100644
--- a/nlsr_km.c
+++ b/nlsr_km.c
@@ -156,25 +156,6 @@
 }
 
 
-/*
-int
-process_incoming_content(struct ccn_closure* selfp, 
-												struct ccn_upcall_info* info){
-
-	printf("process_incoming_content called\n");
-
-	int res=verify_key(info->content_ccnb,info->pco->offset[CCN_PCO_E],info->pco);
-
-	if ( res != 0 ){
-		printf("Error in verfiying keys !! :( \n");
-	}
-	else{
-		printf("Key verification is successful :)\n");
-	}
-	return 0;
-}
-*/
-
 char * 
 get_orig_router_from_lsa_name(struct ccn_charbuf * content_name)
 {
@@ -188,7 +169,7 @@
 
 	struct ccn_indexbuf *components=ccn_indexbuf_create();
 	struct ccn_charbuf *name=ccn_charbuf_create();
-	ccn_name_from_uri(name,"/ndn/routing/nlsr/LSA");
+	ccn_name_from_uri(name,nlsr->slice_prefix);
 	ccn_name_split (name, components);
 	start=components->n-2;
 	ccn_charbuf_destroy(&name);
@@ -232,11 +213,47 @@
 }
 
 
+char * 
+get_orig_router_from_info_content_name(struct ccn_charbuf * content_name)
+{
+	int start,end;
+
+	start=0;
+
+	struct ccn_indexbuf *comps=ccn_indexbuf_create();
+	ccn_name_split (content_name, comps);
+
+	end=check_for_name_component_in_name(content_name,comps,"nlsr");
+
+
+	struct ccn_charbuf *temp=ccn_charbuf_create();
+	ccn_name_init(temp);	
+	ccn_name_append_components( temp,	content_name->buf,
+								comps->buf[start], 
+								comps->buf[end]);
+
+	struct ccn_charbuf *temp1=ccn_charbuf_create();
+	ccn_uri_append(temp1, temp->buf, temp->length, 0);
+
+	char *orig_router=(char *)calloc(strlen(ccn_charbuf_as_string(temp1))+1,
+																sizeof(char));
+	memcpy(orig_router,ccn_charbuf_as_string(temp1),
+										strlen(ccn_charbuf_as_string(temp1)));
+	orig_router[strlen(orig_router)]='\0';
+	
+	ccn_charbuf_destroy(&temp);
+	ccn_charbuf_destroy(&temp1);
+	ccn_indexbuf_destroy(&comps);
+	return orig_router;
+	
+
+}
+
 
 int 
 check_key_name_hierarchy(const unsigned char *ccnb, 
 										struct ccn_parsed_ContentObject *pco,
-																int key_type){
+										int key_type, int content_type){
 	printf("check_key_name_hierarchy called\n");	
 	if (key_type == UNKNOWN_KEY ){
 		return 1;
@@ -260,7 +277,13 @@
 	
 	if ( key_type == NLSR_KEY){
 		char *orig_router_key_name=get_orig_router_from_key_name(key_name,0,0);
-		char *orig_router_content_name=get_orig_router_from_lsa_name(content_name);
+		char *orig_router_content_name;
+		if ( content_type == 1 ){
+			orig_router_content_name=get_orig_router_from_lsa_name(content_name);
+		}
+		else if ( content_type == 0 ){
+			orig_router_content_name=get_orig_router_from_info_content_name(content_name);
+		}
 		printf("Orig Router (Key Name):%s\n",orig_router_key_name);
 		printf("Orig Router (Content Name):%s\n",orig_router_content_name);
 
@@ -354,7 +377,8 @@
 
 int 
 verify_key(const unsigned char *ccnb, 
-										struct ccn_parsed_ContentObject *pco){
+		struct ccn_parsed_ContentObject *pco,
+		int content_type){
 	if ( nlsr->debugging )
 		printf("verify key called\n");
 	int ret=-1;
@@ -383,7 +407,7 @@
 
 		if ( chk_verify == 0 ){
 			if ( nlsr->debugging )
-				printf("Verification Successful :)\n");
+				printf("Content verification Successful :)\n");
 
 			if ( counter == 3){
 				if ( nlsr->debugging )
@@ -394,15 +418,17 @@
 					ret=0;
 				}
 				else{
-					//ret=verify_key(result->buf,&temp_pco);
 					if ( nlsr->isStrictHierchicalKeyCheck ){
-						int key_name_test=check_key_name_hierarchy(ccnb,pco,key_type);
+						int key_name_test=check_key_name_hierarchy(ccnb,
+																	pco,
+																	key_type,
+																	content_type);
 						if ( key_name_test == 1){
-							ret=verify_key(result->buf,&temp_pco);
+							ret=verify_key(result->buf,&temp_pco,content_type);
 						}
 					}
 					else{ 
-						ret=verify_key(result->buf,&temp_pco);
+						ret=verify_key(result->buf,&temp_pco,content_type);
 					}
 				}
 			}
diff --git a/nlsr_km.h b/nlsr_km.h
index 59847f5..bb935fa 100644
--- a/nlsr_km.h
+++ b/nlsr_km.h
@@ -30,6 +30,7 @@
 					struct ccn_parsed_ContentObject *pco);
 
 int verify_key(const unsigned char *ccnb, 
-					struct ccn_parsed_ContentObject *pco);
+				struct ccn_parsed_ContentObject *pco,
+				int content_type);
 
 #endif
diff --git a/nlsr_ndn.c b/nlsr_ndn.c
index aa58904..b43a57d 100644
--- a/nlsr_ndn.c
+++ b/nlsr_ndn.c
@@ -499,7 +499,6 @@
 		writeLogg(__FILE__,__FUNCTION__,__LINE__,"process_incoming_content_info"
 																" called \n");
 
-	//int res;
 	struct name_prefix *nbr=(struct name_prefix *)malloc(sizeof(struct name_prefix ));
 	get_nbr(nbr,selfp,info);
 
@@ -513,54 +512,38 @@
 	
 
 	if ( contain_key_name(info->content_ccnb, info->pco) == 1){
-		//struct ccn_charbuf *key_name=get_key_name(info->content_ccnb, info->pco);
-		//struct ccn_charbuf *orig_router_kn=ccn_charbuf_create();
-		//res=get_orig_router_from_key_name(orig_router_kn,key_name);
-		//if( res == 0){
-			//struct ccn_charbuf *rtr_uri = ccn_charbuf_create();
-			//ccn_uri_append(rtr_uri, orig_router_kn->buf,
-			//										orig_router_kn->length, 0);
-			//printf("Orig Router from Key name: %s\n",
-			//									ccn_charbuf_as_string(rtr_uri));
-					
-			//if( strcmp(nbr->name,ccn_charbuf_as_string(rtr_uri)) == 0){
 						
-				int res_verify=verify_key(info->content_ccnb,info->pco);
+		int res_verify=verify_key(info->content_ccnb,info->pco,0);
 
-				if ( res_verify != 0 ){
-					printf("Error in verfiying keys !! :( \n");
-				}
-				else{
-					printf("Key verification is successful :)\n");
-					update_adjacent_timed_out_zero_to_adl(nbr);	
-					update_adjacent_status_to_adl(nbr,NBR_ACTIVE);
-					print_adjacent_from_adl();
+		if ( res_verify != 0 ){
+			printf("Error in verfiying keys !! :( \n");
+		}
+		else{
+			printf("Key verification is successful :)\n");
+			update_adjacent_timed_out_zero_to_adl(nbr);	
+			update_adjacent_status_to_adl(nbr,NBR_ACTIVE);
+			print_adjacent_from_adl();
 
-					if(!nlsr->is_build_adj_lsa_sheduled){
-						if ( nlsr->debugging )
-							printf("Scheduling Build and Install Adj LSA...\n");
-						if ( nlsr->detailed_logging )
-							writeLogg(__FILE__,__FUNCTION__,__LINE__,"Scheduling"
+			if(!nlsr->is_build_adj_lsa_sheduled){
+				if ( nlsr->debugging )
+					printf("Scheduling Build and Install Adj LSA...\n");
+				if ( nlsr->detailed_logging )
+					writeLogg(__FILE__,__FUNCTION__,__LINE__,"Scheduling"
 									 "Build and Install Adj LSA...\n");
-						nlsr->event_build_adj_lsa = ccn_schedule_event(
+				nlsr->event_build_adj_lsa = ccn_schedule_event(
 														nlsr->sched, 100000, 
 										&build_and_install_adj_lsa, NULL, 0);
-						nlsr->is_build_adj_lsa_sheduled=1;			
-					}
-					else{
-						if ( nlsr->debugging )
-							printf("Build and Install Adj LSA already scheduled\n");
-						if ( nlsr->detailed_logging )
-							writeLogg(__FILE__,__FUNCTION__,__LINE__,"Build and Install Adj LSA"
+				nlsr->is_build_adj_lsa_sheduled=1;			
+			}
+			else{
+				if ( nlsr->debugging )
+					printf("Build and Install Adj LSA already scheduled\n");
+				if ( nlsr->detailed_logging )
+					writeLogg(__FILE__,__FUNCTION__,__LINE__,"Build and Install Adj LSA"
 														" already scheduled\n");
-					}
+			}
 
-				}
-			//}
-			//ccn_charbuf_destroy(&rtr_uri);
-		//}
-		//ccn_charbuf_destroy(&key_name);
-		//ccn_charbuf_destroy(&orig_router_kn);	
+		}	
 	}
 	/*
 					update_adjacent_timed_out_zero_to_adl(nbr);	
diff --git a/nlsr_sync.c b/nlsr_sync.c
index bc5eb43..c673259 100644
--- a/nlsr_sync.c
+++ b/nlsr_sync.c
@@ -239,39 +239,23 @@
 			int chk_cont=ccn_parse_ContentObject(ptr,length,&pcobuf1,NULL);
 			printf("Content Parsing result: %d\n",chk_cont); 
 			if ( contain_key_name(ptr, &pcobuf1) == 1){
-				//struct ccn_charbuf *key_name=get_key_name(ptr, &pcobuf1);
-				//struct ccn_charbuf *orig_router_kn=ccn_charbuf_create();
-				//res=get_orig_router_from_key_name(orig_router_kn,key_name);
-				//if( res == 0){
-					//struct ccn_charbuf *rtr_uri = ccn_charbuf_create();
-					//ccn_uri_append(rtr_uri, orig_router_kn->buf,
-					//								orig_router_kn->length, 0);
-					//printf("Orig Router from Key name: %s\n",
-					//							ccn_charbuf_as_string(rtr_uri));
-					
-					//if( strcmp(orig_router,ccn_charbuf_as_string(rtr_uri)) == 0){
 						
-						int res_verify=verify_key(ptr,&pcobuf1);
+				int res_verify=verify_key(ptr,&pcobuf1,1);
 
-						if ( res_verify != 0 ){
-							printf("Error in verfiying keys !! :( \n");
-						}
-						else{
-							printf("Key verification is successful :)\n");
-							ptr_in=ptr;
-							length_in=length;
-							ccn_content_get_value(ptr_in, length_in, &pcobuf1, 
+				if ( res_verify != 0 ){
+						printf("Error in verfiying keys !! :( \n");
+				}
+				else{
+					printf("Key verification is successful :)\n");
+					ptr_in=ptr;
+					length_in=length;
+					ccn_content_get_value(ptr_in, length_in, &pcobuf1, 
 															&ptr_in, &length_in);
-							*content_data = (unsigned char *) calloc(length_in, 
+					*content_data = (unsigned char *) calloc(length_in, 
 																sizeof(char *));
-							memcpy (*content_data, ptr_in, length_in);
-							ret=0;
-						}
-					//}
-					//ccn_charbuf_destroy(&rtr_uri);
-				//}
-				//ccn_charbuf_destroy(&key_name);
-				//ccn_charbuf_destroy(&orig_router_kn);	
+					memcpy (*content_data, ptr_in, length_in);
+					ret=0;
+				}
 			}
 		}
 	}
