diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 89cddcf..e40a62d 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -306,8 +306,13 @@
   }
   RequestId id;
   std::memcpy(id.data(), requestIdData, id.size());
-  RequestState requestState(m_config.m_caProfile.m_caPrefix, id, requestType,
-                            Status::BEFORE_CHALLENGE, *clientCert, std::move(aesKey));
+  // initialize request state
+  RequestState requestState;
+  requestState.caPrefix = m_config.m_caProfile.m_caPrefix;
+  requestState.requestId = id;
+  requestState.requestType = requestType;
+  requestState.cert = *clientCert;
+  requestState.encryptionKey = aesKey;
   try {
     m_storage->addRequest(requestState);
   }
diff --git a/src/detail/ca-request-state.cpp b/src/detail/ca-request-state.cpp
index 55b5cf9..739d717 100644
--- a/src/detail/ca-request-state.cpp
+++ b/src/detail/ca-request-state.cpp
@@ -66,35 +66,6 @@
 {
 }
 
-RequestState::RequestState(const Name& caName, const RequestId& requestId, RequestType requestType, Status status,
-                           const security::Certificate& cert, std::array<uint8_t, 16>&& encryptionKey, uint32_t aesBlockCounter)
-    : caPrefix(caName)
-    , requestId(requestId)
-    , requestType(requestType)
-    , status(status)
-    , cert(cert)
-    , encryptionKey(std::move(encryptionKey))
-    , aesBlockCounter(aesBlockCounter)
-{
-}
-
-RequestState::RequestState(const Name& caName, const RequestId& requestId, RequestType requestType, Status status,
-                           const security::Certificate& cert, const std::string& challengeType,
-                           const std::string& challengeStatus, const time::system_clock::TimePoint& challengeTp,
-                           size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
-                           std::array<uint8_t, 16>&& encryptionKey, uint32_t aesBlockCounter)
-    : caPrefix(caName)
-    , requestId(requestId)
-    , requestType(requestType)
-    , status(status)
-    , cert(cert)
-    , encryptionKey(std::move(encryptionKey))
-    , aesBlockCounter(aesBlockCounter)
-    , challengeType(challengeType)
-    , challengeState(ChallengeState(challengeStatus, challengeTp, remainingTries, remainingTime, std::move(challengeSecrets)))
-{
-}
-
 std::ostream&
 operator<<(std::ostream& os, const RequestState& request)
 {
diff --git a/src/detail/ca-request-state.hpp b/src/detail/ca-request-state.hpp
index 1857509..120a283 100644
--- a/src/detail/ca-request-state.hpp
+++ b/src/detail/ca-request-state.hpp
@@ -86,24 +86,8 @@
  *
  * ChallengeModule should take use of RequestState.ChallengeState to keep the challenge state.
  */
-class RequestState
+struct RequestState
 {
-public:
-  /**
-   * @brief Used to instantiate a RequestState when challenge is not started.
-   */
-  RequestState(const Name& caName, const RequestId& requestId, RequestType requestType, Status status,
-               const security::Certificate& cert, std::array<uint8_t, 16>&& m_encryptionKey, uint32_t aesBlockCounter = 0);
-  /**
-   * @brief Used to instantiate a RequestState after challenge is started.
-   */
-  RequestState(const Name& caName, const RequestId& requestId, RequestType requestType, Status status,
-               const security::Certificate& cert, const std::string& challengeType,
-               const std::string& challengeStatus, const time::system_clock::TimePoint& challengeTp,
-               size_t remainingTries, time::seconds remainingTime, JsonSection&& challengeSecrets,
-               std::array<uint8_t, 16>&& m_encryptionKey, uint32_t aesBlockCounter);
-
-public:
   /**
    * @brief The CA that the request is under.
    */
@@ -119,7 +103,7 @@
   /**
    * @brief The status of the request.
    */
-  Status status;
+  Status status = Status::BEFORE_CHALLENGE;
   /**
    * @brief The self-signed certificate in the request.
    */
diff --git a/src/detail/ca-sqlite.cpp b/src/detail/ca-sqlite.cpp
index db37397..05a4c80 100644
--- a/src/detail/ca-sqlite.cpp
+++ b/src/detail/ca-sqlite.cpp
@@ -135,31 +135,25 @@
   statement.bind(1, requestId.data(), requestId.size(), SQLITE_TRANSIENT);
 
   if (statement.step() == SQLITE_ROW) {
-    Name caName(statement.getBlock(1));
-    auto status = static_cast<Status>(statement.getInt(2));
-    auto challengeStatus = statement.getString(3);
-    security::Certificate cert(statement.getBlock(4));
-    auto challengeType = statement.getString(5);
-    auto challengeSecrets = statement.getString(6);
-    auto challengeTp = statement.getString(7);
-    auto remainingTries = statement.getInt(8);
-    auto remainingTime = statement.getInt(9);
-    auto requestType = static_cast<RequestType>(statement.getInt(10));
-    std::array<uint8_t, 16> encryptionKey;
-    std::memcpy(encryptionKey.data(), statement.getBlob(11), statement.getSize(11));
-    auto aesCounter = statement.getInt(12);
-    if (challengeType != "") {
-      return RequestState(caName, requestId, requestType, status, cert,
-                          challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                          remainingTries, time::seconds(remainingTime),
-                          convertString2Json(challengeSecrets), std::move(encryptionKey), aesCounter);
+    RequestState state;
+    state.caPrefix = Name(statement.getBlock(1));
+    state.status = static_cast<Status>(statement.getInt(2));
+    state.cert = security::Certificate(statement.getBlock(4));
+    state.challengeType = statement.getString(5);
+    state.requestType = static_cast<RequestType>(statement.getInt(10));
+    std::memcpy(state.encryptionKey.data(), statement.getBlob(11), statement.getSize(11));
+    state.aesBlockCounter = statement.getInt(12);
+    if (state.challengeType != "") {
+      ChallengeState challengeState(statement.getString(3), time::fromIsoString(statement.getString(7)),
+                                    statement.getInt(8), time::seconds(statement.getInt(9)),
+                                    convertString2Json(statement.getString(6)));
+      state.challengeState = challengeState;
     }
-    else {
-      return RequestState(caName, requestId, requestType, status, cert, std::move(encryptionKey));
-    }
+    return state;
   }
   else {
-    NDN_THROW(std::runtime_error("Request " + toHex(requestId.data(), requestId.size()) + " cannot be fetched from database"));
+    NDN_THROW(std::runtime_error("Request " + toHex(requestId.data(), requestId.size()) +
+                                 " cannot be fetched from database"));
   }
 }
 
@@ -235,32 +229,22 @@
                              encryption_key, aes_block_counter
                              FROM RequestStates)_SQLTEXT_");
   while (statement.step() == SQLITE_ROW) {
-    RequestId requestId;
-    std::memcpy(requestId.data(), statement.getBlob(1), statement.getSize(1));
-    Name caName(statement.getBlock(2));
-    auto status = static_cast<Status>(statement.getInt(3));
-    auto challengeStatus = statement.getString(4);
-    security::Certificate cert(statement.getBlock(5));
-    auto challengeType = statement.getString(6);
-    auto challengeSecrets = statement.getString(7);
-    auto challengeTp = statement.getString(8);
-    auto remainingTries = statement.getInt(9);
-    auto remainingTime = statement.getInt(10);
-    auto requestType = static_cast<RequestType>(statement.getInt(11));
-    std::array<uint8_t, 16> encryptionKey;
-    std::memcpy(encryptionKey.data(), statement.getBlob(12), statement.getSize(12));
-    auto aesBlockCounter = statement.getInt(13);
-    if (challengeType != "") {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert,
-                                    challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                                    remainingTries, time::seconds(remainingTime),
-                                    convertString2Json(challengeSecrets),
-                                    std::move(encryptionKey), aesBlockCounter));
+    RequestState state;
+    std::memcpy(state.requestId.data(), statement.getBlob(1), statement.getSize(1));
+    state.caPrefix = Name(statement.getBlock(2));
+    state.status = static_cast<Status>(statement.getInt(3));
+    state.challengeType = statement.getString(6);
+    state.cert = security::Certificate(statement.getBlock(5));
+    state.requestType = static_cast<RequestType>(statement.getInt(11));
+    std::memcpy(state.encryptionKey.data(), statement.getBlob(12), statement.getSize(12));
+    state.aesBlockCounter = statement.getInt(13);
+    if (state.challengeType != "") {
+      ChallengeState challengeState(statement.getString(4), time::fromIsoString(statement.getString(8)),
+                                    statement.getInt(9), time::seconds(statement.getInt(10)),
+                                    convertString2Json(statement.getString(7)));
+      state.challengeState = challengeState;
     }
-    else {
-      result.push_back(RequestState(caName, requestId, requestType,
-                                    status, cert, std::move(encryptionKey), aesBlockCounter));
-    }
+    result.push_back(state);
   }
   return result;
 }
