support for NS, TXT, NDNCERT, FH
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);
   }