diff --git a/src/rr.hpp b/src/rr.hpp
index 95001e9..106bb39 100644
--- a/src/rr.hpp
+++ b/src/rr.hpp
@@ -25,24 +25,64 @@
 #include <ndn-cxx/encoding/block.hpp>
 #include <ndn-cxx/interest.hpp>
 
+#include <ndn-cxx/encoding/encoding-buffer.hpp>
+
 namespace ndn {
 namespace ndns {
 
-enum RRType
-  {
-    NS,
-    TXT,
-    UNKNOWN
-  };
 
 class RR {
 public:
+
+  enum RRType
+    {
+      NS,
+      TXT,
+      UNKNOWN
+    };
+  static std::string
+  toString(const RRType& type)
+    {
+      std::string str;
+
+        switch (type)
+        {
+            case NS:
+                str = "NS";
+                break;
+            case TXT:
+                str = "TXT";
+                break;
+            default:
+                str = "UNKNOWN";
+                break;
+        }
+        return str;
+    }
+
+  static RRType
+  toRRType(const std::string& str)
+  {
+      RRType atype;
+      if (str == "NS"){
+          atype = NS;
+      }
+      else if (str == "TXT") {
+          atype = TXT;
+      }
+      else {
+          atype = UNKNOWN;
+      }
+      return atype;
+  }
+
   RR();
   virtual ~RR();
 
   const std::string&
   getRrdata() const
   {
+
     return m_rrData;
   }
 
@@ -51,32 +91,86 @@
     this->m_rrData = rrdata;
   }
 
-private:
-  template<bool T>
-  size_t
-  wireEncode(EncodingImpl<T> & block) const;
+
 
 public:
 
+	uint32_t getId() const {
+		return m_id;
+	}
+
+	void setId(uint32_t id) {
+		m_id = id;
+	}
+
+  const Block& getWire() const {
+      return m_wire;
+  }
+
+  void setWire(const Block& wire) {
+      m_wire = wire;
+  }
+
+
+  inline bool operator==(const RR& rr) const
+  {
+    if (this->getRrdata() == rr.getRrdata())
+      return true;
+
+    return false;
+  }
+
+
+  template<bool T>
+  inline size_t
+  wireEncode(EncodingImpl<T> & block) const
+  {
+    size_t totalLength = 0;
+    const std::string& msg = this->getRrdata();
+    totalLength += prependByteArrayBlock(block,
+                           ndn::ndns::tlv::RRDataSub2,
+                           reinterpret_cast<const uint8_t*>(msg.c_str()),
+                           msg.size()
+                           );
+
+    totalLength += prependNonNegativeIntegerBlock(block,
+                        ndn::ndns::tlv::RRDataSub1,
+                        this->getId());
+
+    totalLength += block.prependVarNumber(totalLength);
+    totalLength += block.prependVarNumber(ndn::ndns::tlv::RRData);
+    //std::cout<<"call rr.h wireEncode"<<std::endl;
+    return totalLength;
+  }
+
+
   const Block&
   wireEncode() const;
 
   void
   wireDecode(const Block& wire);
 
-
-  Interest
-  toWire() const;
-
+  //inline std::ostream& operator<<(std::ostream& os, const RR& rr);
 
 private:
   uint32_t m_id;
+  //unsigned long m_id;
   std::string m_rrData;
 
   mutable Block m_wire;
-};
+};//class RR
+
+
+inline std::ostream&
+operator<<(std::ostream& os, const RR& rr)
+{
+  os<<"RR: Id="<<rr.getId()<<" Data="<<rr.getRrdata();
+  return os;
+}
 
 } // namespace ndns
 } // namespace ndn
 
+
+
 #endif // NDNS_RR_HPP