@@ -278,32 +262,22 @@
   statement.bind(1, caName.wireEncode(), SQLITE_TRANSIENT);
 
   while (statement.step() == SQLITE_ROW) {
-    RequestId requestId;
-    std::memcpy(requestId.data(), statement.getBlob(1), statement.getSize(1));
-    Name caName(statement.getBlock(2));
-    auto status = static_cast<Status>(statement.getInt(3));
-    auto challengeStatus = statement.getString(4);
-    security::Certificate cert(statement.getBlock(5));
-    auto challengeType = statement.getString(6);
-    auto challengeSecrets = statement.getString(7);
-    auto challengeTp = statement.getString(8);
-    auto remainingTries = statement.getInt(9);
-    auto remainingTime = statement.getInt(10);
-    auto requestType = static_cast<RequestType>(statement.getInt(11));
-    std::array<uint8_t, 16> encryptionKey;
-    std::memcpy(encryptionKey.data(), statement.getBlob(12), statement.getSize(12));
-    auto aesBlockCounter = statement.getInt(13);
-    if (challengeType != "") {
-      result.push_back(RequestState(caName, requestId, requestType, status, cert,
-                                    challengeType, challengeStatus, time::fromIsoString(challengeTp),
-                                    remainingTries, time::seconds(remainingTime),
-                                    convertString2Json(challengeSecrets),
-                                    std::move(encryptionKey), aesBlockCounter));
+    RequestState state;
+    std::memcpy(state.requestId.data(), statement.getBlob(1), statement.getSize(1));
+    state.caPrefix = Name(statement.getBlock(2));
+    state.status = static_cast<Status>(statement.getInt(3));
+    state.challengeType = statement.getString(6);
+    state.cert = security::Certificate(statement.getBlock(5));
+    state.requestType = static_cast<RequestType>(statement.getInt(11));
+    std::memcpy(state.encryptionKey.data(), statement.getBlob(12), statement.getSize(12));
+    state.aesBlockCounter = statement.getInt(13);
+    if (state.challengeType != "") {
+      ChallengeState challengeState(statement.getString(4), time::fromIsoString(statement.getString(8)),
+                                    statement.getInt(9), time::seconds(statement.getInt(10)),
+                                    convertString2Json(statement.getString(7)));
+      state.challengeState = challengeState;
     }
-    else {
-      result.push_back(RequestState(caName, requestId, requestType, status,
-                                    cert, std::move(encryptionKey), aesBlockCounter));
-    }
+    result.push_back(state);
   }
   return result;
 }
