diff --git a/src/response.hpp b/src/response.hpp
index e2266ac..97791a7 100644
--- a/src/response.hpp
+++ b/src/response.hpp
@@ -42,58 +42,50 @@
 namespace ndn {
 namespace ndns {
 
-
-class Response {
+class Response
+{
 public:
   enum ResponseType
-    {
-      NDNS_Resp,
-      NDNS_Nack,
-      NDNS_Auth,
-      UNKNOWN
-    };
+  {
+    NDNS_Resp,
+    NDNS_Nack,
+    NDNS_Auth,
+    UNKNOWN
+  };
 
-
-  static std::string
-  toString(ResponseType responseType)
+  static std::string toString(ResponseType responseType)
   {
     std::string label;
-    switch (responseType)
-      {
-      case NDNS_Resp:
-        label = "NDNS Resp";
-        break;
-      case NDNS_Nack:
-        label = "NDNS Nack";
-        break;
-      case NDNS_Auth:
-        label = "NDNS Auth";
-        break;
-      default:
-        label = "UNKNOWN";
-        break;
-      }
+    switch (responseType) {
+    case NDNS_Resp:
+      label = "NDNS Resp";
+      break;
+    case NDNS_Nack:
+      label = "NDNS Nack";
+      break;
+    case NDNS_Auth:
+      label = "NDNS Auth";
+      break;
+    default:
+      label = "UNKNOWN";
+      break;
+    }
     return label;
   }
 
-  static ResponseType
-  toResponseType(const std::string& str)
+  static ResponseType toResponseType(const std::string& str)
   {
-      ResponseType atype;
-      if (str == "NDNS Resp"){
-          atype = NDNS_Resp;
-      }
-      else if (str == "NDNS Nack") {
-          atype = NDNS_Nack;
-      }
-      else if (str == "NDNS Auth")
-      {
-        atype = NDNS_Auth;
-      }
-      else {
-          atype = UNKNOWN;
-      }
-      return atype;
+    ResponseType atype;
+    if (str == "NDNS Resp") {
+      atype = NDNS_Resp;
+    } else if (str == "NDNS Nack") {
+      atype = NDNS_Nack;
+    } else if (str == "NDNS Auth") {
+      atype = NDNS_Auth;
+    } else {
+      atype = UNKNOWN;
+    }
+    return atype;
   }
 
   Response();
@@ -117,7 +109,6 @@
   size_t
   wireEncode(EncodingImpl<T> & block) const;
 
-
   void
   fromData(const Name& name, const Data& data);
 
@@ -127,64 +118,69 @@
   Data
   toData() const;
 
-
-
-  const std::string
-  getStringRRs() const {
+  const std::string getStringRRs() const
+  {
     std::stringstream str;
-    str<<"[";
+    str << "[";
     std::vector<RR>::const_iterator iter = m_rrs.begin();
-    while (iter != m_rrs.end())
-    {
-      str<<" "<<*iter;
-      iter ++;
+    while (iter != m_rrs.end()) {
+      str << " " << *iter;
+      iter++;
     }
-    str<<"]";
+    str << "]";
     return str.str();
   }
 
-  Query::QueryType getContentType() const {
+  Query::QueryType getContentType() const
+  {
     return m_contentType;
   }
 
-  void setContentType(Query::QueryType contentType) {
+  void setContentType(Query::QueryType contentType)
+  {
     m_contentType = contentType;
   }
 
-  time::milliseconds getFreshness() const {
+  time::milliseconds getFreshness() const
+  {
     return m_freshness;
   }
 
-  void setFreshness(time::milliseconds freshness) {
+  void setFreshness(time::milliseconds freshness)
+  {
     m_freshness = freshness;
   }
 
-  const Name& getQueryName() const {
+  const Name& getQueryName() const
+  {
     return m_queryName;
   }
 
-  void setQueryName(const Name& queryName) {
+  void setQueryName(const Name& queryName)
+  {
     m_queryName = queryName;
   }
 
-  ResponseType getResponseType() const {
+  ResponseType getResponseType() const
+  {
     return m_responseType;
   }
 
-  void setResponseType(ResponseType responseType) {
+  void setResponseType(ResponseType responseType)
+  {
     m_responseType = responseType;
   }
 
-  const std::vector<RR>& getRrs() const {
+  const std::vector<RR>& getRrs() const
+  {
     return m_rrs;
   }
 
-  void setRrs(const std::vector<RR>& rrs) {
+  void setRrs(const std::vector<RR>& rrs)
+  {
     m_rrs = rrs;
   }
 
-
-
 private:
   time::milliseconds m_freshness;
   Name m_queryName;
@@ -192,30 +188,26 @@
   Query::QueryType m_contentType;
   ResponseType m_responseType;
   //unsigned int m_numberOfRR;
-  std::vector<RR>  m_rrs;
+  std::vector<RR> m_rrs;
   mutable Block m_wire;
 
 };
 
-
 inline std::ostream&
 operator<<(std::ostream& os, const Response& response)
 {
-  os<<"Response: queryName="<<response.getQueryName().toUri()
-    <<" responseType="<<Response::toString(response.getResponseType())
-    <<" contentType="<<Query::toString(response.getContentType())
-    <<" [";
+  os << "Response: queryName=" << response.getQueryName().toUri()
+      << " responseType=" << Response::toString(response.getResponseType())
+      << " contentType=" << Query::toString(response.getContentType()) << " [";
   std::vector<RR>::const_iterator iter = response.getRrs().begin();
-  while (iter != response.getRrs().end())
-  {
-    os<<" "<<*iter;
-    iter ++;
+  while (iter != response.getRrs().end()) {
+    os << " " << *iter;
+    iter++;
   }
-  os<<"]";
+  os << "]";
   return os;
 }
 
-
 } // namespace ndns
 } // namespace ndn
 
