diff --git a/src/app/name-dig.cpp b/src/app/name-dig.cpp
new file mode 100644
index 0000000..6e64e31
--- /dev/null
+++ b/src/app/name-dig.cpp
@@ -0,0 +1,123 @@
+/* -*- 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-dig.hpp"
+
+namespace ndn {
+namespace ndns {
+
+NameDig::NameDig(const char *programName, const char *prefix)
+: NDNApp(programName, prefix)
+, m_resolverName(Name("/"))
+, m_dstLabel(Name(prefix)){
+  //prefix in this app is the m_dstLabel
+  this->setInterestLifetime(time::milliseconds(10000));
+}
+
+NameDig::~NameDig() {
+  // TODO Auto-generated destructor stub
+}
+
+void
+NameDig::onData(const Interest& interest, Data& data)
+{
+  Response re;
+  re.fromData(data);
+  cout<<"get data:->"<<data.getName()<<endl;
+  cout<<"get response:->"<<re<<endl;
+
+
+
+  m_rrs = re.getRrs();
+
+
+
+  vector<RR>::iterator iter = m_rrs.begin();
+
+  while (iter != m_rrs.end())
+  {
+    RR rr = *iter;
+    cout<<rr<<endl;
+    iter ++;
+  }
+
+  this->stop();
+}
+
+void
+NameDig::sendQuery()
+{
+  Query q;
+  q.setAuthorityZone(this->m_resolverName);
+  q.setRrLabel(m_dstLabel);
+  q.setQueryType(Query::QUERY_DNS_R);
+  q.setRrType(m_rrType);
+
+  Interest interest = q.toInterest();
+  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) {
+    m_hasError = true;
+    m_error = e.what();
+  }
+  m_interestTriedNum += 1;
+}
+
+void
+NameDig::onTimeout(const Interest& interest)
+{
+  std::cout<<"[* !! *] timeout Interest"<<interest.getName()<<std::endl;
+
+  if (m_interestTriedNum >= m_interestTriedMax)
+  {
+    m_error = "All Interests timeout";
+    m_hasError = true;
+    this->stop();
+  } else
+  {
+    sendQuery();
+  }
+
+}
+
+void
+NameDig::run()
+{
+
+  this->sendQuery();
+
+  try
+  {
+    m_face.processEvents();
+  }
+  catch (std::exception& e)
+  {
+    m_error = e.what();
+    m_hasError = true;
+    this->stop();
+  }
+
+}
+
+} /* namespace ndns */
+} /* namespace ndn */