diff --git a/tests/unit-tests/ca-memory.t.cpp b/tests/unit-tests/ca-memory.t.cpp
index 3a69e0b..290e4ca 100644
--- a/tests/unit-tests/ca-memory.t.cpp
+++ b/tests/unit-tests/ca-memory.t.cpp
@@ -39,10 +39,12 @@
   auto cert1 = key1.getDefaultCertificate();
 
   // add operation
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey1;
-  RequestState request1(Name("/ndn/site1"), requestId, RequestType::NEW,
-                        Status::BEFORE_CHALLENGE, cert1, std::move(aesKey1));
+  RequestId requestId = {{101}};
+  RequestState request1;
+  request1.caPrefix = Name("/ndn/site1");
+  request1.requestId = requestId;
+  request1.requestType = RequestType::NEW;
+  request1.cert = cert1;
   BOOST_CHECK_NO_THROW(storage.addRequest(request1));
 
   // get operation
@@ -53,27 +55,33 @@
   BOOST_CHECK_EQUAL_COLLECTIONS(request1.encryptionKey.begin(), request1.encryptionKey.end(),
                                 result.encryptionKey.begin(), result.encryptionKey.end());
 
-  JsonSection json;
-  json.put("code", "1234");
-
   // update operation
-  std::array<uint8_t, 16> aesKey2;
-  RequestState request2(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert1,
-                   "email", "test", time::system_clock::now(), 3, time::seconds(3600),
-                   std::move(json), std::move(aesKey2), 0);
+  RequestState request2;
+  request2.caPrefix = Name("/ndn/site1");
+  request2.requestId = requestId;
+  request2.requestType = RequestType::NEW;
+  request2.cert = cert1;
+  request2.challengeType = "email";
+  JsonSection secret;
+  secret.add("code", "1234");
+  request2.challengeState = ChallengeState("test", time::system_clock::now(), 3,
+                                           time::seconds(3600), std::move(secret));
   storage.updateRequest(request2);
   result = storage.getRequest(requestId);
   BOOST_CHECK_EQUAL(request2.cert, result.cert);
   BOOST_CHECK(request2.status == result.status);
   BOOST_CHECK_EQUAL(request2.caPrefix, result.caPrefix);
 
