diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 42ea9e2..0d9c85e 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -122,7 +122,7 @@
     const auto& pib = m_keyChain.getPib();
     const auto& identity = pib.getIdentity(m_config.m_caItem.m_caPrefix);
     const auto& cert = identity.getDefaultKey().getDefaultCertificate();
-    Block contentTLV = infoEncoder::encodeDataContent(m_config.m_caItem, cert);
+    Block contentTLV = infotlv::encodeDataContent(m_config.m_caItem, cert);
 
     Name infoPacketName(m_config.m_caItem.m_caPrefix);
     infoPacketName.append("CA").append("INFO").appendVersion().appendSegment(0);
@@ -156,7 +156,7 @@
   NDN_LOG_TRACE("Received PROBE request");
 
   // process PROBE requests: collect probe parameters
-  auto parameters = probeEncoder::decodeApplicationParameters(request.getApplicationParameters());
+  auto parameters = probetlv::decodeApplicationParameters(request.getApplicationParameters());
   std::vector<PartialName> availableComponents;
   for (auto& item : m_config.m_nameAssignmentFuncs) {
     auto names = item->assignName(parameters);
@@ -176,7 +176,7 @@
 
   Data result;
   result.setName(request.getName());
-  result.setContent(probeEncoder::encodeDataContent(availableNames, m_config.m_caItem.m_maxSuffixLength, m_config.m_redirection));
+  result.setContent(probetlv::encodeDataContent(availableNames, m_config.m_caItem.m_maxSuffixLength, m_config.m_redirection));
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
   m_keyChain.sign(result, signingByIdentity(m_config.m_caItem.m_caPrefix));
   m_face.put(result);
@@ -193,7 +193,7 @@
   std::vector<uint8_t> ecdhPub;
   shared_ptr<security::Certificate> clientCert;
   try {
-    newRenewRevokeEncoder::decodeApplicationParameters(parameterTLV, requestType, ecdhPub, clientCert);
+    requesttlv::decodeApplicationParameters(parameterTLV, requestType, ecdhPub, clientCert);
   }
   catch (const std::exception& e) {
     if (!parameterTLV.hasValue()) {
@@ -320,7 +320,7 @@
   Data result;
   result.setName(request.getName());
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  result.setContent(newRenewRevokeEncoder::encodeDataContent(myEcdhPubKeyBase64,
+  result.setContent(requesttlv::encodeDataContent(myEcdhPubKeyBase64,
                                                              salt,
                                                              requestState.m_requestId, requestState.m_status,
                                                              m_config.m_caItem.m_supportedChallenges));
@@ -401,20 +401,20 @@
       requestState->m_status = Status::SUCCESS;
       m_storage->deleteRequest(requestState->m_requestId);
 
-      payload = challengeEncoder::encodeDataContent(*requestState, issuedCert.getName());
+      payload = challengetlv::encodeDataContent(*requestState, issuedCert.getName());
       NDN_LOG_TRACE("Challenge succeeded. Certificate has been issued: " << issuedCert.getName());
     }
     else if (requestState->m_requestType == RequestType::REVOKE) {
       requestState->m_status = Status::SUCCESS;
       m_storage->deleteRequest(requestState->m_requestId);
 
-      payload = challengeEncoder::encodeDataContent(*requestState);
+      payload = challengetlv::encodeDataContent(*requestState);
       NDN_LOG_TRACE("Challenge succeeded. Certificate has been revoked");
     }
   }
   else {
     m_storage->updateRequest(*requestState);
-    payload = challengeEncoder::encodeDataContent(*requestState);
+    payload = challengetlv::encodeDataContent(*requestState);
     NDN_LOG_TRACE("No failure no success. Challenge moves on");
   }
 
@@ -485,7 +485,7 @@
   Data result;
   result.setName(name);
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  result.setContent(errorEncoder::encodeDataContent(error, errorInfo));
+  result.setContent(errortlv::encodeDataContent(error, errorInfo));
   m_keyChain.sign(result, signingByIdentity(m_config.m_caItem.m_caPrefix));
   return result;
 }
diff --git a/src/detail/challenge-encoder.cpp b/src/detail/challenge-encoder.cpp
index 0cc98a3..41a0f8f 100644
--- a/src/detail/challenge-encoder.cpp
+++ b/src/detail/challenge-encoder.cpp
@@ -24,7 +24,7 @@
 namespace ndncert {
 
 Block
-challengeEncoder::encodeDataContent(ca::RequestState& request, const Name& issuedCertName)
+challengetlv::encodeDataContent(ca::RequestState& request, const Name& issuedCertName)
 {
   Block response(tlv::EncryptedPayload);
   response.push_back(makeNonNegativeIntegerBlock(tlv::Status, static_cast<uint64_t>(request.m_status)));
@@ -45,7 +45,7 @@
 }
 
 void
-challengeEncoder::decodeDataContent(const Block& contentBlock, requester::RequestState& state)
+challengetlv::decodeDataContent(const Block& contentBlock, requester::RequestState& state)
 {
   auto result = decodeBlockWithAesGcm128(contentBlock, state.m_aesKey.data(),
                                          state.m_requestId.data(), state.m_requestId.size());
diff --git a/src/detail/challenge-encoder.hpp b/src/detail/challenge-encoder.hpp
index 0ef68c3..0bd930c 100644
--- a/src/detail/challenge-encoder.hpp
+++ b/src/detail/challenge-encoder.hpp
@@ -26,13 +26,13 @@
 
 namespace ndn {
 namespace ndncert {
-namespace challengeEncoder {
+namespace challengetlv {
 
-  Block
-  encodeDataContent(ca::RequestState& request, const Name& issuedCertName = Name());
+Block
+encodeDataContent(ca::RequestState& request, const Name& issuedCertName = Name());
 
-  void
-  decodeDataContent(const Block& contentBlock, requester::RequestState& state);
+void
+decodeDataContent(const Block& contentBlock, requester::RequestState& state);
 
 } // namespace ChallengeEncoder
 } // namespace ndncert
diff --git a/src/detail/error-encoder.cpp b/src/detail/error-encoder.cpp
index b503f86..3fbbdc2 100644
--- a/src/detail/error-encoder.cpp
+++ b/src/detail/error-encoder.cpp
@@ -24,7 +24,7 @@
 namespace ndncert {
 
 Block
-errorEncoder::encodeDataContent(ErrorCode errorCode, const std::string& description)
+errortlv::encodeDataContent(ErrorCode errorCode, const std::string& description)
 {
   Block response(ndn::tlv::Content);
   response.push_back(makeNonNegativeIntegerBlock(tlv::ErrorCode, static_cast<size_t>(errorCode)));
@@ -34,7 +34,7 @@
 }
 
 std::tuple<ErrorCode, std::string>
-errorEncoder::decodefromDataContent(const Block& block)
+errortlv::decodefromDataContent(const Block& block)
 {
   block.parse();
   if (block.find(tlv::ErrorCode) == block.elements_end()) {
diff --git a/src/detail/error-encoder.hpp b/src/detail/error-encoder.hpp
index d8f6ea4..650dd11 100644
--- a/src/detail/error-encoder.hpp
+++ b/src/detail/error-encoder.hpp
@@ -25,22 +25,22 @@
 
 namespace ndn {
 namespace ndncert {
-namespace errorEncoder {
+namespace errortlv {
 
-  /**
-   * Encode error information into a Data content TLV
-   */
-  Block
-  encodeDataContent(ErrorCode errorCode, const std::string& description);
+/**
+ * Encode error information into a Data content TLV
+ */
+Block
+encodeDataContent(ErrorCode errorCode, const std::string& description);
 
-  /**
-   * Decode error information from Data content TLV
-   */
-  std::tuple<ErrorCode, std::string>
-  decodefromDataContent(const Block& block);
+/**
+ * Decode error information from Data content TLV
+ */
+std::tuple<ErrorCode, std::string>
+decodefromDataContent(const Block& block);
 
-} // namespace ErrorEncoder
-} // namespace ndncert
-} // namespace ndn
+}  // namespace errortlv
+}  // namespace ndncert
+}  // namespace ndn
 
-#endif // NDNCERT_DETAIL_ERROR_ENCODER_HPP
\ No newline at end of file
+#endif  // NDNCERT_DETAIL_ERROR_ENCODER_HPP
\ No newline at end of file
diff --git a/src/detail/info-encoder.cpp b/src/detail/info-encoder.cpp
index 746aafc..17e798c 100644
--- a/src/detail/info-encoder.cpp
+++ b/src/detail/info-encoder.cpp
@@ -24,7 +24,7 @@
 namespace ndncert {
 
 Block
-infoEncoder::encodeDataContent(const CaProfile& caConfig, const security::Certificate& certificate)
+infotlv::encodeDataContent(const CaProfile& caConfig, const security::Certificate& certificate)
 {
   Block content(ndn::tlv::Content);
   content.push_back(makeNestedBlock(tlv::CaPrefix, caConfig.m_caPrefix));
@@ -46,7 +46,7 @@
 }
 
 CaProfile
-infoEncoder::decodeDataContent(const Block& block)
+infotlv::decodeDataContent(const Block& block)
 {
   CaProfile result;
   block.parse();
diff --git a/src/detail/info-encoder.hpp b/src/detail/info-encoder.hpp
index 48a1d82..ae5348e 100644
--- a/src/detail/info-encoder.hpp
+++ b/src/detail/info-encoder.hpp
@@ -25,18 +25,19 @@
 
 namespace ndn {
 namespace ndncert {
-namespace infoEncoder {
-  /**
-   * Encode CA configuration and its certificate into a TLV block as INFO Data packet content.
-   */
-  Block
-  encodeDataContent(const CaProfile& caConfig, const security::Certificate& certificate);
+namespace infotlv {
 
-  /**
-   * Decode CA configuration from the TLV block of INFO Data packet content.
-   */
-  CaProfile
-  decodeDataContent(const Block& block);
+/**
+ * Encode CA configuration and its certificate into a TLV block as INFO Data packet content.
+ */
+Block
+encodeDataContent(const CaProfile& caConfig, const security::Certificate& certificate);
+
+/**
+ * Decode CA configuration from the TLV block of INFO Data packet content.
+ */
+CaProfile
+decodeDataContent(const Block& block);
 
 } // namespace InfoEncoder
 } // namespace ndncert
diff --git a/src/detail/new-renew-revoke-encoder.cpp b/src/detail/new-renew-revoke-encoder.cpp
index bdde1cf..fa4626c 100644
--- a/src/detail/new-renew-revoke-encoder.cpp
+++ b/src/detail/new-renew-revoke-encoder.cpp
@@ -29,7 +29,7 @@
 NDN_LOG_INIT(ndncert.encoding.new_renew_revoke);
 
 Block
-newRenewRevokeEncoder::encodeApplicationParameters(RequestType requestType, const std::vector<uint8_t>& ecdhPub,
+requesttlv::encodeApplicationParameters(RequestType requestType, const std::vector<uint8_t>& ecdhPub,
                                                    const security::Certificate& certRequest)
 {
   Block request(ndn::tlv::ApplicationParameters);
@@ -56,7 +56,7 @@
 }
 
 void
-newRenewRevokeEncoder::decodeApplicationParameters(const Block& payload, RequestType requestType,
+requesttlv::decodeApplicationParameters(const Block& payload, RequestType requestType,
                                                    std::vector<uint8_t>& ecdhPub,
                                                    shared_ptr<security::Certificate>& clientCert)
 {
@@ -80,7 +80,7 @@
 }
 
 Block
-newRenewRevokeEncoder::encodeDataContent(const std::vector<uint8_t>& ecdhKey, const std::array<uint8_t, 32>& salt,
+requesttlv::encodeDataContent(const std::vector<uint8_t>& ecdhKey, const std::array<uint8_t, 32>& salt,
                                          const RequestId& requestId, const Status& status,
                                          const std::list<std::string>& challenges)
 {
@@ -97,7 +97,7 @@
 }
 
 std::list<std::string>
-newRenewRevokeEncoder::decodeDataContent(const Block& content, std::vector<uint8_t>& ecdhKey,
+requesttlv::decodeDataContent(const Block& content, std::vector<uint8_t>& ecdhKey,
                                          std::array<uint8_t, 32>& salt, RequestId& requestId, Status& status)
 {
   content.parse();
diff --git a/src/detail/new-renew-revoke-encoder.hpp b/src/detail/new-renew-revoke-encoder.hpp
index c70404c..563e562 100644
--- a/src/detail/new-renew-revoke-encoder.hpp
+++ b/src/detail/new-renew-revoke-encoder.hpp
@@ -25,26 +25,26 @@
 
 namespace ndn {
 namespace ndncert {
-namespace newRenewRevokeEncoder {
+namespace requesttlv {
 
-  Block
-  encodeApplicationParameters(RequestType requestType, const std::vector<uint8_t>& ecdhPub,
-                              const security::Certificate& certRequest);
+Block
+encodeApplicationParameters(RequestType requestType, const std::vector<uint8_t>& ecdhPub,
+                            const security::Certificate& certRequest);
 
-  void
-  decodeApplicationParameters(const Block& block, RequestType requestType, std::vector<uint8_t>& ecdhPub,
-                              shared_ptr<security::Certificate>& certRequest);
+void
+decodeApplicationParameters(const Block& block, RequestType requestType, std::vector<uint8_t>& ecdhPub,
+                            shared_ptr<security::Certificate>& certRequest);
 
-  Block
-  encodeDataContent(const std::vector<uint8_t>& ecdhKey, const std::array<uint8_t, 32>& salt,
-                    const RequestId& requestId, const Status& status,
-                    const std::list<std::string>& challenges);
+Block
+encodeDataContent(const std::vector<uint8_t>& ecdhKey, const std::array<uint8_t, 32>& salt,
+                  const RequestId& requestId, const Status& status,
+                  const std::list<std::string>& challenges);
 
-  std::list<std::string>
-  decodeDataContent(const Block& content, std::vector<uint8_t>& ecdhKey,
-                    std::array<uint8_t, 32>& salt, RequestId& requestId, Status& status);
+std::list<std::string>
+decodeDataContent(const Block& content, std::vector<uint8_t>& ecdhKey,
+                  std::array<uint8_t, 32>& salt, RequestId& requestId, Status& status);
 
-} // namespace NewRenewRevokeEncoder
+} // namespace requesttlv
 } // namespace ndncert
 } // namespace ndn
 
diff --git a/src/detail/probe-encoder.cpp b/src/detail/probe-encoder.cpp
index f040d2e..e8f5218 100644
--- a/src/detail/probe-encoder.cpp
+++ b/src/detail/probe-encoder.cpp
@@ -24,7 +24,7 @@
 namespace ndncert {
 
 Block
-probeEncoder::encodeApplicationParameters(std::multimap<std::string, std::string>&& parameters)
+probetlv::encodeApplicationParameters(std::multimap<std::string, std::string>&& parameters)
 {
   Block content(ndn::tlv::ApplicationParameters);
   for (const auto& items : parameters) {
@@ -36,7 +36,7 @@
 }
 
 std::multimap<std::string, std::string>
-probeEncoder::decodeApplicationParameters(const Block& block)
+probetlv::decodeApplicationParameters(const Block& block)
 {
   std::multimap<std::string, std::string> result;
   block.parse();
@@ -50,7 +50,7 @@
 }
 
 Block
-probeEncoder::encodeDataContent(const std::vector<Name>& identifiers, optional<size_t> maxSuffixLength,
+probetlv::encodeDataContent(const std::vector<Name>& identifiers, optional<size_t> maxSuffixLength,
                                 optional<std::vector<std::shared_ptr<security::Certificate>>> redirectionItems)
 {
   Block content(ndn::tlv::Content);
@@ -72,7 +72,7 @@
 }
 
 void
-probeEncoder::decodeDataContent(const Block& block,
+probetlv::decodeDataContent(const Block& block,
                                 std::vector<std::pair<Name, int>>& availableNames,
                                 std::vector<Name>& availableRedirection)
 {
diff --git a/src/detail/probe-encoder.hpp b/src/detail/probe-encoder.hpp
index 3985f93..a7b212a 100644
--- a/src/detail/probe-encoder.hpp
+++ b/src/detail/probe-encoder.hpp
@@ -25,24 +25,25 @@
 
 namespace ndn {
 namespace ndncert {
-namespace probeEncoder {
+namespace probetlv {
 
-  // For Client use
-  Block
-  encodeApplicationParameters(std::multimap<std::string, std::string>&& parameters);
+// For Client use
+Block
+encodeApplicationParameters(std::multimap<std::string, std::string>&& parameters);
 
-  void
-  decodeDataContent(const Block& block, std::vector<std::pair<Name, int>>& availableNames,
-                    std::vector<Name>& availableRedirection);
+void
+decodeDataContent(const Block& block, std::vector<std::pair<Name, int>>& availableNames,
+                  std::vector<Name>& availableRedirection);
 
-  // For CA use
-  Block
-  encodeDataContent(const std::vector<Name>& identifiers,
-                    optional<size_t> maxSuffixLength = nullopt,
-                    optional<std::vector<std::shared_ptr<security::Certificate>>> redirectionItems = nullopt);
+// For CA use
+Block
+encodeDataContent(const std::vector<Name>& identifiers,
+                  optional<size_t> maxSuffixLength = nullopt,
+                  optional<std::vector<std::shared_ptr<security::Certificate>>> redirectionItems = nullopt);
 
-  std::multimap<std::string, std::string>
-  decodeApplicationParameters(const Block& block);
+std::multimap<std::string, std::string>
+decodeApplicationParameters(const Block& block);
+
 } // namespace ProbeEncoder
 } // namespace ndncert
 } // namespace ndn
diff --git a/src/name-assignment/assignment-func.hpp b/src/name-assignment/assignment-func.hpp
index 9ed8e22..29b516a 100644
--- a/src/name-assignment/assignment-func.hpp
+++ b/src/name-assignment/assignment-func.hpp
@@ -46,7 +46,7 @@
    * @return a vector containing the possible namespaces derived from the parameters.
    */
   virtual std::vector<PartialName>
-  assignName(const std::multimap<std::string, std::string> &params) = 0;
+  assignName(const std::multimap<std::string, std::string>& params) = 0;
 
 public:
   template <class AssignmentType>
@@ -63,7 +63,7 @@
 
 NDNCERT_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
     std::vector<std::string> m_nameFormat;
-    
+
 private:
   typedef function<unique_ptr<NameAssignmentFunc>(const std::string&)> FactoryCreateFunc;
   typedef std::map<std::string, FactoryCreateFunc> CurriedFuncFactory;
diff --git a/src/name-assignment/assignment-hash.cpp b/src/name-assignment/assignment-hash.cpp
index 0dec488..f292821 100644
--- a/src/name-assignment/assignment-hash.cpp
+++ b/src/name-assignment/assignment-hash.cpp
@@ -31,7 +31,7 @@
 {}
 
 std::vector<PartialName>
-AssignmentHash::assignName(const std::multimap<std::string, std::string> &params)
+AssignmentHash::assignName(const std::multimap<std::string, std::string>& params)
 {
   std::vector<PartialName> resultList;
   Name result;
diff --git a/src/name-assignment/assignment-hash.hpp b/src/name-assignment/assignment-hash.hpp
index 6acb30c..83acc28 100644
--- a/src/name-assignment/assignment-hash.hpp
+++ b/src/name-assignment/assignment-hash.hpp
@@ -35,7 +35,7 @@
   AssignmentHash(const std::string& format = "");
 
   std::vector<PartialName>
-  assignName(const std::multimap<std::string, std::string> &params) override;
+  assignName(const std::multimap<std::string, std::string>& params) override;
 
 };
 
diff --git a/src/name-assignment/assignment-param.cpp b/src/name-assignment/assignment-param.cpp
index b99d685..53022cc 100644
--- a/src/name-assignment/assignment-param.cpp
+++ b/src/name-assignment/assignment-param.cpp
@@ -30,7 +30,7 @@
 {}
 
 std::vector<PartialName>
-AssignmentParam::assignName(const std::multimap<std::string, std::string> &params)
+AssignmentParam::assignName(const std::multimap<std::string, std::string>& params)
 {
   std::vector<PartialName> resultList;
   Name result;
diff --git a/src/name-assignment/assignment-param.hpp b/src/name-assignment/assignment-param.hpp
index cdf2cc5..52bcb80 100644
--- a/src/name-assignment/assignment-param.hpp
+++ b/src/name-assignment/assignment-param.hpp
@@ -35,7 +35,7 @@
   AssignmentParam(const std::string& format = "");
 
   std::vector<PartialName>
-  assignName(const std::multimap<std::string, std::string> &params) override;
+  assignName(const std::multimap<std::string, std::string>& params) override;
 
 };
 
diff --git a/src/name-assignment/assignment-random.cpp b/src/name-assignment/assignment-random.cpp
index eaed861..284a1f7 100644
--- a/src/name-assignment/assignment-random.cpp
+++ b/src/name-assignment/assignment-random.cpp
@@ -31,7 +31,7 @@
 {}
 
 std::vector<PartialName>
-AssignmentRandom::assignName(const std::multimap<std::string, std::string> &params)
+AssignmentRandom::assignName(const std::multimap<std::string, std::string>& params)
 {
   std::vector<PartialName> resultList;
   resultList.emplace_back(to_string(random::generateSecureWord64()));
diff --git a/src/name-assignment/assignment-random.hpp b/src/name-assignment/assignment-random.hpp
index 978a0b7..86f8096 100644
--- a/src/name-assignment/assignment-random.hpp
+++ b/src/name-assignment/assignment-random.hpp
@@ -35,7 +35,7 @@
   AssignmentRandom(const std::string& format = "");
 
   std::vector<PartialName>
-  assignName(const std::multimap<std::string, std::string> &params) override;
+  assignName(const std::multimap<std::string, std::string>& params) override;
 };
 
 } // namespace ndncert
diff --git a/src/requester.cpp b/src/requester.cpp
index 5372db3..6f83dc1 100644
--- a/src/requester.cpp
+++ b/src/requester.cpp
@@ -66,7 +66,7 @@
 optional<CaProfile>
 Requester::onCaProfileResponse(const Data& reply)
 {
-  auto caItem = infoEncoder::decodeDataContent(reply.getContent());
+  auto caItem = infotlv::decodeDataContent(reply.getContent());
   if (!security::verifySignature(reply, *caItem.m_cert)) {
     NDN_LOG_ERROR("Cannot verify replied Data packet signature.");
     NDN_THROW(std::runtime_error("Cannot verify replied Data packet signature."));
@@ -77,7 +77,7 @@
 optional<CaProfile>
 Requester::onCaProfileResponseAfterRedirection(const Data& reply, const Name& caCertFullName)
 {
-  auto caItem = infoEncoder::decodeDataContent(reply.getContent());
+  auto caItem = infotlv::decodeDataContent(reply.getContent());
   auto certBlock = caItem.m_cert->wireEncode();
   caItem.m_cert = std::make_shared<security::Certificate>(certBlock);
   if (caItem.m_cert->getFullName() != caCertFullName) {
@@ -95,7 +95,7 @@
   auto interest =std::make_shared<Interest>(interestName);
   interest->setMustBeFresh(true);
   interest->setCanBePrefix(false);
-  interest->setApplicationParameters(probeEncoder::encodeApplicationParameters(std::move(probeInfo)));
+  interest->setApplicationParameters(probetlv::encodeApplicationParameters(std::move(probeInfo)));
   return interest;
 }
 
@@ -109,7 +109,7 @@
     return;
   }
   processIfError(reply);
-  probeEncoder::decodeDataContent(reply.getContent(), identityNames, otherCas);
+  probetlv::decodeDataContent(reply.getContent(), identityNames, otherCas);
 }
 
 shared_ptr<Interest>
@@ -165,7 +165,7 @@
   interest->setMustBeFresh(true);
   interest->setCanBePrefix(false);
   interest->setApplicationParameters(
-          newRenewRevokeEncoder::encodeApplicationParameters(RequestType::NEW, state.m_ecdh.getSelfPubKey(), certRequest));
+          requesttlv::encodeApplicationParameters(RequestType::NEW, state.m_ecdh.getSelfPubKey(), certRequest));
 
   // sign the Interest packet
   state.m_keyChain.sign(*interest, signingByKey(keyName));
@@ -185,7 +185,7 @@
   interest->setMustBeFresh(true);
   interest->setCanBePrefix(false);
   interest->setApplicationParameters(
-          newRenewRevokeEncoder::encodeApplicationParameters(RequestType::REVOKE, state.m_ecdh.getSelfPubKey(), certificate));
+          requesttlv::encodeApplicationParameters(RequestType::REVOKE, state.m_ecdh.getSelfPubKey(), certificate));
   return interest;
 }
 
@@ -201,7 +201,7 @@
   auto contentTLV = reply.getContent();
   std::vector<uint8_t> ecdhKey;
   std::array<uint8_t, 32> salt;
-  auto challenges = newRenewRevokeEncoder::decodeDataContent(contentTLV, ecdhKey, salt, state.m_requestId, state.m_status);
+  auto challenges = requesttlv::decodeDataContent(contentTLV, ecdhKey, salt, state.m_requestId, state.m_status);
 
   // ECDH and HKDF
   auto sharedSecret = state.m_ecdh.deriveSecret(ecdhKey);
@@ -261,7 +261,7 @@
     NDN_THROW(std::runtime_error("Cannot verify replied Data packet signature."));
   }
   processIfError(reply);
-  challengeEncoder::decodeDataContent(reply.getContent(), state);
+  challengetlv::decodeDataContent(reply.getContent(), state);
 }
 
 shared_ptr<Interest>
@@ -309,7 +309,7 @@
 void
 Requester::processIfError(const Data& data)
 {
-  auto errorInfo = errorEncoder::decodefromDataContent(data.getContent());
+  auto errorInfo = errortlv::decodefromDataContent(data.getContent());
   if (std::get<0>(errorInfo) == ErrorCode::NO_ERROR) {
     return;
   }
