diff --git a/src/app/name-caching-resolver.cpp b/src/app/name-caching-resolver.cpp
deleted file mode 100644
index 728d0b0..0000000
--- a/src/app/name-caching-resolver.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014, Regents of the University of California.
- *
- * This file is part of NDNS (Named Data Networking Domain Name Service).
- * See AUTHORS.md for complete list of NDNS authors and contributors.
- *
- * NDNS is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NDNS, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-#include "name-caching-resolver.hpp"
-
-namespace ndn {
-namespace ndns {
-
-NameCachingResolver::NameCachingResolver(const char *programName, const char *prefix)
-: NDNApp(programName, prefix)
-//, m_resolverType(CachingResolver)
-{
-  this->setInterestLifetime(time::milliseconds(2000));
-}
-
-
-
-void
-NameCachingResolver::run()
-{
-  boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
-  signalSet.async_wait(boost::bind(&NDNApp::signalHandler, this));
- // boost::bind(&NdnTlvPingServer::signalHandler, this)
-
-  Name name(m_prefix);
-  name.append(Query::toString(Query::QUERY_DNS_R));
-
-  m_face.setInterestFilter(name,
-               bind(&NameCachingResolver::onInterest,
-                  this, _1, _2),
-               bind(&NDNApp::onRegisterFailed,
-                  this, _1,_2));
-
-  std::cout << "\n=== NDNS Resolver "<<m_programName
-            <<" with routeble prefix "<< name.toUri()
-            << " starts===\n" << std::endl;
-
-  try {
-    m_face.processEvents();
-  }
-  catch (std::exception& e) {
-    std::cerr << "ERROR: " << e.what() << std::endl;
-    m_hasError = true;
-    m_ioService.stop();
-  }
-}
-
-
-
-void
-NameCachingResolver::onData(const Interest& interest, Data &data, IterativeQuery& iq)
-{
-  if (interest.getName() != iq.getLastInterest().getName())
-  {
-    std::cout<<iq<<std::endl;
-    std::cout<<"waiting for "<<iq.getLastInterest().getName().toUri()<<std::endl;
-    std::cout<<"coming data "<<data.getName().toUri()<<std::endl;
-    return;
-  }
-
-  iq.doData(data);
-
-  if (iq.getStep() == IterativeQuery::AnswerStub)
-  {
-    Data data = iq.getLastResponse().toData();
-    Name name = iq.getQuery().getAuthorityZone();
-    name.append(Query::toString(iq.getQuery().getQueryType()));
-    name.append(iq.getQuery().getRrLabel());
-    name.append(RR::toString(iq.getQuery().getRrType()));
-    name.appendVersion();
-    data.setName(name);
-    data.setFreshnessPeriod(iq.getLastResponse().getFreshness());
-
-    m_keyChain.sign(data);
-    m_face.put(data);
-    std::cout<<"[* <- *] answer Response ("
-        <<Response::toString(iq.getLastResponse().getResponseType())<<") to stub:"<<std::endl;
-    std::cout<<iq.getLastResponse()<<std::endl;
-    for (int i=0; i<15; i++)
-    {
-      std::cout<<"----";
-    }
-    std::cout<<std::endl<<std::endl;
-
-  } else if (iq.getStep() == IterativeQuery::NSQuery){
-    resolve(iq);
-  } else if (iq.getStep() == IterativeQuery::RRQuery) {
-    resolve(iq);
-  } else if (iq.getStep() == IterativeQuery::Abort) {
-    return;
-  } else {
-    std::cout<<"let me see the current step="<<IterativeQuery::toString(iq.getStep())<<std::endl;
-    std::cout<<iq<<std::endl;
-  }
-
-}
-
-
-void
-NameCachingResolver::answerRespNack(IterativeQuery& iq)
-{
-  Response re;
-
-  Name name = iq.getQuery().getAuthorityZone();
-  name.append(Query::toString(iq.getQuery().getQueryType()));
-  name.append(iq.getQuery().getRrLabel());
-  name.append(RR::toString(iq.getQuery().getRrType()));
-  name.appendVersion();
-
-  re.setResponseType(Response::NDNS_Nack);
-  re.setFreshness(this->getContentFreshness());
-  re.setQueryName(name);
-  Data data = re.toData();
-
-  m_keyChain.sign(data);
-  m_face.put(data);
-  std::cout<<"[* <- *] answer RRs to stub:"<<std::endl;
-  std::cout<<iq.getLastResponse().getStringRRs()<<std::endl;
-  for (int i=0; i<15; i++)
-  {
-    std::cout<<"----";
-  }
-  std::cout<<std::endl<<std::endl;
-}
-
-void
-NameCachingResolver::onInterest(const Name &name, const Interest &interest)
-{
-  Query query;
-  query.fromInterest(interest);
-  std::cout<<"[* -> *] receive Interest: "<<interest.getName().toUri()<<std::endl;
-  if (query.getQueryType() == Query::QUERY_DNS)
-  {
-    cout<<m_programName<<" is not in charge of Query_DNS"<<endl;
-  }
-
-  IterativeQuery iq(query);
-  //iq.setQuery(query);
-  resolve(iq);
-
-}
-
-
-void
-NameCachingResolver::onTimeout(const Interest& interest, IterativeQuery& iq)
-{
-  std::cout<<"[* !! *] timeout Interest "<<interest.getName().toUri()<<" timeouts"<<std::endl;
-
-  iq.doTimeout();
-  return;
-}
-
-void
-NameCachingResolver::resolve(IterativeQuery& iq) {
-
-  Interest interest = iq.toLatestInterest();
-
-  //must be set before express interest,since the call will back call iq
-  //if set after, then the iq in call of onData will return nothing
-  //be very careful here,  as a new guy to c++
-
-  interest.setInterestLifetime(this->getInterestLifetime());
-  iq.setLastInterest(interest);
-  try {
-    m_face.expressInterest(interest,
-            boost::bind(&NameCachingResolver::onData, this, _1, _2, iq),
-            boost::bind(&NameCachingResolver::onTimeout, this, _1, iq)
-            );
-  }catch(std::exception& e) {
-    std::cerr << "ERROR: " << e.what() << std::endl;
-  }
-
-
-  std::cout<<"[* <- *] send Interest: "<<interest.getName().toUri()<<std::endl;
-  std::cout<<iq<<std::endl;
-}
-
-} /* namespace ndns */
-} /* namespace ndn */
diff --git a/src/app/name-caching-resolver.hpp b/src/app/name-caching-resolver.hpp
index 5f4fe53..d1047d3 100644
--- a/src/app/name-caching-resolver.hpp
+++ b/src/app/name-caching-resolver.hpp
@@ -33,6 +33,7 @@
 #include "response.hpp"
 #include "rr.hpp"
 #include "iterative-query.hpp"
