diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index b6233e9..f12011e 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -31,6 +31,7 @@
 namespace ndncert {
 
 static const int IS_SUBNAME_MIN_OFFSET = 5;
+static const time::seconds DEFAULT_DATA_FRESHNESS_PERIOD = 1_s;
 
 _LOG_INIT(ndncert.ca);
 
@@ -131,7 +132,6 @@
       _LOG_ERROR("Empty JSON obtained from the Interest parameter.");
       return;
     }
-
     //std::string probeInfoStr = parameterJson.get(JSON_CLIENT_PROBE_INFO, "");
     if (m_config.m_probeHandler) {
       try {
@@ -155,6 +155,7 @@
   Data result;
   result.setName(request.getName());
   result.setContent(dataContentFromJson(contentJson));
+  result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
   m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
   m_face.put(result);
   _LOG_TRACE("Handle PROBE: send out the PROBE response");
@@ -264,6 +265,7 @@
 
   Data result;
   result.setName(request.getName());
+  result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
   result.setContent(dataContentFromJson(genNewResponseJson(myEcdhPubKeyBase64,
                                                            std::to_string(saltInt),
                                                            certRequest,
@@ -294,10 +296,20 @@
   auto paramJsonPayload = parseEncBlock(m_ecdh.context->sharedSecret,
                                         m_ecdh.context->sharedSecretLen,
                                         request.getApplicationParameters());
+  if (paramJsonPayload.size() == 0) {
+    _LOG_ERROR("Got an empty buffer from content decryption.");
+    return;
+  }
   std::string paramJsonStr((const char*)paramJsonPayload.data(), paramJsonPayload.size());
   std::istringstream ss(paramJsonStr);
   JsonSection paramJson;
-  boost::property_tree::json_parser::read_json(ss, paramJson);
+  try {
+    boost::property_tree::json_parser::read_json(ss, paramJson);
+  }
+  catch (const std::exception& e) {
+    _LOG_ERROR("Cannot read JSON from decrypted content " << e.what());
+    return;
+  }
 
   // load the corresponding challenge module
   std::string challengeType = paramJson.get<std::string>(JSON_CLIENT_SELECTED_CHALLENGE);
@@ -355,6 +367,7 @@
 
   Data result;
   result.setName(request.getName());
+  result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
 
   // encrypt the content
   std::stringstream ss2;
@@ -386,6 +399,7 @@
   }
   Data result;
   result.setName(request.getName());
+  result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
   result.setContent(signedCert.wireEncode());
   m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
   m_face.put(result);
@@ -435,10 +449,16 @@
 CertificateRequest
 CaModule::getCertificateRequest(const Interest& request)
 {
-  std::string requestId = readString(request.getName().at(m_config.m_caName.size() + 2));
-  _LOG_TRACE("Request Id to query the database " << requestId);
+  std::string requestId = "";
   CertificateRequest certRequest;
   try {
+    requestId = readString(request.getName().at(m_config.m_caName.size() + 2));
+    _LOG_TRACE("Request Id to query the database " << requestId);
+  }
+  catch (const std::exception& e) {
+    _LOG_ERROR(e.what());
+  }
+  try {
     certRequest = m_storage->getRequest(requestId);
   }
   catch (const std::exception& e) {
@@ -508,8 +528,8 @@
 
   // ca-info
   const auto& pib = m_keyChain.getPib();
-  auto identity = pib.getIdentity(m_config.m_caName);
-  auto cert = identity.getDefaultKey().getDefaultCertificate();
+  const auto& identity = pib.getIdentity(m_config.m_caName);
+  const auto& cert = identity.getDefaultKey().getDefaultCertificate();
   std::string caInfo = "";
   if (m_config.m_caInfo == "") {
     caInfo = "Issued by " + cert.getSignature().getKeyLocator().getName().toUri();
@@ -526,7 +546,6 @@
   std::stringstream ss;
   io::save(cert, ss);
   root.put("certificate", ss.str());
-
   return root;
 }
 
@@ -583,15 +602,15 @@
   std::string jsonString;
   try {
     jsonString = encoding::readString(block);
+    std::istringstream ss(jsonString);
+    JsonSection json;
+    boost::property_tree::json_parser::read_json(ss, json);
+    return json;
   }
   catch (const std::exception& e) {
-    _LOG_ERROR("Cannot read JSON string from TLV Value" << e.what());
+    _LOG_ERROR("Cannot read JSON string from TLV Value " << e.what());
     return JsonSection();
   }
-  std::istringstream ss(jsonString);
-  JsonSection json;
-  boost::property_tree::json_parser::read_json(ss, json);
-  return json;
 }
 
 } // namespace ndncert
diff --git a/src/challenge-module/challenge-email.cpp b/src/challenge-module/challenge-email.cpp
index 793eed7..e475b24 100644
--- a/src/challenge-module/challenge-email.cpp
+++ b/src/challenge-module/challenge-email.cpp
@@ -65,6 +65,10 @@
       const auto& expectedEmail = json.get("email", "");
       Name expectedPrefix(json.get(JSON_CA_NAME, ""));
       if (expectedEmail != emailAddress || !expectedPrefix.isPrefixOf(request.m_cert.getName())) {
+        _LOG_ERROR("Cannot match with the PROBE token. Input email: " << emailAddress
+                   << " Email in Token: " << expectedEmail
+                   << " Requested Cert Name: " << request.m_cert.getName()
+                   << " Identity Name got from Token: " << expectedPrefix);
         return;
       }
     }
