diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 324a859..658d9c5 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -326,8 +326,8 @@
 
   // create new request instance
   std::string requestId = std::to_string(random::generateWord64());
-  RequestState requestState(m_config.m_caItem.m_caPrefix, requestId, requestType, Status::BEFORE_CHALLENGE, *clientCert,
-          makeBinaryBlock(tlv::ContentType_Key, aesKey, sizeof(aesKey)));
+  CaState requestState(m_config.m_caItem.m_caPrefix, requestId, requestType, Status::BEFORE_CHALLENGE, *clientCert,
+                       makeBinaryBlock(tlv::ContentType_Key, aesKey, sizeof(aesKey)));
   m_storage->addRequest(requestState);
   Data result;
   result.setName(request.getName());
@@ -347,7 +347,7 @@
 CaModule::onChallenge(const Interest& request)
 {
   // get certificate request state
-  RequestState requestState = getCertificateRequest(request);
+  CaState requestState = getCertificateRequest(request);
   if (requestState.m_requestId == "") {
     _LOG_ERROR("No certificate request state can be found.");
     m_face.put(generateErrorDataPacket(request.getName(), ErrorCode::INVALID_PARAMETER,
@@ -446,7 +446,7 @@
 }
 
 security::v2::Certificate
-CaModule::issueCertificate(const RequestState& requestState)
+CaModule::issueCertificate(const CaState& requestState)
 {
   auto expectedPeriod =
       requestState.m_cert.getValidityPeriod().getPeriod();
@@ -468,11 +468,11 @@
   return newCert;
 }
 
-RequestState
+CaState
 CaModule::getCertificateRequest(const Interest& request)
 {
   std::string requestId;
-  RequestState requestState;
+  CaState requestState;
   try {
     requestId = readString(request.getName().at(m_config.m_caItem.m_caPrefix.size() + 2));
   }
diff --git a/src/ca-module.hpp b/src/ca-module.hpp
index acc2a50..bcf7b7b 100644
--- a/src/ca-module.hpp
+++ b/src/ca-module.hpp
@@ -92,11 +92,11 @@
   void
   onRegisterFailed(const std::string& reason);
 
-  RequestState
+  CaState
   getCertificateRequest(const Interest& request);
 
   security::v2::Certificate
-  issueCertificate(const RequestState& requestState);
+  issueCertificate(const CaState& requestState);
 
   void
   registerPrefix();
diff --git a/src/request-state.cpp b/src/ca-state.cpp
similarity index 79%
rename from src/request-state.cpp
rename to src/ca-state.cpp
index 2861b0a..e30fd66 100644
--- a/src/request-state.cpp
+++ b/src/ca-state.cpp
@@ -18,7 +18,7 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#include "request-state.hpp"
+#include "ca-state.hpp"
 #include <ndn-cxx/util/indented-stream.hpp>
 
 namespace ndn {
@@ -36,14 +36,14 @@
 {
 }
 
-RequestState::RequestState()
+CaState::CaState()
     : m_requestType(RequestType::NOTINITIALIZED)
     , m_status(Status::NOT_STARTED)
 {
 }
 
-RequestState::RequestState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
-                                       const security::v2::Certificate& cert, Block encryptionKey)
+CaState::CaState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
+                 const security::v2::Certificate& cert, Block encryptionKey)
     : m_caPrefix(caName)
     , m_requestId(requestId)
     , m_requestType(requestType)
@@ -53,11 +53,11 @@
 {
 }
 
-RequestState::RequestState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
-                                       const security::v2::Certificate& cert, const std::string& challengeType,
-                                       const std::string& challengeStatus, const system_clock::TimePoint& challengeTp,
-                                       size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
-                                       Block encryptionKey)
+CaState::CaState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
+                 const security::v2::Certificate& cert, const std::string& challengeType,
+                 const std::string& challengeStatus, const system_clock::TimePoint& challengeTp,
+                 size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
+                 Block encryptionKey)
     : m_caPrefix(caName)
     , m_requestId(requestId)
     , m_requestType(requestType)
@@ -70,7 +70,7 @@
 }
 
 std::ostream&
-operator<<(std::ostream& os, const RequestState& request)
+operator<<(std::ostream& os, const CaState& request)
 {
   os << "Request's CA name:\n";
   os << "  " << request.m_caPrefix << "\n";
diff --git a/src/request-state.hpp b/src/ca-state.hpp
similarity index 69%
rename from src/request-state.hpp
rename to src/ca-state.hpp
index f8c0443..6806688 100644
--- a/src/request-state.hpp
+++ b/src/ca-state.hpp
@@ -18,8 +18,8 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#ifndef NDNCERT_REQUEST_STATE_HPP
-#define NDNCERT_REQUEST_STATE_HPP
+#ifndef NDNCERT_CA_STATE_HPP
+#define NDNCERT_CA_STATE_HPP
 
 #include "ndncert-common.hpp"
 
@@ -44,17 +44,17 @@
  * m_challengeDefinedField to finish verification.
  *
  */
-class RequestState {
+class CaState {
 
 public:
-  RequestState();
-  RequestState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
-                     const security::v2::Certificate& cert, Block m_encryptionKey);
-  RequestState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
-                     const security::v2::Certificate& cert, const std::string& challengeType,
-                     const std::string& challengeStatus, const system_clock::TimePoint& challengeTp,
-                     size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
-                     Block m_encryptionKey);
+  CaState();
+  CaState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
+          const security::v2::Certificate& cert, Block m_encryptionKey);
+  CaState(const Name& caName, const std::string& requestId, RequestType requestType, Status status,
+          const security::v2::Certificate& cert, const std::string& challengeType,
+          const std::string& challengeStatus, const system_clock::TimePoint& challengeTp,
+          size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
+          Block m_encryptionKey);
 
 public:
   Name m_caPrefix;