+#include "iterative-query-with-forwarding-hint.hpp"
 #include "ndn-app.hpp"
 
 using namespace std;
@@ -40,45 +41,215 @@
 namespace ndn {
 namespace ndns {
 
-
-class NameCachingResolver : public NDNApp{
-enum ResolverType
+template <class IQStrategy> //IQ stands for iterative Query Strategy
+class NameCachingResolver: public NDNApp
 {
-  StubResolver,
-  CachingResolver
-};
 
 public:
 
-NameCachingResolver(const char *programName, const char *prefix);
+  NameCachingResolver(const char *programName, const char *prefix);
 
+  void
+  resolve(IQStrategy& iq);
 
-void
-resolve(IterativeQuery& iq);
+  using NDNApp::onData;
+  void
+  onData(const Interest& interest, Data &data, IQStrategy& iq);
 
-void
-answerRespNack(IterativeQuery& iq);
+  void
+  onInterest(const Name &name, const Interest &interest);
 
-using NDNApp::onData;
-void
-onData(const Interest& interest, Data &data, IterativeQuery& iq);
+  using NDNApp::onTimeout;
+  void
+  onTimeout(const Interest& interest, IQStrategy& iq);
 
-void
-onInterest(const Name &name, const Interest &interest);
+  void
+  run();
 
-using NDNApp::onTimeout;
+  const Name& getRootZoneFowardingHint() const
+  {
+    return m_rootZoneFowardingHint;
+  }
 
-void
-onTimeout(const Interest& interest, IterativeQuery& iq);
-
-void
-run();
+  void setRootZoneFowardingHint(const Name& rootZoneFowardingHint)
+  {
+    m_rootZoneFowardingHint = rootZoneFowardingHint;
+  }
 
 private:
-  //ResolverType m_resolverType;
+  /**
+   * 0 means disable forwarding hint,
+   * 1 means enable forwarding hint
+   * todo: 2, retrieve name and hint of the name server as a optimization way
+   */
+
+  Name m_rootZoneFowardingHint;
 
 };
 
+
+template <typename IQStrategy>
+NameCachingResolver<IQStrategy>::NameCachingResolver(const char *programName,
+    const char *prefix)
+  : NDNApp(programName, prefix)
+  , m_rootZoneFowardingHint("/")
+{
+  this->setInterestLifetime(time::milliseconds(2000));
+}
+
+template <class IQStrategy> void
+NameCachingResolver<IQStrategy>::run()
+{
+  boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
+  signalSet.async_wait(boost::bind(&NDNApp::signalHandler, this));
+  // boost::bind(&NdnTlvPingServer::signalHandler, this)
+
+  Name name(m_prefix);
+  name.append(Query::toString(Query::QUERY_DNS_R));
+
+  m_face.setInterestFilter(name,
+      bind(&NameCachingResolver::onInterest, this, _1, _2),
+      bind(&NDNApp::onRegisterFailed, this, _1, _2));
+
+  std::cout << "\n=== NDNS Resolver " << m_programName
+      << " with routeble prefix " << name.toUri() << " starts";
+
+  if (this->m_enableForwardingHint > 0) {
+    std::cout<<" & Root Zone ForwardingHint "<<this->m_rootZoneFowardingHint.toUri();
+  }
+  std::cout<<"==="<< std::endl;
+
+  try {
+    m_face.processEvents();
+  } catch (std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    m_hasError = true;
+    m_ioService.stop();
+  }
+}
+template <class IQStrategy> void
+NameCachingResolver<IQStrategy>::onData(const Interest& interest, Data &data, IQStrategy& iq)
+{
+  /*
+  if (interest.getName() != iq.getLastInterest().getName()) {
+    std::cout << iq << std::endl;
+    std::cout << "waiting for " << iq.getLastInterest().getName().toUri()
+        << std::endl;
+    std::cout << "coming data " << data.getName().toUri() << std::endl;
+    return;
+  }*/
+
+  iq.doData(data);
+
+  if (iq.getStep() == IterativeQuery::AnswerStub) {
+    Data data = iq.getLastResponse().toData();
+    Name name = iq.getQuery().getAuthorityZone();
+    name.append(Query::toString(iq.getQuery().getQueryType()));
+    name.append(iq.getQuery().getRrLabel());
+    name.append(RR::toString(iq.getQuery().getRrType()));
+    name.appendVersion();
+    data.setName(name);
+    data.setFreshnessPeriod(iq.getLastResponse().getFreshness());
+
+    m_keyChain.sign(data);
+    m_face.put(data);
+    std::cout << "[* <- *] answer Response ("
+        << Response::toString(iq.getLastResponse().getResponseType())
+        << ") to stub:" << std::endl;
+    std::cout << iq.getLastResponse() << std::endl;
+    for (int i = 0; i < 15; i++) {
+      std::cout << "----";
+    }
+    std::cout << std::endl << std::endl;
+
+    //iq.setStep(IterativeQuery::FinishedSuccessfully);
+
+  } else if (iq.getStep() == IterativeQuery::NSQuery) {
+    resolve(iq);
+  } else if (iq.getStep() == IterativeQuery::RRQuery) {
+    resolve(iq);
+  } else if (iq.getStep() == IterativeQuery::Abort) {
+    return;
+  } else if (iq.getStep() == IterativeQuery::FHQuery) {
+    resolve(iq);
+  }
+  else {
+    std::cout << "let me see the current step="
+        << IterativeQuery::toString(iq.getStep()) << std::endl;
+    std::cout << iq;
+    std::cout<<std::endl;
+  }
+
+}
+
+template <class IQStrategy> void
+NameCachingResolver<IQStrategy>::onInterest(const Name &name, const Interest &interest)
+{
+  Query query;
+  query.fromInterest(interest);
+  std::cout << "[* -> *] receive Interest: " << interest.getName().toUri()
+      << std::endl;
+  if (query.getQueryType() == Query::QUERY_DNS) {
+    cout << m_programName << " is not in charge of Query_DNS" << endl;
+  }
+
+  IQStrategy iq(query);
+
+  if (this->m_enableForwardingHint == 0) {
+
+  } else if (this->m_enableForwardingHint > 0) {
+    //std::cout<<"--------------------create a Forwarding Hint"<<std::endl;
+    IterativeQueryWithFowardingHint& iqfh =dynamic_cast<IterativeQueryWithFowardingHint&>(iq);
+    iqfh.setForwardingHint(this->m_rootZoneFowardingHint);
+    iqfh.setLastForwardingHint(this->m_rootZoneFowardingHint);
+  }
+  resolve(iq);
+}
+
+template <class IQStrategy> void
+NameCachingResolver<IQStrategy>::onTimeout(const Interest& interest, IQStrategy& iq)
+{
+  std::cout << "[* !! *] timeout Interest " << interest.getName().toUri()
+      << " timeouts" << std::endl;
+
+  iq.doTimeout();
+}
+
+template <class IQStrategy>
+void NameCachingResolver<IQStrategy>::resolve(IQStrategy& iq)
+{
+
+  Interest interest = iq.toLatestInterest();
+
+  //must be set before express interest,since the call will back call iq
+  //if set after, then the iq in call of onData will return nothing
+  //be very careful here,  as a new guy to c++
+
+  interest.setInterestLifetime(this->getInterestLifetime());
+  iq.setLastInterest(interest);
+  /*
+  if (this->m_enableForwardingHint > 0)
+  {
+    //iq = (IterativeQueryWithFowardingHint)iq;
+    iq = dynamic_cast<IterativeQueryWithFowardingHint>iq;
+  }
+  */
+  std::cout<<"lastInterest="<<iq.getLastInterest()<<std::endl;
+
+  try {
+    m_face.expressInterest(interest,
+        boost::bind(&NameCachingResolver::onData, this, _1, _2, iq),
+        boost::bind(&NameCachingResolver::onTimeout, this, _1,  iq));
+        //boost::bind(&NameCachingResolver::onData, this, _1, _2, ndn::ref(iq)),
+        //boost::bind(&NameCachingResolver::onTimeout, this, _1, iq));
+  } catch (std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+  }
+
+  std::cout << "[* <- *] send Interest: " << interest.getName().toUri()
+      << std::endl;
+  std::cout << iq << std::endl;
+}
 } /* namespace ndns */
 } /* namespace ndn */
 
