diff --git a/tools/NameServer.cpp b/tools/NameServer.cpp
new file mode 100644
index 0000000..41e3397
--- /dev/null
+++ b/tools/NameServer.cpp
@@ -0,0 +1,188 @@
+/*
+ *  NameServer.cpp
+ *
+ *  Created on: 18 Jul, 2014
+ *      Author: Xiaoke JIANG
+ *
+ */
+
+#include <boost/asio.hpp>
+#include <boost/noncopyable.hpp>
+
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/security/key-chain.hpp>
+
+
+
+using namespace std;
+using namespace ndn;
+
+
+namespace ndn{
+class NameServer : boost::noncopyable
+{
+public:
+explicit
+NameServer(char *programName)
+: m_programName(programName)
+, m_hasError(false)
+, m_freshnessPeriod(time::milliseconds(1000))
+, m_face(m_ioService)
+{
+
+}//NameServer Construction
+
+
+void
+onInterest(const Name &name, const Interest &interest)
+{
+
+	cout<<"-> Interest: "<<name<<std::endl;
+
+}
+void
+onData(const ndn::Interest& interest, Data& data)
+{
+	Name dName = data.getName();
+	if (not m_name.isPrefixOf(dName) )
+	{
+		cout<<"!! ILLEGAL data: "<<dName<<", which does not starts with "<<m_name<<endl;
+		return;
+	}
+
+	cout<<"-> Data: "<<dName<<endl;
+
+	Name iName = interest.getName();
+	unsigned long seq = (unsigned long)iName.get(iName.size()-1).toNumber();
+
+
+	this->tryExpress();
+
+}
+void
+onTimeout(const ndn::Interest& interest)
+{
+	cout<<"!- Interest Timeout"<<interest.getName()<<endl;
+	Name iName = interest.getName();
+	unsigned long seq = (unsigned long)iName.get(iName.size()-1).toNumber();
+
+
+
+	this->tryExpress();
+}
+
+void
+onRegisterFailed(const ndn::Name& prefix, const std::string& reason)
+{
+  std::cerr << "ERROR: Failed to register prefix in local hub's daemon" << std::endl;
+  std::cerr << "REASON: " << reason << std::endl;
+  m_hasError = true;
+  this->stop();
+}
+
+void
+DoExpress()
+{
+	Name name = this->m_name;
+
+
+	Selectors selector;
+	selector.setMustBeFresh(true);
+
+	Interest interest = Interest(name, selector, -1, this->m_freshnessPeriod, 1);
+
+	m_face.expressInterest(interest, boost::bind(&NameServer::onData, this, _1, _2),
+			boost::bind(&NameServer::onTimeout, this, _1));
+
+
+	//m_face.expressInterest(interest, boost::bind(&MyPing::OnData, this, _1, _2),
+	//		boost::bind(&MyPing::OnTimeout, this, _1));
+}
+
+void
+tryExpress()
+{
+	this->DoExpress();
+}
+
+void
+singalHandler()
+{
+	cout<<"Fail to Register"<<endl;
+	this->stop();
+	exit(1);
+}
+
+void
+stop()
+{
+	cout<<"program "<<this->m_programName<<" stops"<<endl;
+	this->m_face.shutdown();
+	this->m_ioService.stop();
+}
+
+
+
+
+void
+run()
+{
+	std::cout << "\n=== NDNS Server for Zone " << m_prefix <<" starts===\n" << std::endl;
+
+	boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
+	signalSet.async_wait(bind(&NameServer::singalHandler, this));
+
+	m_name.set(m_prefix);
+
+	m_face.setInterestFilter(m_name,
+							 bind(&NameServer::onInterest,
+								  this, _1, _2),
+							 bind(&NameServer::onRegisterFailed,
+								  this, _1,_2));
+	try {
+	  m_face.processEvents();
+	}
+	catch (std::exception& e) {
+	  std::cerr << "ERROR: " << e.what() << std::endl;
+	  m_hasError = true;
+	  m_ioService.stop();
+	}
+
+}
+
+	bool hasError() const {
+		return m_hasError;
+	}
+
+
+public:
+	KeyChain m_keyChain;
+	bool m_hasError;
+
+	time::milliseconds m_freshnessPeriod;
+	char* m_programName;
+	char* m_prefix;
+	Name m_name;
+	boost::asio::io_service m_ioService;
+	Face m_face;
+
+};//clcass NameServer
+}//namespace ndn
+
+
+int main(int argc, char * argv[])
+{
+	NameServer server;
+	server.run();
+
+	cout<<"the server ends with hasError="<<server.hasError()<<endl;
+
+	if (server.hasError()){
+		return 0;
+	} else {
+		return 1;
+	}
+
+}
+
diff --git a/tools/Resolver.cpp b/tools/Resolver.cpp
new file mode 100644
index 0000000..a64a184
--- /dev/null
+++ b/tools/Resolver.cpp
@@ -0,0 +1,229 @@
+/*
+ * myping.cc
+ *
+ *  Created on: 21 Jun, 2014
+ *      Author: shock
+ */
+
+#include <boost/noncopyable.hpp>
+#include <boost/asio.hpp>
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/name.hpp>
+#include <ndn-cxx/interest.hpp>
+#include <ndn-cxx/selectors.hpp>
+
+#include <query.h>
+#include <rr.h>
+
+#include <unistd.h>
+#include <stdlib.h> //atoi
+
+
+
+#include <map>
+#include <vector>
+#include <sstream>
+
+//using std::cout;
+//using std::cin;
+//using std::cerr;
+//using std::endl;
+//using std::map;
+//using std::vector;
+//using std::exception;
+//using std::pair;
+//using std::string;
+
+using namespace std;
+
+namespace ndn{
+
+
+class Resolver : boost::noncopyable
+{
+
+	class RequestInfo
+	{
+	public:
+		RequestInfo(unsigned long seq)
+		: m_seq(seq)
+		{
+		}
+
+		void
+		SendInterest()
+		{
+			//m_sentT = time::system_clock::now();
+		}
+		void
+		GetData()
+		{
+			//this->m_receT = time::system_clock::now();
+		}
+
+		string
+		toString()
+		{
+			stringstream str;
+			str<<"m_seq="<<m_seq;
+			//s +="m_seq="+m_seq+" m_sentT="+" m_receT=";
+			return str.str();
+		}
+
+	public:
+		unsigned long m_seq;
+		time::milliseconds m_sentT;
+		time::milliseconds m_receT;
+	};
+
+public:
+Resolver(char *programName, char *scope, char *domain)
+: m_programName (programName)
+, m_authorityZone (scope)
+, m_rrLabel(domain)
+, m_interestLifetime (time::milliseconds(4000))
+, m_face (m_ioService)
+{
+	cout<<"Create "<<m_programName<<endl;
+}
+
+void
+onInterest(const Name &name, const Interest &interest)
+{
+
+	cout<<"-> Interest: "<<name<<std::endl;
+
+}
+void
+onData(const ndn::Interest& interest, Data& data)
+{
+	Response response(data);
+	response
+}
+void
+onTimeout(const ndn::Interest& interest)
+{
+	cout<<"!- Interest Timeout"<<interest.getName()<<endl;
+	Name iName = interest.getName();
+	unsigned long seq = (unsigned long)iName.get(iName.size()-1).toNumber();
+
+	this->tryExpress();
+
+
+}
+
+
+void
+doExpress(Interest interest)
+{
+	m_face.expressInterest(interest, boost::bind(&onData, this, _1, _2),
+			boost::bind(&onTimeout, this, _1));
+}
+
+void
+tryExpress()
+{
+
+	this->doExpress();
+
+}
+
+
+void
+singalHandler()
+{
+	this->stop();
+}
+
+void
+stop()
+{
+	cout<<"resolve stops"<<endl;
+	this->m_face.shutdown();
+	this->m_ioService.stop();
+}
+
+void
+run()
+{
+
+	boost::asio::signal_set signalSet(m_ioService, SIGINT, SIGTERM);
+	signalSet.async_wait(boost::bind(&singalHandler, this));
+
+	this->m_query.setAuthorityZone(this->m_authorityZone);
+	this->m_query.setRrLabel(this->m_rrLabel);
+	this->m_query.setRrType(RRType::NS);
+
+	Interest interest = m_query.toWire();
+	this->doExpress(interest);
+
+	try{
+		m_face.processEvents();
+	} catch (exception &e){
+		cerr<<"Error: "<<e.what()<<endl;
+		this->stop();
+	}
+
+}
+
+
+void
+resolve()
+{
+
+}
+
+
+private:
+	char *m_programName;
+	Name m_authorityZone;
+	Name m_rrLabel;
+	//Name m_name;
+	time::milliseconds m_interestLifetime;
+
+
+	Query m_query;
+
+	boost::asio::io_service m_ioService;
+	//This line MUST be before m_face declaration, or leads to segment error: 11
+
+	Face m_face;
+
+
+};//class MyPing
+
+}//namespace
+
+
+void
+usage()
+{
+	cout<<"-h to show the hint"<<endl;
+}
+
+int
+main(int argc, char *argv[])
+{
+
+	if (argc < 2)
+	{
+		cout<<"You must have at least one parameter: resolve domain [scope]"<<endl;
+		return 0;
+	}
+
+
+	char * domain = argv[1];
+	char * scope;
+	if (argc == 3)
+		scope = argv[2];
+	else
+		scope = "/";
+
+
+	ndn::Resolver resolver(argv[0], scope, domain);
+	resolver.run();
+
+	return 0;
+}//main
+
+