@@ -69,9 +69,9 @@
 };
 
 std::ostream&
-operator<<(std::ostream& os, const RequestState& request);
+operator<<(std::ostream& os, const CaState& request);
 
 }  // namespace ndncert
 }  // namespace ndn
 
-#endif  // NDNCERT_REQUEST_STATE_HPP
+#endif  // NDNCERT_CA_STATE_HPP
diff --git a/src/ca-storage-detail/ca-memory.cpp b/src/ca-storage-detail/ca-memory.cpp
index a81f4bf..827f36c 100644
--- a/src/ca-storage-detail/ca-memory.cpp
+++ b/src/ca-storage-detail/ca-memory.cpp
@@ -30,7 +30,7 @@
 
 NDNCERT_REGISTER_CA_STORAGE(CaMemory);
 
-RequestState
+CaState
 CaMemory::getRequest(const std::string& requestId)
 {
   auto search = m_requests.find(requestId);
@@ -41,7 +41,7 @@
 }
 
 void
-CaMemory::addRequest(const RequestState& request)
+CaMemory::addRequest(const CaState& request)
 {
   for (auto& entry : m_requests) {
     const auto& existingRequest = entry.second;
@@ -68,7 +68,7 @@
 }
 
 void
-CaMemory::updateRequest(const RequestState& request)
+CaMemory::updateRequest(const CaState& request)
 {
   m_requests[request.m_requestId] = request;
 }
@@ -82,20 +82,20 @@
   }
 }
 
-std::list<RequestState>
+std::list<CaState>
 CaMemory::listAllRequests()
 {
-  std::list<RequestState> result;
+  std::list<CaState> result;
   for (const auto& entry : m_requests) {
     result.push_back(entry.second);
   }
   return result;
 }
 
