diff --git a/src/ca-detail/ca-memory.cpp b/src/ca-detail/ca-memory.cpp
index d6f6563..67fd57b 100644
--- a/src/ca-detail/ca-memory.cpp
+++ b/src/ca-detail/ca-memory.cpp
@@ -97,7 +97,7 @@
 {
   std::list<CertificateRequest> result;
   for (const auto& entry : m_requests) {
-    if (entry.second.m_caName == caName) {
+    if (entry.second.m_caPrefix == caName) {
       result.push_back(entry.second);
     }
   }
diff --git a/src/ca-detail/ca-sqlite.cpp b/src/ca-detail/ca-sqlite.cpp
index 6b5b4a2..dec5146 100644
--- a/src/ca-detail/ca-sqlite.cpp
+++ b/src/ca-detail/ca-sqlite.cpp
@@ -174,7 +174,7 @@
                              challenge_tp, remaining_tries, remaining_time, probe_token)
                              values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))_SQLTEXT_");
     statement.bind(1, request.m_requestId, SQLITE_TRANSIENT);
-    statement.bind(2, request.m_caName.wireEncode(), SQLITE_TRANSIENT);
+    statement.bind(2, request.m_caPrefix.wireEncode(), SQLITE_TRANSIENT);
     statement.bind(3, request.m_status);
     statement.bind(4, request.m_challengeStatus, SQLITE_TRANSIENT);
     statement.bind(5, request.m_cert.getKeyName().wireEncode(),
@@ -199,7 +199,7 @@
                              challenge_tp, remaining_tries, remaining_time)
                              values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))_SQLTEXT_");
     statement.bind(1, request.m_requestId, SQLITE_TRANSIENT);
-    statement.bind(2, request.m_caName.wireEncode(), SQLITE_TRANSIENT);
+    statement.bind(2, request.m_caPrefix.wireEncode(), SQLITE_TRANSIENT);
     statement.bind(3, request.m_status);
     statement.bind(4, request.m_challengeStatus, SQLITE_TRANSIENT);
     statement.bind(5, request.m_cert.getKeyName().wireEncode(),
diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 4398de7..0dd96da 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -74,7 +74,7 @@
   _LOG_TRACE("Prefix " << localhopInfoPrefix << " got registered");
 
   // register prefixes
-  Name prefix = m_config.m_caName;
+  Name prefix = m_config.m_caPrefix;
   prefix.append("CA");
 
   prefixId = m_face.registerPrefix(prefix,
@@ -125,7 +125,7 @@
   _LOG_TRACE("Received INFO request");
 
   const auto& pib = m_keyChain.getPib();
-  const auto& identity = pib.getIdentity(m_config.m_caName);
+  const auto& identity = pib.getIdentity(m_config.m_caPrefix);
   const auto& cert = identity.getDefaultKey().getDefaultCertificate();
   Block contentTLV = INFO::encodeContentFromCAConfig(m_config, cert);
   Data result;
@@ -134,7 +134,7 @@
   result.setContent(contentTLV);
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
 
-  m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
+  m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
   m_face.put(result);
 
   _LOG_TRACE("Handle INFO: send out the INFO response");
@@ -168,7 +168,7 @@
     // if there is no app-specified name lookup, use a random name id
     availableId = std::to_string(random::generateSecureWord64());
   }
-  Name newIdentityName = m_config.m_caName;
+  Name newIdentityName = m_config.m_caPrefix;
   newIdentityName.append(availableId);
   _LOG_TRACE("Handle PROBE: generate an identity " << newIdentityName);
 
@@ -178,7 +178,7 @@
   result.setName(request.getName());
   result.setContent(contentTLV);
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
+  m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
   m_face.put(result);
   _LOG_TRACE("Handle PROBE: send out the PROBE response");
 }
@@ -240,9 +240,9 @@
   }
 
   // verify the self-signed certificate, the request, and the token
-  if (!m_config.m_caName.isPrefixOf(clientCert->getName()) // under ca prefix
+  if (!m_config.m_caPrefix.isPrefixOf(clientCert->getName()) // under ca prefix
       || !security::v2::Certificate::isValidName(clientCert->getName()) // is valid cert name
-      || clientCert->getName().size() != m_config.m_caName.size() + IS_SUBNAME_MIN_OFFSET) {
+      || clientCert->getName().size() != m_config.m_caPrefix.size() + IS_SUBNAME_MIN_OFFSET) {
     _LOG_ERROR("Invalid self-signed certificate name " << clientCert->getName());
     return;
   }
@@ -257,7 +257,7 @@
 
   // create new request instance
   std::string requestId = std::to_string(random::generateWord64());
-  CertificateRequest certRequest(m_config.m_caName, requestId, STATUS_BEFORE_CHALLENGE, *clientCert);
+  CertificateRequest certRequest(m_config.m_caPrefix, requestId, STATUS_BEFORE_CHALLENGE, *clientCert);
 
   try {
     m_storage->addRequest(certRequest);
@@ -274,7 +274,7 @@
                                       std::to_string(saltInt),
                                       certRequest,
                                       m_config.m_supportedChallenges));