+  // another add operation
   auto identity2 = addIdentity(Name("/ndn/site2"));
   auto key2 = identity2.getDefaultKey();
   auto cert2 = key2.getDefaultCertificate();
-  RequestId requestId2 = {{8,7,6,5,4,3,2,1}};
-  std::array<uint8_t, 16> aesKey3;
-  RequestState request3(Name("/ndn/site2"), requestId2, RequestType::NEW, Status::BEFORE_CHALLENGE,
-                        cert2, std::move(aesKey3));
+  RequestId requestId2 = {{102}};
+  RequestState request3;
+  request3.caPrefix = Name("/ndn/site2");
+  request3.requestId = requestId2;
+  request3.requestType = RequestType::NEW;
+  request3.cert = cert2;
   storage.addRequest(request3);
 
   // list operation
diff --git a/tests/unit-tests/ca-module.t.cpp b/tests/unit-tests/ca-module.t.cpp
index b2d3300..a74db0d 100644
--- a/tests/unit-tests/ca-module.t.cpp
+++ b/tests/unit-tests/ca-module.t.cpp
@@ -467,9 +467,13 @@
   signatureInfo.setValidityPeriod(security::ValidityPeriod(time::system_clock::now(),
                                                            time::system_clock::now() + time::hours(10)));
   m_keyChain.sign(clientCert, signingByKey(clientKey.getName()).setSignatureInfo(signatureInfo));
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  RequestState certRequest(Name("/ndn"), requestId, RequestType::NEW, Status::SUCCESS, clientCert, std::move(aesKey));
+  RequestId requestId = {{101}};
+  RequestState certRequest;
+  certRequest.caPrefix = Name("/ndn");
+  certRequest.requestId = requestId;
+  certRequest.requestType = RequestType::NEW;
+  certRequest.status = Status::SUCCESS;
+  certRequest.cert = clientCert;
   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 f0383ff..e338b63 100644
--- a/tests/unit-tests/ca-sqlite.t.cpp
+++ b/tests/unit-tests/ca-sqlite.t.cpp
@@ -38,9 +38,12 @@
   auto cert1 = key1.getDefaultCertificate();
 
   // add operation
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey1;
-  RequestState request1(Name("/ndn/site1"), requestId, RequestType::NEW, Status::BEFORE_CHALLENGE, cert1, std::move(aesKey1));
+  RequestId requestId = {{101}};
+  RequestState request1;
+  request1.caPrefix = Name("/ndn/site1");
+  request1.requestId = requestId;
+  request1.requestType = RequestType::NEW;
+  request1.cert = cert1;
   storage.addRequest(request1);
 
   // get operation
@@ -52,25 +55,32 @@
                                 result.encryptionKey.begin(), result.encryptionKey.end());
 
   // update operation
-  JsonSection json;
-  json.put("test", "4567");
-  std::array<uint8_t, 16> aesKey2;
-  RequestState request2(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert1,
-                   "email", "test", time::system_clock::now(), 3, time::seconds(3600),
-                  std::move(json), std::move(aesKey2), 0);
+  RequestState request2;
+  request2.caPrefix = Name("/ndn/site1");
+  request2.requestId = requestId;
+  request2.requestType = RequestType::NEW;
+  request2.cert = cert1;
+  request2.challengeType = "email";
+  JsonSection secret;
+  secret.add("code", "1234");
+  request2.challengeState = ChallengeState("test", time::system_clock::now(), 3,
+                                           time::seconds(3600), std::move(secret));
   storage.updateRequest(request2);
   result = storage.getRequest(requestId);
   BOOST_CHECK_EQUAL(request2.cert, result.cert);
   BOOST_CHECK(request2.status == result.status);
   BOOST_CHECK_EQUAL(request2.caPrefix, result.caPrefix);
 
+  // another add operation
   auto identity2 = addIdentity(Name("/ndn/site2"));
   auto key2 = identity2.getDefaultKey();
   auto cert2 = key2.getDefaultCertificate();