-std::list<RequestState>
+std::list<CaState>
 CaMemory::listAllRequests(const Name& caName)
 {
-  std::list<RequestState> result;
+  std::list<CaState> result;
   for (const auto& entry : m_requests) {
     if (entry.second.m_caPrefix == caName) {
       result.push_back(entry.second);
diff --git a/src/ca-storage-detail/ca-memory.hpp b/src/ca-storage-detail/ca-memory.hpp
index 19e7d4f..63fded7 100644
--- a/src/ca-storage-detail/ca-memory.hpp
+++ b/src/ca-storage-detail/ca-memory.hpp
@@ -33,22 +33,22 @@
 
 public:
   // certificate request related
-  RequestState
+  CaState
   getRequest(const std::string& requestId) override;
 
   void
-  addRequest(const RequestState& request) override;
+  addRequest(const CaState& request) override;
 
   void
-  updateRequest(const RequestState& request) override;
+  updateRequest(const CaState& request) override;
 
   void
   deleteRequest(const std::string& requestId) override;
 
-  std::list<RequestState>
+  std::list<CaState>
   listAllRequests() override;
 
-  std::list<RequestState>
+  std::list<CaState>
   listAllRequests(const Name& caName) override;
 
   // certificate related
@@ -71,7 +71,7 @@
   listAllIssuedCertificates(const Name& caName) override;
 
 private:
-  std::map<std::string, RequestState> m_requests;
+  std::map<std::string, CaState> m_requests;
   std::map<std::string, security::v2::Certificate> m_issuedCerts;
 };
 
diff --git a/src/ca-storage-detail/ca-sqlite.cpp b/src/ca-storage-detail/ca-sqlite.cpp
index d392bdd..a3ff327 100644
--- a/src/ca-storage-detail/ca-sqlite.cpp
+++ b/src/ca-storage-detail/ca-sqlite.cpp
@@ -37,7 +37,7 @@
 
 static const std::string INITIALIZATION = R"_DBTEXT_(
 CREATE TABLE IF NOT EXISTS
-  RequestStates(
+  CaStates(
     id INTEGER PRIMARY KEY,
     request_id TEXT NOT NULL,
     ca_name BLOB NOT NULL,
@@ -54,9 +54,9 @@
     encryption_key BLOB NOT NULL
   );
 CREATE UNIQUE INDEX IF NOT EXISTS
-  RequestStateIdIndex ON RequestStates(request_id);
+  CaStateIdIndex ON CaStates(request_id);
 CREATE UNIQUE INDEX IF NOT EXISTS
-  RequestStateKeyNameIndex ON RequestStates(cert_key_name);
+  CaStateKeyNameIndex ON CaStates(cert_key_name);
 
 CREATE TABLE IF NOT EXISTS
   IssuedCerts(
@@ -114,7 +114,7 @@
   sqlite3_close(m_database);
 }
 
-RequestState
+CaState
 CaSqlite::getRequest(const std::string& requestId)
 {
   Sqlite3Statement statement(m_database,
@@ -122,7 +122,7 @@
                              challenge_status, cert_request,
                              challenge_type, challenge_secrets,
                              challenge_tp, remaining_tries, remaining_time, request_type, encryption_key
-                             FROM RequestStates where request_id = ?)_SQLTEXT_");
+                             FROM CaStates where request_id = ?)_SQLTEXT_");
   statement.bind(1, requestId, SQLITE_TRANSIENT);
 
   if (statement.step() == SQLITE_ROW) {
@@ -138,13 +138,13 @@
     auto requestType = static_cast<RequestType>(statement.getInt(10));
     auto encryptionKey = statement.getBlock(11);
     if (challengeType != "") {
-      return RequestState(caName, requestId, requestType, status, cert,
-                                challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                                remainingTries, time::seconds(remainingTime),
-                                convertString2Json(challengeSecrets), encryptionKey);
+      return CaState(caName, requestId, requestType, status, cert,
+                     challengeType, challengeStatus, time::fromIsoString(challengeTp),
+                     remainingTries, time::seconds(remainingTime),
+                     convertString2Json(challengeSecrets), encryptionKey);
     }
     else {
-      return RequestState(caName, requestId, requestType, status, cert, encryptionKey);
+      return CaState(caName, requestId, requestType, status, cert, encryptionKey);
     }
   }
   else {
@@ -153,13 +153,13 @@
 }
 
 void
-CaSqlite::addRequest(const RequestState& request)
+CaSqlite::addRequest(const CaState& request)
 {
 
   // check whether request is there already
   auto keyNameTlv = request.m_cert.getKeyName().wireEncode();
   Sqlite3Statement statement1(m_database,
-          R"_SQLTEXT_(SELECT 1 FROM RequestStates where cert_key_name = ?)_SQLTEXT_");
+          R"_SQLTEXT_(SELECT 1 FROM CaStates where cert_key_name = ?)_SQLTEXT_");
   statement1.bind(1, keyNameTlv, SQLITE_TRANSIENT);
   if (statement1.step() == SQLITE_ROW) {
     BOOST_THROW_EXCEPTION(Error("Request for " + request.m_cert.getKeyName().toUri() + " already exists"));
@@ -175,7 +175,7 @@
 
   Sqlite3Statement statement(
       m_database,
-      R"_SQLTEXT_(INSERT OR ABORT INTO RequestStates (request_id, ca_name, status, request_type,
+      R"_SQLTEXT_(INSERT OR ABORT INTO CaStates (request_id, ca_name, status, request_type,
                   cert_key_name, cert_request, challenge_type, challenge_status, challenge_secrets,
                   challenge_tp, remaining_tries, remaining_time, encryption_key)
                   values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))_SQLTEXT_");
@@ -201,10 +201,10 @@
 }
 
 void
-CaSqlite::updateRequest(const RequestState& request)
+CaSqlite::updateRequest(const CaState& request)
 {
   Sqlite3Statement statement(m_database,
-                             R"_SQLTEXT_(UPDATE RequestStates
+                             R"_SQLTEXT_(UPDATE CaStates
                              SET status = ?, challenge_type = ?, challenge_status = ?, challenge_secrets = ?,
                              challenge_tp = ?, remaining_tries = ?, remaining_time = ?
                              WHERE request_id = ?)_SQLTEXT_");
@@ -232,14 +232,14 @@
   }
 }
 
-std::list<RequestState>
+std::list<CaState>
 CaSqlite::listAllRequests()
 {
-  std::list<RequestState> result;
+  std::list<CaState> result;
   Sqlite3Statement statement(m_database, R"_SQLTEXT_(SELECT id, request_id, ca_name, status,
                              challenge_status, cert_key_name, cert_request, challenge_type, challenge_secrets,
                              challenge_tp, remaining_tries, remaining_time, request_type, encryption_key
-                             FROM RequestStates)_SQLTEXT_");
+                             FROM CaStates)_SQLTEXT_");
   while (statement.step() == SQLITE_ROW) {
     auto requestId = statement.getString(1);
     Name caName(statement.getBlock(2));
@@ -254,27 +254,27 @@
     auto requestType = static_cast<RequestType>(statement.getInt(12));
     auto encryptionKey = statement.getBlock(13);
     if (challengeType != "") {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert,
-                                          challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                                          remainingTries, time::seconds(remainingTime),
-                                          convertString2Json(challengeSecrets), encryptionKey));
+      result.push_back(CaState(caName, requestId, requestType, status, cert,
+                               challengeType, challengeStatus, time::fromIsoString(challengeTp),
+                               remainingTries, time::seconds(remainingTime),
+                               convertString2Json(challengeSecrets), encryptionKey));
     }
     else {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert, encryptionKey));
+      result.push_back(CaState(caName, requestId, requestType, status, cert, encryptionKey));
     }
   }
   return result;
 }
 
