diff --git a/src/query.cpp b/src/query.cpp
new file mode 100644
index 0000000..861d1c8
--- /dev/null
+++ b/src/query.cpp
@@ -0,0 +1,85 @@
+/*
+ * query.cpp
+ *
+ *  Created on: 18 Jul, 2014
+ *      Author: shock
+ */
+
+#include "query.h"
+
+namespace ndn {
+
+Query::Query()
+: m_interestLifetime(time::milliseconds(4000))
+{
+	// TODO Auto-generated constructor stub
+
+}
+
+Query::~Query() {
+	// TODO Auto-generated destructor stub
+}
+
+
+void
+Query::fromWire(const Name &name, const Interest &interest)
+{
+    Name interestName;
+    interestName = interest.getName();
+
+    int qtflag = -1;
+    size_t len = interestName.size();
+    for (size_t i=0; i<len; i++)
+    {
+    	string comp = interestName.get(i).toEscapedString();
+    	if (comp == ndn::toString(QueryType::DNS) || comp == ndn::toString(QueryType::DNS_R))
+    	{
+    		qtflag = i;
+    		break;
+    	}
+    }//for
+
+    if (qtflag == -1)
+    {
+    	cerr<<"There is no QueryType in the Interest Name: "<<interestName<<endl;
+    	return;
+    }
+    this->m_queryType = ndn::toQueryType(interestName.get(qtflag).toEscapedString());
+    this->m_rrType = ndn::toRRType(interestName.get(len-1).toEscapedString());
+    this->m_authorityZone = interestName.getPrefix(qtflag); //the DNS/DNS-R is not included
+    this->m_interestLifetime = interest.getInterestLifetime();
+
+}
+
+template<bool T>
+size_t
+Query::wireEncode(EncodingImpl<T>& block) const
+{
+	size_t totalLength = 0;
+	totalLength += 0;
+
+
+  size_t totalLength = prependByteArrayBlock(block, tlv::Bytes,
+                                             m_key.get().buf(), m_key.get().size());
+  totalLength += m_keyName.wireEncode(block);
+  totalLength += block.prependVarNumber(totalLength);
+  totalLength += block.prependVarNumber(tlv::PublicKey);
+
+  return totalLength;
+}
+
+Interest
+Query::toWire() const
+{
+	Name name = this->m_authorityZone;
+	name.append(ndn::toString(this->m_queryType));
+	name.append(this->m_rrLabel);
+	name.append(ndn::toString(this->m_rrType));
+	Selectors selector;
+	//selector.setMustBeFresh(true);
+
+	Interest interest = Interest(name, selector, -1, this->m_interestLifetime);
+	return interest;
+}
+
+} /* namespace ndn */
