diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 8cd8475..70aa887 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -24,9 +24,8 @@
 #include "protocol-detail/challenge.hpp"
 #include "protocol-detail/error.hpp"
 #include "protocol-detail/info.hpp"
-#include "protocol-detail/new.hpp"
+#include "protocol-detail/new-renew-revoke.hpp"
 #include "protocol-detail/probe.hpp"
-#include "protocol-detail/revoke.hpp"
 #include <ndn-cxx/metadata-object.hpp>
 #include <ndn-cxx/security/signing-helpers.hpp>
 #include <ndn-cxx/security/verification-helpers.hpp>
@@ -347,18 +346,10 @@
   Data result;
   result.setName(request.getName());
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  if (requestType == RequestType::NEW) {
-    result.setContent(NEW::encodeDataContent(myEcdhPubKeyBase64,
-                                             std::to_string(saltInt),
-                                             requestState,
-                                             m_config.m_caItem.m_supportedChallenges));
-  }
-  else if (requestType == RequestType::REVOKE) {
-    result.setContent(REVOKE::encodeDataContent(myEcdhPubKeyBase64,
+  result.setContent(NEW_RENEW_REVOKE::encodeDataContent(myEcdhPubKeyBase64,
                                                 std::to_string(saltInt),
                                                 requestState,
                                                 m_config.m_caItem.m_supportedChallenges));
-  }
   m_keyChain.sign(result, signingByIdentity(m_config.m_caItem.m_caPrefix));
   m_face.put(result);
   if (m_config.m_statusUpdateCallback) {
diff --git a/src/client-module.cpp b/src/client-module.cpp
index 46405bb..ffda468 100644
--- a/src/client-module.cpp
+++ b/src/client-module.cpp
@@ -32,9 +32,8 @@
 #include "crypto-support/enc-tlv.hpp"
 #include "protocol-detail/challenge.hpp"
 #include "protocol-detail/info.hpp"
-#include "protocol-detail/new.hpp"
+#include "protocol-detail/new-renew-revoke.hpp"
 #include "protocol-detail/probe.hpp"
-#include "protocol-detail/revoke.hpp"
 #include "protocol-detail/error.hpp"
 #include "ndncert-common.hpp"
 
@@ -208,7 +207,7 @@
   interest->setMustBeFresh(true);
   interest->setCanBePrefix(false);
   interest->setApplicationParameters(
-      NEW::encodeApplicationParameters(m_ecdh.getBase64PubKey(), certRequest));
+      NEW_RENEW_REVOKE::encodeApplicationParameters(RequestType::NEW, m_ecdh.getBase64PubKey(), certRequest));
 
   // sign the Interest packet
   m_keyChain.sign(*interest, signingByKey(m_key.getName()));
@@ -274,7 +273,7 @@
   interest->setMustBeFresh(true);
   interest->setCanBePrefix(false);
   interest->setApplicationParameters(
-      REVOKE::encodeApplicationParameters(m_ecdh.getBase64PubKey(), certificate));
+      NEW_RENEW_REVOKE::encodeApplicationParameters(RequestType::REVOKE, m_ecdh.getBase64PubKey(), certificate));
 
   // return the Interest packet
   return interest;
diff --git a/src/protocol-detail/new.cpp b/src/protocol-detail/new-renew-revoke.cpp
similarity index 77%
rename from src/protocol-detail/new.cpp
rename to src/protocol-detail/new-renew-revoke.cpp
index cd7b39c..0a941b1 100644
--- a/src/protocol-detail/new.cpp
+++ b/src/protocol-detail/new-renew-revoke.cpp
@@ -18,7 +18,7 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#include "new.hpp"
+#include "new-renew-revoke.hpp"
 #include "../ndncert-common.hpp"
 #include <ndn-cxx/security/transform/base64-encode.hpp>
 #include <ndn-cxx/security/transform/buffer-source.hpp>
@@ -31,7 +31,7 @@
 _LOG_INIT(ndncert.client);
 
 Block
-NEW::encodeApplicationParameters(const std::string& ecdhPub, const security::v2::Certificate& certRequest)
+NEW_RENEW_REVOKE::encodeApplicationParameters(RequestType requestType, const std::string& ecdhPub, const security::v2::Certificate& certRequest)
 {
   Block request = makeEmptyBlock(tlv::ApplicationParameters);
   std::stringstream ss;
@@ -46,15 +46,19 @@
   }
 
   request.push_back(makeStringBlock(tlv_ecdh_pub, ecdhPub));
-  request.push_back(makeNestedBlock(tlv_cert_request, certRequest));
+  if (requestType == RequestType::NEW || requestType == RequestType::RENEW) {
+    request.push_back(makeNestedBlock(tlv_cert_request, certRequest));
+  } else if (requestType == RequestType::REVOKE) {
+    request.push_back(makeNestedBlock(tlv_cert_to_revoke, certRequest));
+  }
   request.encode();
   return request;
 }
 
 Block