-std::list<RequestState>
+std::list<CaState>
 CaSqlite::listAllRequests(const Name& caName)
 {
-  std::list<RequestState> result;
+  std::list<CaState> result;
   Sqlite3Statement statement(m_database,
                              R"_SQLTEXT_(SELECT id, request_id, ca_name, status,
                              challenge_status, cert_key_name, cert_request, challenge_type, challenge_secrets,
                              challenge_tp, remaining_tries, remaining_time, request_type, encryption_key
-                             FROM RequestStates WHERE ca_name = ?)_SQLTEXT_");
+                             FROM CaStates WHERE ca_name = ?)_SQLTEXT_");
   statement.bind(1, caName.wireEncode(), SQLITE_TRANSIENT);
 
   while (statement.step() == SQLITE_ROW) {
@@ -291,13 +291,13 @@
     auto requestType = static_cast<RequestType>(statement.getInt(12));
     auto encryptionKey = statement.getBlock(13);
     if (challengeType != "") {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert,
-                                          challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                                          remainingTries, time::seconds(remainingTime),
-                                          convertString2Json(challengeSecrets), encryptionKey));
+      result.push_back(CaState(caName, requestId, requestType, status, cert,
+                               challengeType, challengeStatus, time::fromIsoString(challengeTp),
+                               remainingTries, time::seconds(remainingTime),
+                               convertString2Json(challengeSecrets), encryptionKey));
     }
     else {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert, encryptionKey));
+      result.push_back(CaState(caName, requestId, requestType, status, cert, encryptionKey));
     }
   }
   return result;
@@ -307,7 +307,7 @@
 CaSqlite::deleteRequest(const std::string& requestId)
 {
   Sqlite3Statement statement(m_database,
-                             R"_SQLTEXT_(DELETE FROM RequestStates WHERE request_id = ?)_SQLTEXT_");
+                             R"_SQLTEXT_(DELETE FROM CaStates WHERE request_id = ?)_SQLTEXT_");
   statement.bind(1, requestId, SQLITE_TRANSIENT);
   statement.step();
 }
diff --git a/src/ca-storage-detail/ca-sqlite.hpp b/src/ca-storage-detail/ca-sqlite.hpp
index 2d22a21..eac49dd 100644
--- a/src/ca-storage-detail/ca-sqlite.hpp
+++ b/src/ca-storage-detail/ca-sqlite.hpp
@@ -22,7 +22,7 @@
 #define NDNCERT_CA_DETAIL_CA_SQLITE_HPP
 
 #include "../ca-module.hpp"
-#include "../request-state.hpp"
+#include "../ca-state.hpp"
 
 struct sqlite3;
 
@@ -41,22 +41,22 @@
 
 public:
   // certificate request related
-  RequestState
+  CaState
   getRequest(const std::string& requestId) override;
 
   void
-  addRequest(const RequestState& request) override;
+  addRequest(const CaState& request) override;
 
   void
-  updateRequest(const RequestState& request) override;
+  updateRequest(const CaState& request) override;
 
   void
   deleteRequest(const std::string& requestId) override;
 
-  std::list<RequestState>
+  std::list<CaState>
   listAllRequests() override;
 
-  std::list<RequestState>
+  std::list<CaState>
   listAllRequests(const Name& caName) override;
 
   // certificate related
diff --git a/src/ca-storage.hpp b/src/ca-storage.hpp
index 3abba7f..b4d5194 100644
--- a/src/ca-storage.hpp
+++ b/src/ca-storage.hpp
@@ -21,7 +21,7 @@
 #ifndef NDNCERT_CA_STORAGE_HPP
 #define NDNCERT_CA_STORAGE_HPP
 
