diff --git a/src/response.cpp b/src/response.cpp
new file mode 100644
index 0000000..a4c7746
--- /dev/null
+++ b/src/response.cpp
@@ -0,0 +1,121 @@
+/*
+ * response.cpp
+ *
+ *  Created on: 19 Jul, 2014
+ *      Author: shock
+ */
+
+#include "response.h"
+
+
+
+namespace ndn {
+
+Response::Response() {
+	// TODO Auto-generated constructor stub
+
+}
+
+Response::~Response() {
+	// TODO Auto-generated destructor stub
+}
+
+
+
+Data
+Response::toWire() const
+{
+	Name name = this->m_queryName;
+	name.append(this->m_serial);
+
+	Data data(name);
+
+	data.setFreshnessPeriod(this->m_freshness);
+
+	string content = "";
+
+	size_t totalLen = 0;
+	Block block = Block();
+	block.push_back
+		(nonNegativeIntegerBlock
+				(tlv::ndns::Type, static_cast<unsigned long>(this->m_responseType))
+		);
+
+	block.push_back
+			(nonNegativeIntegerBlock
+					(tlv::ndns::Fressness, this->m_freshness.count())
+			);
+
+	Block block2 = Block(tlv::ndns::ContentBlob);
+	block2.push_back
+			(nonNegativeIntegerBlock
+					(tlv::ndns::NumberOfRRData, this->m_numberOfRR)
+			);
+
+	for (int i=0; i<this->m_numberOfRR; i++)
+	{
+		RR rr = m_rrs[i];
+		block2.push_back(rr.toWire());
+	}
+
+	block.push_back(block2);
+
+	return data;
+
+}
+
+void
+Response::fromWire(const Interest &interest, const Data &data)
+{
+    Name dataName;
+    dataName = data.getName();
+
+    int qtflag = -1;
+    size_t len = dataName.size();
+    for (size_t i=0; i<len; i++)
+    {
+    	string comp = dataName.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: "<<dataName<<endl;
+    	return;
+    }
+
+    this->m_queryName = dataName.getPrefix(-1);
+
+    string last = dataName.get(len-1).toEscapedString();
+    if (ndn::toRRType(last) == RRType::UNKNOWN)
+    {
+    	this->m_serial = "";
+    } else
+    {
+    	this->m_serial = last;
+    }
+
+    Block block = data.getContent();
+    this->m_numberOfRR = readNonNegativeInteger(block.get(tlv::ndns::NumberOfRRData));
+
+    Block block2 = block.get(tlv::ndns::ContentBlob);
+    for (int i=0; i<this->m_numberOfRR; i++)
+    {
+    	Block block3 = block2.get(tlv::ndns::RRData);
+    	RR rr;
+    	rr.fromWire(block3);
+    	m_rrs.push_back(rr);
+    }
+
+}
+
+
+} /* namespace ndn */
+
+
+
+