-NEW::encodeDataContent(const std::string& ecdhKey, const std::string& salt,
-                             const RequestState& request,
-                             const std::list<std::string>& challenges)
+NEW_RENEW_REVOKE::encodeDataContent(const std::string& ecdhKey, const std::string& salt,
+                                    const RequestState& request,
+                                    const std::list<std::string>& challenges)
 {
   Block response = makeEmptyBlock(tlv::Content);
   response.push_back(makeStringBlock(tlv_ecdh_pub, ecdhKey));
diff --git a/src/protocol-detail/revoke.hpp b/src/protocol-detail/new-renew-revoke.hpp
similarity index 80%
rename from src/protocol-detail/revoke.hpp
rename to src/protocol-detail/new-renew-revoke.hpp
index 9f02c43..aac51d2 100644
--- a/src/protocol-detail/revoke.hpp
+++ b/src/protocol-detail/new-renew-revoke.hpp
@@ -18,18 +18,18 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#ifndef NDNCERT_PROTOCOL_DETAIL_REVOKE_HPP
-#define NDNCERT_PROTOCOL_DETAIL_REVOKE_HPP
+#ifndef NDNCERT_PROTOCOL_DETAIL_NEW_RENEW_REVOKE_HPP
+#define NDNCERT_PROTOCOL_DETAIL_NEW_RENEW_REVOKE_HPP
 
 #include "../request-state.hpp"
 
 namespace ndn {
 namespace ndncert {
 
-class REVOKE {
+class NEW_RENEW_REVOKE {
 public:
   static Block
-  encodeApplicationParameters(const std::string& ecdhPub, const security::v2::Certificate& certToRevoke);
+  encodeApplicationParameters(RequestType requestType, const std::string& ecdhPub, const security::v2::Certificate& certRequest);
 
   static Block
   encodeDataContent(const std::string& ecdhKey, const std::string& salt,
@@ -40,4 +40,4 @@
 }  // namespace ndncert
 }  // namespace ndn
 
-#endif // NDNCERT_PROTOCOL_DETAIL_REVOKE_HPP
\ No newline at end of file
+#endif // NDNCERT_PROTOCOL_DETAIL_NEW_RENEW_REVOKE_HPP
\ No newline at end of file
diff --git a/src/protocol-detail/new.hpp b/src/protocol-detail/new.hpp
deleted file mode 100644
index 353ebc2..0000000
--- a/src/protocol-detail/new.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2017-2020, Regents of the University of California.
- *
- * This file is part of ndncert, a certificate management system based on NDN.
- *
- * ndncert is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received copies of the GNU General Public License along with
- * ndncert, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndncert authors and contributors.
- */
-
-#ifndef NDNCERT_PROTOCOL_DETAIL_NEW_HPP
-#define NDNCERT_PROTOCOL_DETAIL_NEW_HPP
-
-#include "../request-state.hpp"
-
-namespace ndn {
-namespace ndncert {
-
-class NEW {
-public:
-  /**
-   * Encode Client's certificate request into a ApplicationParameters TLV for NEW Interest.
-   * For client side use.
-   */
-  static Block
-  encodeApplicationParameters(const std::string& ecdhPub, const security::v2::Certificate& certRequest);
-
-  /**
-   * Encode CA's response of NEW Interest into a content TLV for NEW Data packet.
-   * For CA side use.
-   */
-  static Block
-  encodeDataContent(const std::string& ecdhKey, const std::string& salt,
-                    const RequestState& request,
-                    const std::list<std::string>& challenges);
-};
-
-}  // namespace ndncert
-}  // namespace ndn
-
-#endif  // NDNCERT_PROTOCOL_DETAIL_HPP
\ No newline at end of file
diff --git a/src/protocol-detail/revoke.cpp b/src/protocol-detail/revoke.cpp
deleted file mode 100644
index 0123b3f..0000000
--- a/src/protocol-detail/revoke.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2017-2020, Regents of the University of California.
- *
- * This file is part of ndncert, a certificate management system based on NDN.
- *
- * ndncert is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation, either
- * version 3 of the License, or (at your option) any later version.
- *
- * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received copies of the GNU General Public License along with
- * ndncert, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndncert authors and contributors.
- */
-
-#include "revoke.hpp"
-#include "../ndncert-common.hpp"
-#include <ndn-cxx/security/transform/base64-encode.hpp>
-#include <ndn-cxx/security/transform/buffer-source.hpp>
-#include <ndn-cxx/security/transform/stream-sink.hpp>
-#include <ndn-cxx/util/logger.hpp>
-
-namespace ndn {
-namespace ndncert {
-
-_LOG_INIT(ndncert.client);
-
-Block
-REVOKE::encodeApplicationParameters(const std::string& ecdhPub, const security::v2::Certificate& certToRevoke)
-{
-  Block request = makeEmptyBlock(tlv::ApplicationParameters);
-  std::stringstream ss;
-  try {
-    security::transform::bufferSource(certToRevoke.wireEncode().wire(), certToRevoke.wireEncode().size())
-    >> security::transform::base64Encode(false)
-    >> security::transform::streamSink(ss);
-  }
-  catch (const security::transform::Error& e) {
-    _LOG_ERROR("Cannot convert self-signed cert into BASE64 string " << e.what());
-    return request;
-  }
-
-  request.push_back(makeStringBlock(tlv_ecdh_pub, ecdhPub));
-  request.push_back(makeNestedBlock(tlv_cert_to_revoke, certToRevoke));
-  request.encode();
-  return request;
-}
-
-Block
-REVOKE::encodeDataContent(const std::string& ecdhKey, const std::string& salt,
-                             const RequestState& request,
-                             const std::list<std::string>& challenges)
-{
-  Block response = makeEmptyBlock(tlv::Content);
-  response.push_back(makeStringBlock(tlv_ecdh_pub, ecdhKey));
-  response.push_back(makeStringBlock(tlv_salt, salt));
-  response.push_back(makeStringBlock(tlv_request_id, request.m_requestId));
-  response.push_back(makeNonNegativeIntegerBlock(tlv_status, static_cast<size_t>(request.m_status)));
-  for (const auto& entry: challenges) {
-    response.push_back(makeStringBlock(tlv_challenge, entry));
-  }
-  response.encode();
-  return response;
-}
-
-}  // namespace ndncert
-}  // namespace ndn
\ No newline at end of file
