diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 5a16ab3..81b7138 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -58,10 +58,10 @@
 
 CaModule::~CaModule()
 {
-  for (auto handle : m_interestFilterHandles) {
+  for (auto& handle : m_interestFilterHandles) {
     handle.cancel();
   }
-  for (auto handle : m_registeredPrefixHandles) {
+  for (auto& handle : m_registeredPrefixHandles) {
     handle.unregister();
   }
 }
@@ -96,7 +96,7 @@
 
         // register NEW prefix
         filterId = m_face.setInterestFilter(Name(name).append("NEW"),
-                                            bind(&CaModule::onNew, this, _2));
+                                            bind(&CaModule::onNewRenewRevoke, this, _1, _2, RequestType::NEW));
         m_interestFilterHandles.push_back(filterId);
 
         // register SELECT prefix
@@ -106,7 +106,7 @@
 
         // register REVOKE prefix
         filterId = m_face.setInterestFilter(Name(name).append("REVOKE"),
-                                            bind(&CaModule::onRevoke, this, _2));
+                                            bind(&CaModule::onNewRenewRevoke, this, _1, _2, RequestType::REVOKE));
         m_interestFilterHandles.push_back(filterId);
         _LOG_TRACE("Prefix " << name << " got registered");
       },
@@ -226,22 +226,10 @@
 }
 
 void
-CaModule::onNew(const Interest& request)
+CaModule::onNewRenewRevoke(const InterestFilter& filter, const Interest& request, RequestType requestType)
 {
   // NEW Naming Convention: /<CA-prefix>/CA/NEW/[SignedInterestParameters_Digest]
-  onRequestInit(request, REQUEST_TYPE_NEW);
-}
-
-void
-CaModule::onRevoke(const Interest& request)
-{
   // REVOKE Naming Convention: /<CA-prefix>/CA/REVOKE/[SignedInterestParameters_Digest]
-  onRequestInit(request, REQUEST_TYPE_REVOKE);
-}
-
-void
-CaModule::onRequestInit(const Interest& request, int requestType)
-{
   // get ECDH pub key and cert request
   const auto& parameterTLV = request.getApplicationParameters();
   parameterTLV.parse();
@@ -275,7 +263,7 @@
 
   shared_ptr<security::v2::Certificate> clientCert = nullptr;
 
-  if (requestType == REQUEST_TYPE_NEW) {
+  if (requestType == RequestType::NEW) {
     // parse certificate request
     Block cert_req = parameterTLV.get(tlv_cert_request);
     cert_req.parse();
@@ -318,7 +306,7 @@
       return;
     }
   }
-  else if (requestType == REQUEST_TYPE_REVOKE) {
+  else if (requestType == RequestType::REVOKE) {
     // parse certificate request
     Block cert_revoke = parameterTLV.get(tlv_cert_to_revoke);
     cert_revoke.parse();
@@ -362,13 +350,13 @@
   Data result;
   result.setName(request.getName());
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  if (requestType == REQUEST_TYPE_NEW) {
+  if (requestType == RequestType::NEW) {
     result.setContent(NEW::encodeDataContent(myEcdhPubKeyBase64,
                                              std::to_string(saltInt),
                                              certRequest,
                                              m_config.m_supportedChallenges));
   }
-  else if (requestType == REQUEST_TYPE_REVOKE) {
+  else if (requestType == RequestType::REVOKE) {
     result.setContent(REVOKE::encodeDataContent(myEcdhPubKeyBase64,
                                                 std::to_string(saltInt),
                                                 certRequest,
@@ -444,7 +432,7 @@
   Block payload;
   if (certRequest.m_status == Status::PENDING) {
     // if challenge succeeded
-    if (certRequest.m_requestType == REQUEST_TYPE_NEW) {
+    if (certRequest.m_requestType == RequestType::NEW) {
       auto issuedCert = issueCertificate(certRequest);
       certRequest.m_cert = issuedCert;
       certRequest.m_status = Status::SUCCESS;
@@ -466,7 +454,7 @@
       //contentJson.add(JSON_CA_CERT_ID, readString(issuedCert.getName().at(-1)));
       _LOG_TRACE("Challenge succeeded. Certificate has been issued");
     }
-    else if (certRequest.m_requestType == REQUEST_TYPE_REVOKE) {
+    else if (certRequest.m_requestType == RequestType::REVOKE) {
       certRequest.m_status = Status::SUCCESS;
       try {
         m_storage->deleteRequest(certRequest.m_requestId);