-  m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
+  m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
   m_face.put(result);
 
   if (m_config.m_statusUpdateCallback) {
@@ -385,7 +385,7 @@
   auto contentBlock = encodeBlockWithAesGcm128(tlv::Content, m_aesKey, payloadBuffer->data(),
                                                payloadBuffer->size(), (uint8_t*)"test", strlen("test"));
   result.setContent(contentBlock);
-  m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
+  m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
   m_face.put(result);
 
   if (m_config.m_statusUpdateCallback) {
@@ -409,7 +409,7 @@
   SignatureInfo signatureInfo;
   signatureInfo.setValidityPeriod(period);
   security::SigningInfo signingInfo(security::SigningInfo::SIGNER_TYPE_ID,
-                                    m_config.m_caName, signatureInfo);
+                                    m_config.m_caPrefix, signatureInfo);
   newCert.setFreshnessPeriod(m_config.m_freshnessPeriod);
 
   m_keyChain.sign(newCert, signingInfo);
@@ -423,7 +423,7 @@
   std::string requestId;
   CertificateRequest certRequest;
   try {
-    requestId = readString(request.getName().at(m_config.m_caName.size() + 2));
+    requestId = readString(request.getName().at(m_config.m_caPrefix.size() + 2));
   }
   catch (const std::exception& e) {
     _LOG_ERROR("Cannot read the request ID out from the request: " << e.what());
@@ -493,12 +493,12 @@
 {
   JsonSection root;
   // ca-prefix
-  Name caName = m_config.m_caName;
+  Name caName = m_config.m_caPrefix;
   root.put("ca-prefix", caName.toUri());
 
   // ca-info
   const auto& pib = m_keyChain.getPib();
-  const auto& identity = pib.getIdentity(m_config.m_caName);
+  const auto& identity = pib.getIdentity(m_config.m_caPrefix);
   const auto& cert = identity.getDefaultKey().getDefaultCertificate();
   std::string caInfo;
   if (m_config.m_caInfo.empty()) {
diff --git a/src/certificate-request.cpp b/src/certificate-request.cpp
index 22b67b0..3798ea6 100644
--- a/src/certificate-request.cpp
+++ b/src/certificate-request.cpp
@@ -28,7 +28,7 @@
 
 CertificateRequest::CertificateRequest(const Name& caName, const std::string& requestId, int status,
                                        const security::v2::Certificate& cert)
-  : m_caName(caName)
+  : m_caPrefix(caName)
   , m_requestId(requestId)
   , m_status(status)
   , m_cert(cert)
@@ -39,7 +39,7 @@
                                        const std::string& challengeStatus, const std::string& challengeType,
                                        const std::string& challengeTp, int remainingTime, int remainingTries,
                                        const JsonSection& challengeSecrets, const security::v2::Certificate& cert)
-  : m_caName(caName)
+  : m_caPrefix(caName)
   , m_requestId(requestId)
   , m_status(status)
   , m_cert(cert)
@@ -62,7 +62,7 @@
 operator<<(std::ostream& os, const CertificateRequest& request)
 {
   os << "Request CA name:\n";
-  os << "  " << request.m_caName << "\n";
+  os << "  " << request.m_caPrefix << "\n";
   os << "Request ID:\n";
   os << "  " << request.m_requestId << "\n";
   if (request.m_status != -1) {
diff --git a/src/certificate-request.hpp b/src/certificate-request.hpp
index d44316c..216c21f 100644
--- a/src/certificate-request.hpp
+++ b/src/certificate-request.hpp
@@ -57,7 +57,7 @@
   setProbeToken(const std::shared_ptr<Data>& probeToken);
 
 public:
-  Name m_caName;
+  Name m_caPrefix;
   std::string m_requestId = "";
   int m_status = -1;
   security::v2::Certificate m_cert;
diff --git a/src/challenge-module/challenge-email.cpp b/src/challenge-module/challenge-email.cpp
index 4ec3c6f..c1e498a 100644
--- a/src/challenge-module/challenge-email.cpp
+++ b/src/challenge-module/challenge-email.cpp
@@ -219,7 +219,7 @@
 {
   std::string command = m_sendEmailScript;
   command += " \"" + emailAddress + "\" \"" + secret + "\" \""
-    + request.m_caName.toUri() + "\" \"" + request.m_cert.getName().toUri()  + "\"";
+    + request.m_caPrefix.toUri() + "\" \"" + request.m_cert.getName().toUri()  + "\"";
   int result = system(command.c_str());
   if (result == -1) {
     _LOG_TRACE("EmailSending Script " + m_sendEmailScript + " fails.");
diff --git a/src/client-config.cpp b/src/client-config.cpp
index 2aab26c..d03fc8e 100644
--- a/src/client-config.cpp
+++ b/src/client-config.cpp
@@ -65,7 +65,7 @@
   std::stringstream ss;
   for (const auto& item : m_caItems) {
     JsonSection caItem;
-    caItem.put("ca-prefix", item.m_caName.toUri());
+    caItem.put("ca-prefix", item.m_caPrefix.toUri());
     caItem.put("ca-info", item.m_caInfo);
     caItem.put("probe", item.m_probe);
     ss.str(std::string());
@@ -87,8 +87,8 @@
 ClientConfig::extractCaItem(const JsonSection& configSection)
 {
   ClientCaItem item;
-  item.m_caName = Name(configSection.get("ca-prefix", ""));
-  if (item.m_caName.empty()) {
+  item.m_caPrefix = Name(configSection.get("ca-prefix", ""));
+  if (item.m_caPrefix.empty()) {
     BOOST_THROW_EXCEPTION(Error("Cannot read ca-prefix from the config file"));
   }
   item.m_caInfo = configSection.get("ca-info", "");
@@ -105,7 +105,7 @@
 void
 ClientConfig::removeCaItem(const Name& caName)
 {
-  m_caItems.remove_if([&](const ClientCaItem& item) { return item.m_caName == caName; });
+  m_caItems.remove_if([&](const ClientCaItem& item) { return item.m_caPrefix == caName; });
 }
 
 }  // namespace ndncert
diff --git a/src/client-module.cpp b/src/client-module.cpp
index adad5d9..d6fdc14 100644
--- a/src/client-module.cpp
+++ b/src/client-module.cpp
@@ -70,7 +70,7 @@
 
   // verify the probe Data's sig
   if (!security::verifySignature(reply, caItem.m_anchor)) {
-    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caName.toUri());
+    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caPrefix.toUri());
     return false;
   }
   return true;
@@ -87,7 +87,7 @@
   // update the local config
   bool findItem = false;
   for (auto& item : m_config.m_caItems) {
-    if (item.m_caName == caItem.m_caName) {
+    if (item.m_caPrefix == caItem.m_caPrefix) {
       findItem = true;
       item = caItem;
     }
@@ -100,7 +100,7 @@
 shared_ptr<Interest>
 ClientModule::generateProbeInterest(const ClientCaItem& ca, const std::string& probeInfo)
 {
-  Name interestName = ca.m_caName;
+  Name interestName = ca.m_caPrefix;
   interestName.append("CA").append("PROBE");
   auto interest = make_shared<Interest>(interestName);
   interest->setMustBeFresh(true);
@@ -118,7 +118,7 @@
 ClientModule::onProbeResponse(const Data& reply)
 {
   if (!security::verifySignature(reply, m_ca.m_anchor)) {
-    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caName.toUri());
+    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caPrefix.toUri());
     return;
   }
 
@@ -143,7 +143,7 @@
   if (!identityName.empty()) { // if identityName is not empty, find the corresponding CA
     bool findCa = false;
     for (const auto& caItem : m_config.m_caItems) {
-      if (caItem.m_caName.isPrefixOf(identityName)) {
+      if (caItem.m_caPrefix.isPrefixOf(identityName)) {
         m_ca = caItem;
         findCa = true;
       }
@@ -160,7 +160,7 @@
     else {
       NDN_LOG_TRACE("Randomly create a new name because m_identityName is empty and the param is empty.");
       auto id = std::to_string(random::generateSecureWord64());
-      m_identityName = m_ca.m_caName;
+      m_identityName = m_ca.m_caPrefix;
       m_identityName.append(id);
     }
   }
@@ -195,7 +195,7 @@
   m_keyChain.sign(certRequest, signingByKey(m_key.getName()).setSignatureInfo(signatureInfo));
 
   // generate Interest packet
-  Name interestName = m_ca.m_caName;
+  Name interestName = m_ca.m_caPrefix;
   interestName.append("CA").append("NEW");
   auto interest = make_shared<Interest>(interestName);
   interest->setMustBeFresh(true);
@@ -213,7 +213,7 @@
 ClientModule::onNewResponse(const Data& reply)
 {
   if (!security::verifySignature(reply, m_ca.m_anchor)) {
-    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caName.toUri());
+    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caPrefix.toUri());
     return std::list<std::string>();
   }
   auto contentTLV = reply.getContent();
@@ -247,7 +247,7 @@
   challengeRequest.parse();
   m_challengeType = readString(challengeRequest.get(tlv_selected_challenge));
 
-  Name interestName = m_ca.m_caName;
+  Name interestName = m_ca.m_caPrefix;
   interestName.append("CA").append("CHALLENGE").append(m_requestId);
   auto interest = make_shared<Interest>(interestName);
   interest->setMustBeFresh(true);
@@ -267,7 +267,7 @@
 ClientModule::onChallengeResponse(const Data& reply)
 {
   if (!security::verifySignature(reply, m_ca.m_anchor)) {
-    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caName.toUri());
+    _LOG_ERROR("Cannot verify data signature from " << m_ca.m_caPrefix.toUri());
     return;
   }
   auto result = decodeBlockWithAesGcm128(reply.getContent(), m_aesKey, (const uint8_t*)"test", strlen("test"));
@@ -288,7 +288,7 @@
 shared_ptr<Interest>
 ClientModule::generateDownloadInterest()
 {
-  Name interestName = m_ca.m_caName;
+  Name interestName = m_ca.m_caPrefix;
   interestName.append("CA").append("DOWNLOAD").append(m_requestId);
   auto interest = make_shared<Interest>(interestName);
   interest->setMustBeFresh(true);