diff --git a/src/app/name-dig.cpp b/src/app/name-dig.cpp
index 6e64e31..a95a0d0 100644
--- a/src/app/name-dig.cpp
+++ b/src/app/name-dig.cpp
@@ -22,45 +22,43 @@
 namespace ndns {
 
 NameDig::NameDig(const char *programName, const char *prefix)
-: NDNApp(programName, prefix)
-, m_resolverName(Name("/"))
-, m_dstLabel(Name(prefix)){
+  : NDNApp(programName, prefix)
+  , m_resolverName(Name("/"))
+  , m_dstLabel(Name(prefix))
+  , m_rrType(RR::TXT)
+{
   //prefix in this app is the m_dstLabel
   this->setInterestLifetime(time::milliseconds(10000));
 }
 
-NameDig::~NameDig() {
+NameDig::~NameDig()
+{
   // TODO Auto-generated destructor stub
 }
 
-void
-NameDig::onData(const Interest& interest, Data& data)
+void NameDig::onData(const Interest& interest, Data& data)
 {
   Response re;
   re.fromData(data);
-  cout<<"get data:->"<<data.getName()<<endl;
-  cout<<"get response:->"<<re<<endl;
+  cout << "get data:->" << data.getName() << endl;
+  cout << "get response:->" << re << endl;
 
-
+  response = re;
 
   m_rrs = re.getRrs();
 
-
-
   vector<RR>::iterator iter = m_rrs.begin();
 
-  while (iter != m_rrs.end())
-  {
+  while (iter != m_rrs.end()) {
     RR rr = *iter;
-    cout<<rr<<endl;
-    iter ++;
+    cout << rr << endl;
+    iter++;
   }
 
   this->stop();
 }
 
-void
-NameDig::sendQuery()
+void NameDig::sendQuery()
 {
   Query q;
   q.setAuthorityZone(this->m_resolverName);
@@ -72,46 +70,39 @@
   interest.setInterestLifetime(this->m_interestLifetime);
   try {
     m_face.expressInterest(interest,
-            boost::bind(&NameDig::onData, this, _1, _2),
-            boost::bind(&NameDig::onTimeout, this, _1)
-            );
-    std::cout<<"[* <- *] send Interest: "<<interest.getName().toUri()<<std::endl;
-  }catch(std::exception& e) {
+        boost::bind(&NameDig::onData, this, _1, _2),
+        boost::bind(&NameDig::onTimeout, this, _1));
+    std::cout << "[* <- *] send Interest: " << interest.getName().toUri()
+        << std::endl;
+  } catch (std::exception& e) {
     m_hasError = true;
     m_error = e.what();
   }
   m_interestTriedNum += 1;
 }
 
-void
-NameDig::onTimeout(const Interest& interest)
+void NameDig::onTimeout(const Interest& interest)
 {
-  std::cout<<"[* !! *] timeout Interest"<<interest.getName()<<std::endl;
+  std::cout << "[* !! *] timeout Interest" << interest.getName() << std::endl;
 
-  if (m_interestTriedNum >= m_interestTriedMax)
-  {
+  if (m_interestTriedNum >= m_interestTriedMax) {
     m_error = "All Interests timeout";
     m_hasError = true;
     this->stop();
-  } else
-  {
+  } else {
     sendQuery();
   }
 
 }
 
-void
-NameDig::run()
+void NameDig::run()
 {
 
   this->sendQuery();
 
-  try
-  {
+  try {
     m_face.processEvents();
-  }
-  catch (std::exception& e)
-  {
+  } catch (std::exception& e) {
     m_error = e.what();
     m_hasError = true;
     this->stop();
diff --git a/src/app/name-dig.hpp b/src/app/name-dig.hpp
index 475cf26..3f07a1e 100644
--- a/src/app/name-dig.hpp
+++ b/src/app/name-dig.hpp
@@ -27,7 +27,8 @@
 namespace ndn {
 namespace ndns {
 
-class NameDig: public NDNApp {
+class NameDig: public NDNApp
+{
 public:
   NameDig(const char *programName, const char *prefix);
   virtual ~NameDig();
@@ -35,7 +36,6 @@
   void
   onData(const ndn::Interest& interest, Data& data);
 
-
   void
   onTimeout(const ndn::Interest& interest);
 
@@ -45,45 +45,63 @@
   void
   run();
 
-  const vector<RR>& getRrs() const {
+  const vector<RR>& getRrs() const
+  {
     return m_rrs;
   }
 
-  void setRrs(const vector<RR>& rrs) {
+  void setRrs(const vector<RR>& rrs)
+  {
     m_rrs = rrs;
   }
 
-  const Name& getResolverName() const {
+  const Name& getResolverName() const
+  {
     return m_resolverName;
   }
 
-  void setResolverName(const Name& resolverName) {
+  void setResolverName(const Name& resolverName)
+  {
     m_resolverName = resolverName;
   }
 
-
-
-  const Name& getDstLabel() const {
+  const Name& getDstLabel() const
+  {
     return m_dstLabel;
   }
 
-  void setDstLabel(const Name& dstLabel) {
+  void setDstLabel(const Name& dstLabel)
+  {
     m_dstLabel = dstLabel;
   }
 
-  RR::RRType getRrType() const {
+  RR::RRType getRrType() const
+  {
     return m_rrType;
   }
 
-  void setRrType(RR::RRType rrType) {
+  void setRrType(RR::RRType rrType)
+  {
     m_rrType = rrType;
   }
 
+  const Response& getResponse() const
+  {
+    return response;
+  }
+
+  void setResponse(const Response& response)
+  {
+    this->response = response;
+  }
+
 private:
   Name m_resolverName;
   Name m_dstLabel;
   RR::RRType m_rrType;
   vector<RR> m_rrs;
+
+  Response response;
 };
 
 } /* namespace ndns */
diff --git a/src/app/name-server.cpp b/src/app/name-server.cpp
index 6e6428d..99ceb19 100644
--- a/src/app/name-server.cpp
+++ b/src/app/name-server.cpp
@@ -18,39 +18,38 @@
  */
 #include "name-server.hpp"
 
-
-namespace ndn{
-namespace ndns{
-NameServer::NameServer(const char *programName, const char *prefix, const char *nameZone)
-: NDNApp(programName, prefix)
-, m_zone(Name(nameZone))
-, m_zoneMgr(m_zone)
+namespace ndn {
+namespace ndns {
+NameServer::NameServer(const char *programName, const char *prefix,
+    const char *nameZone, const string dbfile)
+  : NDNApp(programName, prefix)
+  , m_zone(Name(nameZone))
+  , m_zoneMgr(m_zone)
 {
+  m_zoneMgr.setDbfile(dbfile);
   //m_zoneMgr.lookupId();
-}//NameServer Construction
+} //NameServer Construction
 
-
-void
-NameServer::onInterest(const Name &name, const Interest &interest)
+void NameServer::onInterest(const Name &name, const Interest &interest)
 {
 
-  cout<<"[* -> *] receive Interest: "<<interest.getName().toUri()<<std::endl;
+  cout << "[* -> *] receive Interest: " << interest.getName().toUri()
+      << std::endl;
   Query query;
-  if (!query.fromInterest(interest))
-  {
-    cout<<"can resolve the Query from Interest: "<<endl;
+  if (!query.fromInterest(interest)) {
+    cout << "can resolve the Query from Interest: " << endl;
     return;
   }
 
   /*
    * query.getAuthorityZone is routable name, not the zone's service name
-  if (query.getAuthorityZone() != m_zoneMgr.getZone().getAuthorizedName())
-  {
-    cout<<"Query is intent to zone: "<<query.getAuthorityZone()
-        <<". This is "<<m_zoneMgr.getZone().getAuthorizedName()<<endl;
-    return;
-  }
-  */
+   if (query.getAuthorityZone() != m_zoneMgr.getZone().getAuthorizedName())
+   {
+   cout<<"Query is intent to zone: "<<query.getAuthorityZone()
+   <<". This is "<<m_zoneMgr.getZone().getAuthorizedName()<<endl;
+   return;
+   }
+   */
 
   Response response;
   Name name2 = interest.getName();
@@ -58,28 +57,23 @@
   response.setQueryName(name2);
   RRMgr mgr(m_zone, query, response);
 
-
-  if (mgr.lookup()<0)
-  {
-    cout<<"[* !! *] lookup error, then exit: "<<mgr.getErr()<<endl;
+  if (mgr.lookup() < 0) {
+    cout << "[* !! *] lookup error, then exit: " << mgr.getErr() << endl;
     return;
   }
 
-  if (response.getRrs().size() >0)
-  {
+  if (response.getRrs().size() > 0) {
     response.setResponseType(Response::NDNS_Resp);
   } else {
 
     if (query.getRrType() == RR::NS) {
       int count = mgr.count();
-      if (count < 0)
-      {
-        cout<<"[* !! *] lookup error, then exit: "<<mgr.getErr()<<endl;
+      if (count < 0) {
+        cout << "[* !! *] lookup error, then exit: " << mgr.getErr() << endl;
         return;
-      } else if (count > 0)
-      {
+      } else if (count > 0) {
         response.setResponseType(Response::NDNS_Auth);
-      } else{
+      } else {
         response.setResponseType(Response::NDNS_Nack);
       }
     } else {
@@ -87,56 +81,63 @@
     }
   }
 
-
   Data data = response.toData();
   data.setFreshnessPeriod(response.getFreshness());
 
   m_keyChain.sign(data);
   m_face.put(data);
-  cout<<"[* <- *] send response: "<<response<<": "<<data<<endl;
-}//onInterest
+  cout << "[* <- *] send response: " << response << ": " << data << endl;
+} //onInterest
 
-
-void
-NameServer::run()
+void NameServer::run()
 {
   //m_zoneMgr.lookupId();
-  if (m_zoneMgr.getZone().getId() == 0)
-  {
+  if (m_zoneMgr.getZone().getId() == 0) {
     m_hasError = true;
-    m_error = "cannot get Zone.id from database for name="+m_zone.getAuthorizedName().toUri();
+    m_error = "cannot get Zone.id from database for name="
+        + m_zone.getAuthorizedName().toUri();
     stop();
   }
 
   boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
   signalSet.async_wait(boost::bind(&NDNApp::signalHandler, this));
- // boost::bind(&NdnTlvPingServer::signalHandler, this)
+  // boost::bind(&NdnTlvPingServer::signalHandler, this)
   Name name;
   name.set(m_prefix);
   name.append(Query::toString(Query::QUERY_DNS));
 
-  m_face.setInterestFilter(name,
-               bind(&NameServer::onInterest,
-                  this, _1, _2),
-               bind(&NDNApp::onRegisterFailed,
-                  this, _1,_2));
+  std::cout<<"========= NDNS Name Server for Zone "
+            <<m_zoneMgr.getZone().getAuthorizedName().toUri()
+            <<" Starts with Prefix "<<m_prefix;
+  if (m_enableForwardingHint > 0) {
+    std::cout<<" & ForwardingHint "<<m_forwardingHint.toUri();
+  }
+    std::cout<<"============="<<std::endl;
 
-  std::cout << "\n=== NDNS Server for Zone "
-            << m_zoneMgr.getZone().getAuthorizedName().toUri()
-            <<" with routable prefix "<< name.toUri()
-            << " starts===\n" << std::endl;
+  m_face.setInterestFilter(name, bind(&NameServer::onInterest, this, _1, _2),
+      bind(&NDNApp::onRegisterFailed, this, _1, _2));
+ std::cout<<"Name Server Register Name Prefix: "<<name<<std::endl;
+
+  if (m_enableForwardingHint > 0) {
+    Name name2 = Name(m_forwardingHint);
+    name2.append(ndn::ndns::label::ForwardingHintLabel);
+    name2.append(name);
+    m_face.setInterestFilter(name2, bind(&NameServer::onInterest, this, _1, _2),
+        bind(&NDNApp::onRegisterFailed, this, _1, _2));
+    std::cout<<"Name Server Register Name Prefix: "<<name2<<std::endl;
+  }
+
 
   try {
     m_face.processEvents();
-  }
-  catch (std::exception& e) {
+  } catch (std::exception& e) {
     m_hasError = true;
     m_error = "ERROR: ";
     m_error += e.what();
     stop();
   }
 
-}//run
+} //run
 
 } //namespace ndns
 } /* namespace ndn */
diff --git a/src/app/name-server.hpp b/src/app/name-server.hpp
index 9d6f5cd..5c2f109 100644
--- a/src/app/name-server.hpp
+++ b/src/app/name-server.hpp
@@ -38,29 +38,28 @@
 using namespace std;
 using namespace ndn;
 
-
-namespace ndn{
-namespace ndns{
-class NameServer : public NDNApp
+namespace ndn {
+namespace ndns {
+class NameServer: public NDNApp
 {
 
 public:
-explicit
-NameServer(const char *programName, const char *prefix, const char *nameZone);
+  explicit
+  NameServer(const char *programName, const char *prefix, const char *nameZone,
+      const string dbfile = "src/db/ndns-local.db");
 
-void
-onInterest(const Name &name, const Interest &interest);
+  void
+  onInterest(const Name &name, const Interest &interest);
 
-
-void
-run();
+  void
+  run();
 
 public:
   /*
    * the name used by the server to provide routeable accessory.
 
-  Name m_name;
-  */
+   Name m_name;
+   */
   /*
    * the zone the server is in charge of
    */
@@ -71,7 +70,8 @@
    */
   ZoneMgr m_zoneMgr;
 
-};//clcass NameServer
+};
+//clcass NameServer
 }//namespace ndns
-}//namespace ndn
+} //namespace ndn
 #endif /* NAME_SERVER_HPP_ */
diff --git a/src/app/ndn-app.cpp b/src/app/ndn-app.cpp
index b8f123a..f7804f2 100644
--- a/src/app/ndn-app.cpp
+++ b/src/app/ndn-app.cpp
@@ -30,6 +30,8 @@
   , m_interestTriedMax(2)
   , m_interestTriedNum(0)
   , m_face(m_ioService)
+  , m_enableForwardingHint(0)
+  , m_forwardingHint("/")
 {
 }
 
@@ -39,9 +41,5 @@
   m_prefix = 0;
 }
 
-
-
-
-
 } //namespace ndns
 } /* namespace ndn */
diff --git a/src/app/ndn-app.hpp b/src/app/ndn-app.hpp
index 00595ea..13130e2 100644
--- a/src/app/ndn-app.hpp
+++ b/src/app/ndn-app.hpp
@@ -28,28 +28,29 @@
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/noncopyable.hpp>
 
+#include "ndns-label.hpp"
+
 using namespace std;
 
 namespace ndn {
-namespace ndns{
+namespace ndns {
 
-class NDNApp {
+class NDNApp
+{
 public:
   NDNApp(const char *programName, const char *prefix);
   virtual ~NDNApp();
 
-  virtual void
-  onData(const ndn::Interest& interest, Data& data)
+  virtual void onData(const ndn::Interest& interest, Data& data)
   {
   }
-  virtual void
-  onTimeout(const ndn::Interest& interest)
+  virtual void onTimeout(const ndn::Interest& interest)
   {
-    std::cout<<"!- Interest Timeout"<<interest.getName()<<std::endl;
+    std::cout << "!- Interest Timeout" << interest.getName() << std::endl;
   }
 
-  virtual void
-  onRegisterFailed(const ndn::Name& prefix, const std::string& reason)
+  virtual void onRegisterFailed(const ndn::Name& prefix,
+      const std::string& reason)
   {
     m_error = "ERROR: Failed to register prefix in local hub's daemon";
     m_error += " due to: ";
@@ -58,95 +59,120 @@
     this->stop();
   }
 
-
-  virtual void
-  onInterest(const Name &name, const Interest& interest)
+  virtual void onInterest(const Name &name, const Interest& interest)
   {
 
   }
 
-  virtual void
-  signalHandler()
+  virtual void signalHandler()
   {
     this->stop();
     exit(1);
   }
 
-
-  virtual void
-  stop()
+  virtual void stop()
   {
-    std::cout<<m_programName<<" stops"<<std::endl;
+    std::cout << m_programName << " stops" << std::endl;
     m_ioService.stop();
     m_face.shutdown();
-    if (hasError())
-    {
-      cout<<m_error<<endl;
+    if (hasError()) {
+      cout << m_error << endl;
     }
   }
 
-
-
-  bool hasError() const {
+  bool hasError() const
+  {
     return m_hasError;
   }
 
-  void setHasError(bool hasError) {
+  void setHasError(bool hasError)
+  {
     m_hasError = hasError;
   }
 
-  const char* getPrefix() const {
+  const char* getPrefix() const
+  {
     return m_prefix;
   }
 
-  void setPrefix(char* prefix) {
+  void setPrefix(char* prefix)
+  {
     m_prefix = prefix;
   }
 
-  const char* getProgramName() const {
+  const char* getProgramName() const
+  {
     return m_programName;
   }
 
-  void setProgramName(char* programName) {
+  void setProgramName(char* programName)
+  {
     m_programName = programName;
   }
 
-  const string& getErr() const {
+  const string& getErr() const
+  {
     return m_error;
   }
 
-  void setErr(const string& err) {
+  void setErr(const string& err)
+  {
     m_error = err;
   }
 
-  uint32_t getInterestTriedMax() const {
+  uint32_t getInterestTriedMax() const
+  {
     return m_interestTriedMax;
   }
 
-  void setInterestTriedMax(uint32_t interestTriedMax) {
+  void setInterestTriedMax(uint32_t interestTriedMax)
+  {
     m_interestTriedMax = interestTriedMax;
   }
 
-  time::milliseconds getContentFreshness() const {
+  time::milliseconds getContentFreshness() const
+  {
     return m_contentFreshness;
   }
 
-  void setContentFreshness(time::milliseconds contentFreshness) {
+  void setContentFreshness(time::milliseconds contentFreshness)
+  {
     m_contentFreshness = contentFreshness;
   }
 
-  time::milliseconds getInterestLifetime() const {
+  time::milliseconds getInterestLifetime() const
+  {
     return m_interestLifetime;
   }
 
-  void setInterestLifetime(time::milliseconds interestLifetime) {
+  void setInterestLifetime(time::milliseconds interestLifetime)
+  {
     m_interestLifetime = interestLifetime;
   }
 
-public:
+  const Name& getForwardingHint() const
+  {
+    return m_forwardingHint;
+  }
+
+  void setForwardingHint(const Name& forwardingHint)
+  {
+    m_forwardingHint = forwardingHint;
+  }
+
+  unsigned short getEnableForwardingHint() const
+  {
+    return m_enableForwardingHint;
+  }
+
+  void setEnableForwardingHint(unsigned short enableForwardingHint)
+  {
+    m_enableForwardingHint = enableForwardingHint;
+  }
+
+protected:
   const char* m_programName;
-  const char* m_prefix;
-  bool m_hasError;
+  const char* m_prefix;bool m_hasError;
   string m_error;
   time::milliseconds m_contentFreshness;
   time::milliseconds m_interestLifetime;
@@ -159,9 +185,14 @@
   //Zone m_zone;
   //ZoneMgr m_zoneMgr;
 
-
   Face m_face;
   KeyChain m_keyChain;
+
+  /**
+   * forwarding hint
+   */
+  unsigned short m_enableForwardingHint;
+  Name m_forwardingHint;
 };
 
 } //namespace ndns