-  RequestId requestId2 = {{8,7,6,5,4,3,2,1}};
-  std::array<uint8_t, 16> aesKey3;
-  RequestState request3(Name("/ndn/site2"), requestId2, RequestType::NEW,
-                        Status::BEFORE_CHALLENGE, cert2, std::move(aesKey3));
+  RequestId requestId2 = {{102}};
+  RequestState request3;
+  request3.caPrefix = Name("/ndn/site2");
+  request3.requestId = requestId2;
+  request3.requestType = RequestType::NEW;
+  request3.cert = cert2;
   storage.addRequest(request3);
 
   // list operation
@@ -88,20 +98,23 @@
 
 BOOST_AUTO_TEST_CASE(DuplicateAdd)
 {
-    CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_DuplicateAdd.db");
+  CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_DuplicateAdd.db");
 
-    auto identity1 = addIdentity(Name("/ndn/site1"));
-    auto key1 = identity1.getDefaultKey();
-    auto cert1 = key1.getDefaultCertificate();
+  auto identity1 = addIdentity(Name("/ndn/site1"));
+  auto key1 = identity1.getDefaultKey();
+  auto cert1 = key1.getDefaultCertificate();
 
-    // add operation
-    RequestId requestId = {{1,2,3,4,5,6,7,8}};
-    std::array<uint8_t, 16> aesKey;
-    RequestState request1(Name("/ndn/site1"),requestId, RequestType::NEW,
-                          Status::BEFORE_CHALLENGE, cert1, std::move(aesKey));
-    BOOST_CHECK_NO_THROW(storage.addRequest(request1));
-    // add again
-    BOOST_CHECK_THROW(storage.addRequest(request1), std::runtime_error);
+  // add operation
+  RequestId requestId = {{101}};
+  RequestState request1;
+  request1.caPrefix = Name("/ndn/site1");
+  request1.requestId = requestId;
+  request1.requestType = RequestType::NEW;
+  request1.cert = cert1;
+  BOOST_CHECK_NO_THROW(storage.addRequest(request1));
+
+  // add again
+  BOOST_CHECK_THROW(storage.addRequest(request1), std::runtime_error);
 }
 
 BOOST_AUTO_TEST_SUITE_END() // TestCaModule
diff --git a/tests/unit-tests/challenge-credential.t.cpp b/tests/unit-tests/challenge-credential.t.cpp
index 03cf023..31f6b33 100644
--- a/tests/unit-tests/challenge-credential.t.cpp
+++ b/tests/unit-tests/challenge-credential.t.cpp
@@ -53,10 +53,12 @@
   auto identityA = addIdentity(Name("/example"));
   auto keyA = identityA.getDefaultKey();
   auto certA = key.getDefaultCertificate();
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState state(Name("/example"), requestId, RequestType::NEW,
-                         Status::BEFORE_CHALLENGE, certA, std::move(aesKey));
+  RequestId requestId = {{101}};
+  ca::RequestState state;
+  state.caPrefix = Name("/example");
+  state.requestId = requestId;
+  state.requestType = RequestType::NEW;
+  state.cert = certA;
 
   // 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 429e532..8ee9be9 100644
--- a/tests/unit-tests/challenge-email.t.cpp
+++ b/tests/unit-tests/challenge-email.t.cpp
@@ -45,9 +45,12 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::BEFORE_CHALLENGE, cert, std::move(aesKey));
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.cert = cert;
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengeEmail::PARAMETER_KEY_EMAIL));
@@ -96,9 +99,12 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::BEFORE_CHALLENGE, cert, std::move(aesKey));
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.cert = cert;
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengeEmail::PARAMETER_KEY_EMAIL));
@@ -117,13 +123,18 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  JsonSection json;
-  json.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert,
-                           "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
-                           3, time::seconds(3600), std::move(json), std::move(aesKey), 0);
+  JsonSection secret;
+  secret.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.status = Status::CHALLENGE;
+  request.cert = cert;
+  request.challengeType = "email";
+  request.challengeState = ca::ChallengeState(ChallengeEmail::NEED_CODE, time::system_clock::now(),
+                                              3, time::seconds(3600), std::move(secret));
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengeEmail::PARAMETER_KEY_CODE));
@@ -141,13 +152,18 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  JsonSection json;
-  json.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert,
-                           "email", ChallengeEmail::NEED_CODE, time::system_clock::now(),
-                           3, time::seconds(3600), std::move(json), std::move(aesKey), 0);
+  JsonSection secret;
+  secret.put(ChallengeEmail::PARAMETER_KEY_CODE, "4567");
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.status = Status::CHALLENGE;
+  request.cert = cert;
+  request.challengeType = "email";
+  request.challengeState = ca::ChallengeState(ChallengeEmail::NEED_CODE, time::system_clock::now(),
+                                              3, time::seconds(3600), std::move(secret));
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengeEmail::PARAMETER_KEY_CODE));
diff --git a/tests/unit-tests/challenge-pin.t.cpp b/tests/unit-tests/challenge-pin.t.cpp
index f3b10d8..61167d0 100644
--- a/tests/unit-tests/challenge-pin.t.cpp
+++ b/tests/unit-tests/challenge-pin.t.cpp
@@ -38,9 +38,12 @@
   auto identity = addIdentity(Name("/ndn/site1"));
   auto key = identity.getDefaultKey();
   auto cert = key.getDefaultCertificate();
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::BEFORE_CHALLENGE, cert, std::move(aesKey));
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.cert = cert;
 
   ChallengePin challenge;
   challenge.handleChallengeRequest(makeEmptyBlock(tlv::EncryptedPayload), request);
