diff --git a/src/iterative-query.cpp b/src/iterative-query.cpp
index 989634a..2f4da51 100644
--- a/src/iterative-query.cpp
+++ b/src/iterative-query.cpp
@@ -22,86 +22,87 @@
 namespace ndns {
 
 IterativeQuery::IterativeQuery(const Query& query)
-: m_step(IterativeQuery::NSQuery)
-, m_tryNum(0)
-, m_tryMax(2)
-, m_query(query)
-, m_finishedLabelNum(0)
-, m_rrLabelLen(1)
-, m_authZoneIndex(0)
+  : m_step(IterativeQuery::NSQuery)
+  , m_tryNum(0)
+  , m_tryMax(2)
+  , m_query(query)
+  , m_finishedLabelNum(0)
+  , m_lastFinishedLabelNum(0)
+  , m_rrLabelLen(1)
+  , m_authZoneIndex(0)
 {
 }
 
-
-bool
-IterativeQuery::doTimeout()
+bool IterativeQuery::doTimeout()
 {
   abort();
   return false;
 }
 
-void
-IterativeQuery::abort(){
-  std::cout<<(*this);
-  std::cout<<std::endl;
-}
+void IterativeQuery::abort()
+ {
+  std::cout<<"Abort the Resolving"<<std::endl;
+   std::cout << (*this);
+   std::cout << std::endl;
+ }
 
-void
-IterativeQuery::doData(Data& data)
+void IterativeQuery::doData(Data& data)
 {
-  std::cout<<"[* -> *] resolve Data: "<<data.getName().toUri()<<std::endl;
+  std::cout << "[* -> *] resolve Data: " << data.getName().toUri() << std::endl;
   Response re;
   re.fromData(data);
-  std::cout<<re<<std::endl;
+  std::cout << re << std::endl;
 
-  if (re.getResponseType() == Response::UNKNOWN)
-  {
-    std::cout<<"[* !! *] unknown content type and exit";
+  if (re.getResponseType() == Response::UNKNOWN) {
+    std::cout << "[* !! *] unknown content type and exit";
     m_step = Abort;
     abort();
     return;
-  }
-  else if (re.getResponseType() == Response::NDNS_Nack)
-  {
-      if (m_step == NSQuery) {
-        //In fact, there are two different situations
-        //1st: /net/ndnsim/DNS/www/NS is nacked
-        //2st: /net/DNS/ndnsim/www/NS is nacked
-        m_step = RRQuery;
+  } else if (re.getResponseType() == Response::NDNS_Nack) {
+    if (m_step == NSQuery) {
+      //In fact, there are two different situations
+      //1st: /net/ndnsim/DNS/www/NS is nacked
+      //2st: /net/DNS/ndnsim/www/NS is nacked
+      m_step = RRQuery;
 
-      } else if (m_step == RRQuery)
-      {
-        m_step = AnswerStub;
+      if (m_query.getRrType() == RR::NDNCERT && m_rrLabelLen == 1) {
+        //here working for KSK and NDNCERT when get a Nack
+        //e.g., /net/ndnsim/ksk-1, ksk-1 returns nack, but it should query /net
+
+        Name dstLabel = m_query.getRrLabel();
+        Name label = dstLabel.getSubName(m_finishedLabelNum, m_rrLabelLen);
+        if (boost::starts_with(label.toUri(), "/ksk") || boost::starts_with(label.toUri(), "/KSK")) {
+          m_finishedLabelNum = m_lastFinishedLabelNum;
+        }
+
       }
-      m_lastResponse = re;
-  }
-  else if (re.getResponseType() == Response::NDNS_Auth)
-  { // need more specific info
-    m_rrLabelLen += 1;
+    } else if (m_step == RRQuery) {
+      m_step = AnswerStub;
+    }
 
-  }
-  else if (re.getResponseType() == Response::NDNS_Resp)
-  {// get the intermediate answer
+    m_lastResponse = re;
+  } else if (re.getResponseType() == Response::NDNS_Auth) { // need more specific info
+    m_rrLabelLen += 1;
+  } else if (re.getResponseType() == Response::NDNS_Resp) { // get the intermediate answer
     if (m_step == NSQuery) {
       //do nothing, step NSQuery
+      m_lastFinishedLabelNum = m_finishedLabelNum;
       m_finishedLabelNum += m_rrLabelLen;
       m_rrLabelLen = 1;
       m_authZoneIndex = 0;
       m_lastResponse = re;
 
-    } else if (m_step == RRQuery)
-    { // final resolver gets result back
+    } else if (m_step == RRQuery) { // final resolver gets result back
       m_step = AnswerStub;
       m_lastResponse = re;
     }
 
-    std::cout<<"get RRs: "<<m_lastResponse.getStringRRs()<<std::endl;
+    std::cout << "get RRs: " << m_lastResponse.getStringRRs() << std::endl;
   }
 
 }
 
-const Interest
-IterativeQuery::toLatestInterest()
+const Interest IterativeQuery::toLatestInterest()
 {
   Query query = Query();
   Name dstLabel = m_query.getRrLabel();
@@ -111,23 +112,25 @@
   Name label;
   if (m_step == RRQuery) {
     label = dstLabel.getSubName(m_finishedLabelNum);
-  }
-  else {
+  } else {
     label = dstLabel.getSubName(m_finishedLabelNum, m_rrLabelLen);
   }
   query.setAuthorityZone(authZone);
   query.setRrLabel(label);
 
-  if (m_step == NSQuery)
-  {
+  if (m_step == NSQuery) {
     query.setRrType(RR::NS);
     query.setQueryType(Query::QUERY_DNS);
-  } else if (m_step == RRQuery)
-  {
+  } else if (m_step == RRQuery) {
     query.setRrType(m_query.getRrType());
-    query.setQueryType(Query::QUERY_DNS);
-  } else if (m_step == AnswerStub)
-  {
+    if (m_query.getRrType() == RR::NDNCERT) {
+      query.setQueryType(Query::QUERY_KEY);
+      query.setQueryType(Query::QUERY_DNS);
+    } else {
+      query.setQueryType(Query::QUERY_DNS);
+    }
+
+  } else if (m_step == AnswerStub) {
     query.setRrType(m_query.getRrType());
     query.setQueryType(Query::QUERY_DNS);
   }