-#include "request-state.hpp"
+#include "ca-state.hpp"
 
 namespace ndn {
 namespace ndncert {
@@ -42,22 +42,22 @@
   ~CaStorage();
 
 public: // certificate request related
-  virtual RequestState
+  virtual CaState
   getRequest(const std::string& requestId) = 0;
 
   virtual void
-  addRequest(const RequestState& request) = 0;
+  addRequest(const CaState& request) = 0;
 
   virtual void
-  updateRequest(const RequestState& request) = 0;
+  updateRequest(const CaState& request) = 0;
 
   virtual void
   deleteRequest(const std::string& requestId) = 0;
 
-  virtual std::list<RequestState>
+  virtual std::list<CaState>
   listAllRequests() = 0;
 
-  virtual std::list<RequestState>
+  virtual std::list<CaState>
   listAllRequests(const Name& caName) = 0;
 
 public: // certificate related
diff --git a/src/challenge-module.cpp b/src/challenge-module.cpp
index f6c96c8..b4bcc45 100644
--- a/src/challenge-module.cpp
+++ b/src/challenge-module.cpp
@@ -73,7 +73,7 @@
 }
 
 std::tuple<ErrorCode, std::string>
-ChallengeModule::returnWithError(RequestState& request, ErrorCode errorCode, std::string&& errorInfo)
+ChallengeModule::returnWithError(CaState& request, ErrorCode errorCode, std::string&& errorInfo)
 {
   request.m_status = Status::FAILURE;
   request.m_challengeType = "";
@@ -82,7 +82,7 @@
 }
 
 std::tuple<ErrorCode, std::string>
-ChallengeModule::returnWithNewChallengeStatus(RequestState& request, const std::string& challengeStatus,
+ChallengeModule::returnWithNewChallengeStatus(CaState& request, const std::string& challengeStatus,
                                               JsonSection&& challengeSecret, size_t remainingTries, time::seconds remainingTime)
 {
   request.m_status = Status::CHALLENGE;
@@ -92,7 +92,7 @@
 }
 
 std::tuple<ErrorCode, std::string>
-ChallengeModule::returnWithSuccess(RequestState& request)
+ChallengeModule::returnWithSuccess(CaState& request)
 {
   request.m_status = Status::PENDING;
   request.m_challengeType = CHALLENGE_TYPE;
diff --git a/src/challenge-module.hpp b/src/challenge-module.hpp
index 1f31bd2..4349762 100644
--- a/src/challenge-module.hpp
+++ b/src/challenge-module.hpp
@@ -21,7 +21,7 @@
 #ifndef NDNCERT_CHALLENGE_MODULE_HPP
 #define NDNCERT_CHALLENGE_MODULE_HPP
 
-#include "request-state.hpp"
+#include "ca-state.hpp"
 
 namespace ndn {
 namespace ndncert {
@@ -50,7 +50,7 @@
 
   // For CA
   virtual std::tuple<ErrorCode, std::string>
-  handleChallengeRequest(const Block& params, RequestState& request) = 0;
+  handleChallengeRequest(const Block& params, CaState& request) = 0;
 
   // For Client
   virtual std::vector<std::tuple<std::string, std::string>>
@@ -67,14 +67,14 @@
 protected:
   // used by challenge modules
   std::tuple<ErrorCode, std::string>
-  returnWithError(RequestState& request, ErrorCode errorCode, std::string&& errorInfo);
+  returnWithError(CaState& request, ErrorCode errorCode, std::string&& errorInfo);
 
   std::tuple<ErrorCode, std::string>
-  returnWithNewChallengeStatus(RequestState& request, const std::string& challengeStatus,
+  returnWithNewChallengeStatus(CaState& request, const std::string& challengeStatus,
                                JsonSection&& challengeSecret, size_t remainingTries, time::seconds remainingTime);
 
   std::tuple<ErrorCode, std::string>
-  returnWithSuccess(RequestState& request);
+  returnWithSuccess(CaState& request);
 
 public:
   const std::string CHALLENGE_TYPE;
diff --git a/src/challenge-modules/challenge-credential.cpp b/src/challenge-modules/challenge-credential.cpp
index 50a15c0..f6e26c2 100644
--- a/src/challenge-modules/challenge-credential.cpp
+++ b/src/challenge-modules/challenge-credential.cpp
@@ -76,7 +76,7 @@
 
 // For CA
 std::tuple<ErrorCode, std::string>
-ChallengeCredential::handleChallengeRequest(const Block& params, RequestState& request)
+ChallengeCredential::handleChallengeRequest(const Block& params, CaState& request)
 {
   params.parse();
   if (m_trustAnchors.empty()) {
diff --git a/src/challenge-modules/challenge-credential.hpp b/src/challenge-modules/challenge-credential.hpp
index 07b0158..2354767 100644
--- a/src/challenge-modules/challenge-credential.hpp
+++ b/src/challenge-modules/challenge-credential.hpp
@@ -53,7 +53,7 @@
 
   // For CA
   std::tuple<ErrorCode, std::string>
-  handleChallengeRequest(const Block& params, RequestState& request) override;
+  handleChallengeRequest(const Block& params, CaState& request) override;
 
   // For Client
   std::vector<std::tuple<std::string, std::string>>
diff --git a/src/challenge-modules/challenge-email.cpp b/src/challenge-modules/challenge-email.cpp
index d98972f..2775d9e 100644
--- a/src/challenge-modules/challenge-email.cpp
+++ b/src/challenge-modules/challenge-email.cpp
@@ -43,7 +43,7 @@
 
 // For CA
 std::tuple<ErrorCode, std::string>
-ChallengeEmail::handleChallengeRequest(const Block& params, RequestState& request)
+ChallengeEmail::handleChallengeRequest(const Block& params, CaState& request)
 {
   params.parse();
   auto currentTime = time::system_clock::now();
@@ -157,7 +157,7 @@
 
 void
 ChallengeEmail::sendEmail(const std::string& emailAddress, const std::string& secret,
-                          const RequestState& request) const
+                          const CaState& request) const
 {
   std::string command = m_sendEmailScript;
   command += " \"" + emailAddress + "\" \"" + secret + "\" \"" + request.m_caPrefix.toUri() + "\" \"" + request.m_cert.getName().toUri() + "\"";
diff --git a/src/challenge-modules/challenge-email.hpp b/src/challenge-modules/challenge-email.hpp
index bfae052..5d803f1 100644
--- a/src/challenge-modules/challenge-email.hpp
+++ b/src/challenge-modules/challenge-email.hpp
@@ -57,7 +57,7 @@
 
   // For CA
   std::tuple<ErrorCode, std::string>
-  handleChallengeRequest(const Block& params, RequestState& request) override;
+  handleChallengeRequest(const Block& params, CaState& request) override;
 
   // For Client
   std::vector<std::tuple<std::string, std::string>>
@@ -81,7 +81,7 @@
 
   void
   sendEmail(const std::string& emailAddress, const std::string& secret,
-            const RequestState& request) const;
+            const CaState& request) const;
 
 private:
   std::string m_sendEmailScript;
diff --git a/src/challenge-modules/challenge-pin.cpp b/src/challenge-modules/challenge-pin.cpp
index ecc17db..a5d5580 100644
--- a/src/challenge-modules/challenge-pin.cpp
+++ b/src/challenge-modules/challenge-pin.cpp
@@ -38,7 +38,7 @@
 
 // For CA
 std::tuple<ErrorCode, std::string>
-ChallengePin::handleChallengeRequest(const Block& params, RequestState& request)
+ChallengePin::handleChallengeRequest(const Block& params, CaState& request)
 {
   params.parse();
   auto currentTime = time::system_clock::now();
diff --git a/src/challenge-modules/challenge-pin.hpp b/src/challenge-modules/challenge-pin.hpp
index 7b58a27..cd85eec 100644
--- a/src/challenge-modules/challenge-pin.hpp
+++ b/src/challenge-modules/challenge-pin.hpp
@@ -52,7 +52,7 @@
 
   // For CA
   std::tuple<ErrorCode, std::string>
-  handleChallengeRequest(const Block& params, RequestState& request) override;
+  handleChallengeRequest(const Block& params, CaState& request) override;
 
   // For Client
   std::vector<std::tuple<std::string, std::string>>
diff --git a/src/configuration.hpp b/src/configuration.hpp
index 6b9edeb..acd1b99 100644
--- a/src/configuration.hpp
+++ b/src/configuration.hpp
@@ -18,10 +18,10 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#ifndef NDNCERT_CA_CONFIG_HPP
-#define NDNCERT_CA_CONFIG_HPP
+#ifndef NDNCERT_CONFIGURATION_HPP
+#define NDNCERT_CONFIGURATION_HPP
 
-#include "request-state.hpp"
+#include "ca-state.hpp"
 
 namespace ndn {
 namespace ndncert {
@@ -95,9 +95,9 @@
  * fired whenever a request instance is created, challenge status is updated, and when certificate
  * is issued.
  *
- * @p RequestState, input, the state of the certificate request whose status is updated.
+ * @p CaState, input, the state of the certificate request whose status is updated.
  */
-using StatusUpdateCallback = function<void(const RequestState&)>;
+using StatusUpdateCallback = function<void(const CaState&)>;
 
 /**
  * @brief CA's configuration on NDNCERT.
@@ -185,4 +185,4 @@
 }  // namespace ndncert
 }  // namespace ndn
 
-#endif  // NDNCERT_CA_CONFIG_HPP
+#endif  // NDNCERT_CONFIGURATION_HPP
diff --git a/src/crypto-support/crypto-helper.hpp b/src/crypto-support/crypto-helper.hpp
index 1ff0149..aaa4237 100644
--- a/src/crypto-support/crypto-helper.hpp
+++ b/src/crypto-support/crypto-helper.hpp
@@ -21,7 +21,7 @@
 #ifndef NDNCERT_CRYPTO_SUPPORT_CRYPTO_HELPER_HPP
 #define NDNCERT_CRYPTO_SUPPORT_CRYPTO_HELPER_HPP
 
-#include "request-state.hpp"
+#include "ca-state.hpp"
 #include <openssl/ec.h>
 #include <openssl/evp.h>
 
diff --git a/src/protocol-detail/challenge.cpp b/src/protocol-detail/challenge.cpp
index 847f7db..0116923 100644
--- a/src/protocol-detail/challenge.cpp
+++ b/src/protocol-detail/challenge.cpp
@@ -24,7 +24,7 @@
 namespace ndncert {
 
 Block
-CHALLENGE::encodeDataPayload(const RequestState& request)
+CHALLENGE::encodeDataPayload(const CaState& request)
 {
   Block response = makeEmptyBlock(tlv_encrypted_payload);
   response.push_back(makeNonNegativeIntegerBlock(tlv_status, static_cast<size_t>(request.m_status)));
diff --git a/src/protocol-detail/challenge.hpp b/src/protocol-detail/challenge.hpp
index 8078237..e50d01e 100644
--- a/src/protocol-detail/challenge.hpp
+++ b/src/protocol-detail/challenge.hpp
@@ -21,7 +21,7 @@
 #ifndef NDNCERT_PROTOCOL_DETAIL_CHALLENGE_HPP
 #define NDNCERT_PROTOCOL_DETAIL_CHALLENGE_HPP
 
-#include "../request-state.hpp"
+#include "../ca-state.hpp"
 
 namespace ndn {
 namespace ndncert {
@@ -29,7 +29,7 @@
 class CHALLENGE {
 public:
   static Block
-  encodeDataPayload(const RequestState& request);
+  encodeDataPayload(const CaState& request);
 
   struct DecodedData{
       Status status;
diff --git a/src/protocol-detail/new-renew-revoke.cpp b/src/protocol-detail/new-renew-revoke.cpp
index 6cae7ff..9d6f5f8 100644
--- a/src/protocol-detail/new-renew-revoke.cpp
+++ b/src/protocol-detail/new-renew-revoke.cpp
@@ -76,7 +76,7 @@
 
 Block
 NEW_RENEW_REVOKE::encodeDataContent(const std::string& ecdhKey, const std::string& salt,
-                                    const RequestState& request,
+                                    const CaState& request,
                                     const std::list<std::string>& challenges)
 {
   Block response = makeEmptyBlock(tlv::Content);
diff --git a/src/protocol-detail/new-renew-revoke.hpp b/src/protocol-detail/new-renew-revoke.hpp
index 4c9cb18..86c46d0 100644
--- a/src/protocol-detail/new-renew-revoke.hpp
+++ b/src/protocol-detail/new-renew-revoke.hpp
@@ -21,7 +21,7 @@
 #ifndef NDNCERT_PROTOCOL_DETAIL_NEW_RENEW_REVOKE_HPP
 #define NDNCERT_PROTOCOL_DETAIL_NEW_RENEW_REVOKE_HPP
 
-#include "../request-state.hpp"
+#include "../ca-state.hpp"
 
 namespace ndn {
 namespace ndncert {
@@ -36,7 +36,7 @@
 
   static Block
   encodeDataContent(const std::string& ecdhKey, const std::string& salt,
-                             const RequestState& request,
+                             const CaState& request,
                              const std::list<std::string>& challenges);
   struct DecodedData {
     std::string ecdhKey;
diff --git a/src/requester.hpp b/src/requester.hpp
index 5a19c2d..7dc162d 100644
--- a/src/requester.hpp
+++ b/src/requester.hpp
@@ -18,11 +18,11 @@
  * See AUTHORS.md for complete list of ndncert authors and contributors.
  */
 
-#ifndef NDNCERT_CLIENT_MODULE_HPP
-#define NDNCERT_CLIENT_MODULE_HPP
+#ifndef NDNCERT_REQUESTER_HPP
+#define NDNCERT_REQUESTER_HPP
 
 #include "configuration.hpp"
-#include "request-state.hpp"
+#include "ca-state.hpp"
 #include "crypto-support/crypto-helper.hpp"
 
 namespace ndn {
@@ -120,4 +120,4 @@
 } // namespace ndncert
 } // namespace ndn
 
-#endif // NDNCERT_CLIENT_MODULE_HPP
+#endif // NDNCERT_REQUESTER_HPP
diff --git a/tests/unit-tests/ca-memory.t.cpp b/tests/unit-tests/ca-memory.t.cpp
index 4581eb8..e5229f2 100644
--- a/tests/unit-tests/ca-memory.t.cpp
+++ b/tests/unit-tests/ca-memory.t.cpp
@@ -82,7 +82,7 @@
   auto cert1 = key1.getDefaultCertificate();
 
   // add operation
-  RequestState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
+  CaState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
   BOOST_CHECK_NO_THROW(storage.addRequest(request1));
 
   // get operation
@@ -96,8 +96,8 @@
   json.put("code", "1234");
 
   // update operation
-  RequestState request2(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert1,
-                              "email", "test", time::system_clock::now(), 3, time::seconds(3600), std::move(json), makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
+  CaState request2(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert1,
+                   "email", "test", time::system_clock::now(), 3, time::seconds(3600), std::move(json), makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
   storage.updateRequest(request2);
   result = storage.getRequest("123");
   BOOST_CHECK_EQUAL(request2.m_cert, result.m_cert);
@@ -107,7 +107,7 @@
   auto identity2 = addIdentity(Name("/ndn/site2"));
   auto key2 = identity2.getDefaultKey();
   auto cert2 = key2.getDefaultCertificate();
-  RequestState request3(Name("/ndn/site2"), "456", RequestType::NEW, Status::BEFORE_CHALLENGE, cert2, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
+  CaState request3(Name("/ndn/site2"), "456", RequestType::NEW, Status::BEFORE_CHALLENGE, cert2, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
   storage.addRequest(request3);
 
   // list operation
diff --git a/tests/unit-tests/ca-module.t.cpp b/tests/unit-tests/ca-module.t.cpp
index 66a929b..d18931f 100644
--- a/tests/unit-tests/ca-module.t.cpp
+++ b/tests/unit-tests/ca-module.t.cpp
@@ -457,7 +457,7 @@
   signatureInfo.setValidityPeriod(security::ValidityPeriod(time::system_clock::now(),
                                                            time::system_clock::now() + time::hours(10)));
   m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
-  RequestState certRequest(Name("/ndn"), "122", RequestType::NEW, Status::SUCCESS, clientCert, makeEmptyBlock(tlv::ContentType_Key));
+  CaState certRequest(Name("/ndn"), "122", RequestType::NEW, Status::SUCCESS, clientCert, makeEmptyBlock(tlv::ContentType_Key));
   auto issuedCert = ca.issueCertificate(certRequest);
 
   CaProfile item;
diff --git a/tests/unit-tests/ca-sqlite.t.cpp b/tests/unit-tests/ca-sqlite.t.cpp
index 8e0be7e..df7fab2 100644
--- a/tests/unit-tests/ca-sqlite.t.cpp
+++ b/tests/unit-tests/ca-sqlite.t.cpp
@@ -81,7 +81,7 @@
   auto cert1 = key1.getDefaultCertificate();
 
   // add operation
-  RequestState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
+  CaState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
   BOOST_CHECK_NO_THROW(storage.addRequest(request1));
 
   // get operation
@@ -94,8 +94,8 @@
   // update operation
   JsonSection json;
   json.put("test", "4567");
-  RequestState request2(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert1,
-                             "email", "test", time::system_clock::now(), 3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
+  CaState request2(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert1,
+                   "email", "test", time::system_clock::now(), 3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
   storage.updateRequest(request2);
   result = storage.getRequest("123");
   BOOST_CHECK_EQUAL(request2.m_cert, result.m_cert);
@@ -105,7 +105,7 @@
   auto identity2 = addIdentity(Name("/ndn/site2"));
   auto key2 = identity2.getDefaultKey();
   auto cert2 = key2.getDefaultCertificate();
-  RequestState request3(Name("/ndn/site2"), "456", RequestType::NEW, Status::BEFORE_CHALLENGE, cert2, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
+  CaState request3(Name("/ndn/site2"), "456", RequestType::NEW, Status::BEFORE_CHALLENGE, cert2, makeStringBlock(tlv::ContentType_Key, "PretendItIsAKey"));
   storage.addRequest(request3);
 
   // list operation
@@ -130,7 +130,7 @@
     auto cert1 = key1.getDefaultCertificate();
 
     // add operation
-    RequestState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeEmptyBlock(tlv::ContentType_Key));
+    CaState request1(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, makeEmptyBlock(tlv::ContentType_Key));
     BOOST_CHECK_NO_THROW(storage.addRequest(request1));
     // add again
     BOOST_CHECK_THROW(storage.addRequest(request1), std::exception);
diff --git a/tests/unit-tests/challenge-credential.t.cpp b/tests/unit-tests/challenge-credential.t.cpp
index 65d3a3d..11910c8 100644
--- a/tests/unit-tests/challenge-credential.t.cpp
+++ b/tests/unit-tests/challenge-credential.t.cpp
@@ -55,7 +55,7 @@
   auto identityA = addIdentity(Name("/example"));
   auto keyA = identityA.getDefaultKey();
   auto certA = key.getDefaultCertificate();
-  RequestState state(Name("/example"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, certA, makeEmptyBlock(tlv::ContentType_Key));
+  CaState state(Name("/example"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, certA, makeEmptyBlock(tlv::ContentType_Key));
 
   // create requester's credential
   auto identityB = addIdentity(Name("/trust/cert"));
diff --git a/tests/unit-tests/challenge-email.t.cpp b/tests/unit-tests/challenge-email.t.cpp
index 27139c0..15de367 100644
--- a/tests/unit-tests/challenge-email.t.cpp
+++ b/tests/unit-tests/challenge-email.t.cpp
@@ -45,7 +45,7 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengeEmail::PARAMETER_KEY_EMAIL));
@@ -94,7 +94,7 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengeEmail::PARAMETER_KEY_EMAIL));
@@ -115,9 +115,9 @@
   auto cert = key.getDefaultCertificate();
   JsonSection json;
   json.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
-                             "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
-                             3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
+                  "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
+                  3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengeEmail::PARAMETER_KEY_CODE));
@@ -137,9 +137,9 @@
   auto cert = key.getDefaultCertificate();
   JsonSection json;
   json.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
-                             "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
-                             3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
+                  "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
+                  3, time::seconds(3600), std::move(json), makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengeEmail::PARAMETER_KEY_CODE));
diff --git a/tests/unit-tests/challenge-pin.t.cpp b/tests/unit-tests/challenge-pin.t.cpp
index 49df787..1b37a28 100644
--- a/tests/unit-tests/challenge-pin.t.cpp
+++ b/tests/unit-tests/challenge-pin.t.cpp
@@ -38,7 +38,7 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::BEFORE_CHALLENGE, cert, makeEmptyBlock(tlv::ContentType_Key));
 
   ChallengePin challenge;
   challenge.handleChallengeRequest(makeEmptyBlock(tlv_encrypted_payload), request);
@@ -55,9 +55,9 @@
   auto cert = key.getDefaultCertificate();
   JsonSection secret;
   secret.add(ChallengePin::PARAMETER_KEY_CODE, "12345");
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
-                             "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
-                             3, time::seconds(3600), std::move(secret), makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
+                  "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
+                  3, time::seconds(3600), std::move(secret), makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengePin::PARAMETER_KEY_CODE));
@@ -77,9 +77,9 @@
   auto cert = key.getDefaultCertificate();
   JsonSection secret;
   secret.add(ChallengePin::PARAMETER_KEY_CODE, "12345");
-  RequestState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
-                             "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
-                             3, time::seconds(3600), std::move(secret), makeEmptyBlock(tlv::ContentType_Key));
+  CaState request(Name("/ndn/site1"), "123", RequestType::NEW, Status::CHALLENGE, cert,
+                  "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
+                  3, time::seconds(3600), std::move(secret), makeEmptyBlock(tlv::ContentType_Key));
 
   Block paramTLV = makeEmptyBlock(tlv_encrypted_payload);
   paramTLV.push_back(makeStringBlock(tlv_parameter_key, ChallengePin::PARAMETER_KEY_CODE));
diff --git a/tools/ndncert-ca-server.cpp b/tools/ndncert-ca-server.cpp
index 1ecb532..0786654 100644
--- a/tools/ndncert-ca-server.cpp
+++ b/tools/ndncert-ca-server.cpp
@@ -82,7 +82,7 @@
   CaModule ca(face, keyChain, configFilePath);
 
   if (wantRepoOut) {
-      ca.setStatusUpdateCallback([&] (const RequestState& request) {
+      ca.setStatusUpdateCallback([&] (const CaState& request) {
           if (request.m_status == Status::SUCCESS && request.m_requestType == RequestType::NEW) {
             auto issuedCert = request.m_cert;
             boost::asio::ip::tcp::iostream requestStream;
diff --git a/tools/ndncert-ca-status.cpp b/tools/ndncert-ca-status.cpp
index 5d09436..e8ca561 100644
--- a/tools/ndncert-ca-status.cpp
+++ b/tools/ndncert-ca-status.cpp
@@ -53,7 +53,7 @@
   }
 
   CaSqlite storage;
-  std::list<RequestState> requestList;
+  std::list<CaState> requestList;
   std::list<security::v2::Certificate> certList;
   if (caNameString != "") {
     requestList = storage.listAllRequests(Name(caNameString));