@@ -57,11 +60,16 @@
   auto cert = key.getDefaultCertificate();
   JsonSection secret;
   secret.add(ChallengePin::PARAMETER_KEY_CODE, "12345");
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert,
-                           "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
-                           3, time::seconds(3600), std::move(secret), std::move(aesKey), 0);
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.status = Status::CHALLENGE;
+  request.cert = cert;
+  request.challengeType = "pin";
+  request.challengeState = ca::ChallengeState(ChallengePin::NEED_CODE, time::system_clock::now(),
+                                              3, time::seconds(3600), std::move(secret));
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengePin::PARAMETER_KEY_CODE));
@@ -81,11 +89,16 @@
   auto cert = key.getDefaultCertificate();
   JsonSection secret;
   secret.add(ChallengePin::PARAMETER_KEY_CODE, "12345");
-  RequestId requestId = {{1,2,3,4,5,6,7,8}};
-  std::array<uint8_t, 16> aesKey;
-  ca::RequestState request(Name("/ndn/site1"), requestId, RequestType::NEW, Status::CHALLENGE, cert,
-                           "pin", ChallengePin::NEED_CODE, time::system_clock::now(),
-                           3, time::seconds(3600), std::move(secret), std::move(aesKey), 0);
+  RequestId requestId = {{101}};
+  ca::RequestState request;
+  request.caPrefix = Name("/ndn/site1");
+  request.requestId = requestId;
+  request.requestType = RequestType::NEW;
+  request.status = Status::CHALLENGE;
+  request.cert = cert;
+  request.challengeType = "pin";
+  request.challengeState = ca::ChallengeState(ChallengePin::NEED_CODE, time::system_clock::now(),
+                                              3, time::seconds(3600), std::move(secret));
 
   Block paramTLV = makeEmptyBlock(tlv::EncryptedPayload);
   paramTLV.push_back(makeStringBlock(tlv::ParameterKey, ChallengePin::PARAMETER_KEY_CODE));
diff --git a/tests/unit-tests/protocol-encoders.t.cpp b/tests/unit-tests/protocol-encoders.t.cpp
index c69131b..5147ef9 100644
--- a/tests/unit-tests/protocol-encoders.t.cpp
+++ b/tests/unit-tests/protocol-encoders.t.cpp
@@ -147,11 +147,17 @@
   caCache.load("tests/unit-tests/config-files/config-client-1");
   security::Certificate certRequest = *caCache.getKnownProfiles().front().m_cert;
   RequestId id = {{102}};
-  std::array<uint8_t, 16> aesKey;
-  std::memcpy(aesKey.data(), key, sizeof(key));
-  ca::RequestState state(Name("/ndn/ucla"), id, RequestType::NEW, Status::PENDING,
-                         certRequest, "pin", "test", time::system_clock::now(), 3, time::seconds(321), JsonSection(),
-                         std::move(aesKey), 0);
+  ca::RequestState state;
+  state.caPrefix = Name("/ndn/ucla");
+  state.requestId = id;
+  state.requestType = RequestType::NEW;
+  state.status = Status::PENDING;
+  state.cert = certRequest;
+  std::memcpy(state.encryptionKey.data(), key, sizeof(key));
+  state.challengeType = "pin";
+  state.challengeState = ca::ChallengeState("test", time::system_clock::now(),
+                                            3, time::seconds(3600), JsonSection());
+
   auto contentBlock = challengetlv::encodeDataContent(state, Name("/ndn/ucla/a/b/c"));
 
   requester::RequestState context(m_keyChain, caCache.getKnownProfiles().front(), RequestType::NEW);
