diff --git a/src/ca-config.hpp b/src/ca-config.hpp
index 4ff3fe1..5cba37f 100644
--- a/src/ca-config.hpp
+++ b/src/ca-config.hpp
@@ -25,10 +25,6 @@
 
 #include "certificate-request.hpp"
 #include "client-config.hpp"
-<<<<<<< HEAD
-#include <ndn-cxx/security/certificate.hpp>
-=======
->>>>>>> Update CaConfig and ClientCaItem. Add INFO packet encoding and decoding.
 
 namespace ndn {
 namespace ndncert {
diff --git a/src/ca-detail/ca-memory.cpp b/src/ca-detail/ca-memory.cpp
index 67fd57b..437afa4 100644
--- a/src/ca-detail/ca-memory.cpp
+++ b/src/ca-detail/ca-memory.cpp
@@ -20,7 +20,7 @@
 
 #include "ca-memory.hpp"
 
-#include <ndn-cxx/security/validation-policy.hpp>
+#include <ndn-cxx/security/v2/validation-policy.hpp>
 
 namespace ndn {
 namespace ndncert {
@@ -105,7 +105,7 @@
 }
 
 // certificate related
-security::Certificate
+security::v2::Certificate
 CaMemory::getCertificate(const std::string& certId)
 {
   auto search = m_issuedCerts.find(certId);
@@ -116,7 +116,7 @@
 }
 
 void
-CaMemory::addCertificate(const std::string& certId, const security::Certificate& cert)
+CaMemory::addCertificate(const std::string& certId, const security::v2::Certificate& cert)
 {
   auto search = m_issuedCerts.find(certId);
   if (search == m_issuedCerts.end()) {
@@ -128,7 +128,7 @@
 }
 
 void
-CaMemory::updateCertificate(const std::string& certId, const security::Certificate& cert)
+CaMemory::updateCertificate(const std::string& certId, const security::v2::Certificate& cert)
 {
   m_issuedCerts[certId] = cert;
 }
@@ -142,23 +142,23 @@
   }
 }
 
-std::list<security::Certificate>
+std::list<security::v2::Certificate>
 CaMemory::listAllIssuedCertificates()
 {
-  std::list<security::Certificate> result;
+  std::list<security::v2::Certificate> result;
   for (const auto& entry : m_issuedCerts) {
     result.push_back(entry.second);
   }
   return result;
 }
 
-std::list<security::Certificate>
+std::list<security::v2::Certificate>
 CaMemory::listAllIssuedCertificates(const Name& caName)
 {
-  std::list<security::Certificate> result;
+  std::list<security::v2::Certificate> result;
   for (const auto& entry : m_issuedCerts) {
-    const auto& klName = entry.second.getSignatureInfo().getKeyLocator().getName();
-    if (security::extractIdentityNameFromKeyLocator(klName) == caName) {
+    const auto& klName = entry.second.getSignature().getKeyLocator().getName();
+    if (security::v2::extractIdentityFromKeyName(klName) == caName) {
       result.push_back(entry.second);
     }
   }
diff --git a/src/ca-detail/ca-memory.hpp b/src/ca-detail/ca-memory.hpp
index fb61218..859c726 100644
--- a/src/ca-detail/ca-memory.hpp
+++ b/src/ca-detail/ca-memory.hpp
@@ -52,27 +52,27 @@
   listAllRequests(const Name& caName) override;
 
   // certificate related
-  security::Certificate
+  security::v2::Certificate
   getCertificate(const std::string& certId) override;
 
   void
-  addCertificate(const std::string& certId, const security::Certificate& cert) override;
+  addCertificate(const std::string& certId, const security::v2::Certificate& cert) override;
 
   void
-  updateCertificate(const std::string& certId, const security::Certificate& cert) override;
+  updateCertificate(const std::string& certId, const security::v2::Certificate& cert) override;
 
   void
   deleteCertificate(const std::string& certId) override;
 
-  std::list<security::Certificate>
+  std::list<security::v2::Certificate>
   listAllIssuedCertificates() override;
 
-  std::list<security::Certificate>
+  std::list<security::v2::Certificate>
   listAllIssuedCertificates(const Name& caName) override;
 
 private:
   std::map<std::string, CertificateRequest> m_requests;
-  std::map<std::string, security::Certificate> m_issuedCerts;
+  std::map<std::string, security::v2::Certificate> m_issuedCerts;
 };
 
 } // namespace ndncert
diff --git a/src/ca-detail/ca-sqlite.cpp b/src/ca-detail/ca-sqlite.cpp
index dec5146..baaf771 100644
--- a/src/ca-detail/ca-sqlite.cpp
+++ b/src/ca-detail/ca-sqlite.cpp
@@ -20,7 +20,7 @@
 
 #include "ca-sqlite.hpp"
 
-#include <ndn-cxx/security/validation-policy.hpp>
+#include <ndn-cxx/security/v2/validation-policy.hpp>
 #include <ndn-cxx/util/sqlite3-statement.hpp>
 
 #include <sqlite3.h>
@@ -125,7 +125,7 @@
     Name caName(statement.getBlock(2));
     int status = statement.getInt(3);
     std::string challengeStatus = statement.getString(4);
-    security::Certificate cert(statement.getBlock(6));
+    security::v2::Certificate cert(statement.getBlock(6));
     std::string challengeType = statement.getString(7);
     std::string challengeSecrets = statement.getString(8);
     std::string challengeTp = statement.getString(9);
@@ -250,7 +250,7 @@
     Name caName(statement.getBlock(2));
     int status = statement.getInt(3);
     std::string challengeStatus = statement.getString(4);
-    security::Certificate cert(statement.getBlock(6));
+    security::v2::Certificate cert(statement.getBlock(6));
     std::string challengeType = statement.getString(7);
     std::string challengeSecrets = statement.getString(8);
     std::string challengeTp = statement.getString(9);
@@ -277,7 +277,7 @@
     Name caName(statement.getBlock(2));
     int status = statement.getInt(3);
     std::string challengeStatus = statement.getString(4);
-    security::Certificate cert(statement.getBlock(6));
+    security::v2::Certificate cert(statement.getBlock(6));
     std::string challengeType = statement.getString(7);
     std::string challengeSecrets = statement.getString(8);
     std::string challengeTp = statement.getString(9);
@@ -300,7 +300,7 @@
   statement.step();
 }
 
-security::Certificate
+security::v2::Certificate
 CaSqlite::getCertificate(const std::string& certId)
 {
   Sqlite3Statement statement(m_database,
@@ -308,7 +308,7 @@
   statement.bind(1, certId, SQLITE_TRANSIENT);
 
   if (statement.step() == SQLITE_ROW) {
-    return security::Certificate(statement.getBlock(0));
+    return security::v2::Certificate(statement.getBlock(0));
   }
   else {
     BOOST_THROW_EXCEPTION(Error("Certificate with ID " + certId + " cannot be fetched from database"));
@@ -316,7 +316,7 @@
 }
 
 void
-CaSqlite::addCertificate(const std::string& certId, const security::Certificate& cert)
+CaSqlite::addCertificate(const std::string& certId, const security::v2::Certificate& cert)
 {
   Sqlite3Statement statement(m_database,
                              R"_SQLTEXT_(INSERT INTO IssuedCerts (cert_id, cert_key_name, cert)
@@ -331,7 +331,7 @@
 }
 
 void
-CaSqlite::updateCertificate(const std::string& certId, const security::Certificate& cert)
+CaSqlite::updateCertificate(const std::string& certId, const security::v2::Certificate& cert)
 {
   Sqlite3Statement statement(m_database,
                              R"_SQLTEXT_(UPDATE IssuedCerts SET cert = ? WHERE cert_id = ?)_SQLTEXT_");
@@ -352,10 +352,10 @@
   statement.step();
 }
 
-std::list<security::Certificate>
+std::list<security::v2::Certificate>
 CaSqlite::listAllIssuedCertificates()
 {
-  std::list<security::Certificate> result;
+  std::list<security::v2::Certificate> result;
   Sqlite3Statement statement(m_database, R"_SQLTEXT_(SELECT * FROM IssuedCerts)_SQLTEXT_");
 
   while (statement.step() == SQLITE_ROW) {
@@ -364,14 +364,14 @@
   return result;
 }
 
-std::list<security::Certificate>
+std::list<security::v2::Certificate>
 CaSqlite::listAllIssuedCertificates(const Name& caName)
 {
   auto allCerts = listAllIssuedCertificates();
-  std::list<security::Certificate> result;
+  std::list<security::v2::Certificate> result;
   for (const auto& entry : allCerts) {
-    const auto& klName = entry.getSignatureInfo().getKeyLocator().getName();
-    if (security::extractIdentityNameFromKeyLocator(klName) == caName) {
+    const auto& klName = entry.getSignature().getKeyLocator().getName();
+    if (security::v2::extractIdentityFromKeyName(klName) == caName) {
       result.push_back(entry);
     }
   }
diff --git a/src/ca-detail/ca-sqlite.hpp b/src/ca-detail/ca-sqlite.hpp
index 9b09e1a..f0039f8 100644
--- a/src/ca-detail/ca-sqlite.hpp
+++ b/src/ca-detail/ca-sqlite.hpp
@@ -60,22 +60,22 @@
   listAllRequests(const Name& caName) override;
 
   // certificate related
-  security::Certificate
+  security::v2::Certificate
   getCertificate(const std::string& certId) override;
 
   void
-  addCertificate(const std::string& certId, const security::Certificate& cert) override;
+  addCertificate(const std::string& certId, const security::v2::Certificate& cert) override;
 
   void
-  updateCertificate(const std::string& certId, const security::Certificate& cert) override;
+  updateCertificate(const std::string& certId, const security::v2::Certificate& cert) override;
 
   void
   deleteCertificate(const std::string& certId) override;
 
-  std::list<security::Certificate>
+  std::list<security::v2::Certificate>
   listAllIssuedCertificates() override;
 
-  std::list<security::Certificate>
+  std::list<security::v2::Certificate>
   listAllIssuedCertificates(const Name& caName) override;
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 9f95157..377486f 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -477,123 +477,6 @@
   return certRequest;
 }
 
-<<<<<<< HEAD
-/**
- * @brief Generate JSON file to response PROBE insterest
- *
- * PROBE response JSON format:
- * {
- *   "name": "@p identifier"
- * }
- */
-JsonSection
-CaModule::genProbeResponseJson(const Name& identifier, const std::string& m_probe, const JsonSection& parameterJson)
-{
-  std::vector<std::string> fields;
-  std::string delimiter = ":";
-  size_t last = 0;
-  size_t next = 0;
-  while ((next = m_probe.find(delimiter, last)) != std::string::npos) {
-    fields.push_back(m_probe.substr(last, next - last));
-    last = next + 1;
-  }
-  fields.push_back(m_probe.substr(last));
-  JsonSection root;
-
-  for (size_t i = 0; i < fields.size(); ++i) {
-    root.put(fields.at(i), parameterJson.get(fields.at(i), ""));
-  }
-
-  root.put(JSON_CA_NAME, identifier.toUri());
-  return root;
-}
-
-/**
- * @brief Generate JSON file to response NEW interest
- *
- * Target JSON format:
- * {
- *   "ecdh-pub": "@p echdPub",
- *   "salt": "@p salt"
- *   "request-id": "@p requestId",
- *   "status": "@p status",
- *   "challenges": [
- *     {
- *       "challenge-id": ""
- *     },
- *     {
- *       "challenge-id": ""
- *     },
- *     ...
- *   ]
- * }
- */
-JsonSection
-CaModule::genInfoResponseJson()
-{
-  JsonSection root;
-  // ca-prefix
-  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_caPrefix);
-  const auto& cert = identity.getDefaultKey().getDefaultCertificate();
-  std::string caInfo;
-  if (m_config.m_caInfo.empty()) {
-    caInfo = "Issued by " + cert.getSignatureInfo().getKeyLocator().getName().toUri();
-  }
-  else {
-    caInfo = m_config.m_caInfo;
-  }
-  root.put("ca-info", caInfo);
-
-  // probe
-  root.put("probe", m_config.m_probe);
-
-  // certificate
-  std::stringstream ss;
-  io::save(cert, ss);
-  root.put("certificate", ss.str());
-  return root;
-}
-
-JsonSection
-CaModule::genNewResponseJson(const std::string& ecdhKey, const std::string& salt,
-                             const CertificateRequest& request,
-                             const std::list<std::string>& challenges)
-{
-  JsonSection root;
-  JsonSection challengesSection;
-  root.put(JSON_CA_ECDH, ecdhKey);
-  root.put(JSON_CA_SALT, salt);
-  root.put(JSON_CA_REQUEST_ID, request.m_requestId);
-  root.put(JSON_CA_STATUS, std::to_string(request.m_status));
-
-  for (const auto& entry : challenges) {
-    JsonSection challenge;
-    challenge.put(JSON_CA_CHALLENGE_ID, entry);
-    challengesSection.push_back(std::make_pair("", challenge));
-  }
-  root.add_child(JSON_CA_CHALLENGES, challengesSection);
-  return root;
-}
-
-JsonSection
-CaModule::genChallengeResponseJson(const CertificateRequest& request)
-{
-  JsonSection root;
-  JsonSection challengesSection;
-  root.put(JSON_CA_STATUS, request.m_status);
-  root.put(JSON_CHALLENGE_STATUS, request.m_challengeStatus);
-  root.put(JSON_CHALLENGE_REMAINING_TRIES, std::to_string(request.m_remainingTries));
-  root.put(JSON_CHALLENGE_REMAINING_TIME, std::to_string(request.m_remainingTime));
-  return root;
-}
-
-=======
->>>>>>> add two functions for CA Info Packet and Metadata Packet
 void
 CaModule::onRegisterFailed(const std::string& reason)
 {
diff --git a/src/certificate-request.hpp b/src/certificate-request.hpp
index 216c21f..3ac9948 100644
--- a/src/certificate-request.hpp
+++ b/src/certificate-request.hpp
@@ -22,14 +22,10 @@
 #define NDNCERT_CERTIFICATE_REQUEST_HPP
 
 #include "ndncert-common.hpp"
-<<<<<<< HEAD
-#include <ndn-cxx/security/certificate.hpp>
-=======
 #include <ndn-cxx/security/v2/certificate.hpp>
 #include <boost/property_tree/info_parser.hpp>
 #include <boost/property_tree/json_parser.hpp>
 #include <boost/property_tree/ptree.hpp>
->>>>>>> Update CaConfig and ClientCaItem. Add INFO packet encoding and decoding.
 
 namespace ndn {
 namespace ndncert {
diff --git a/src/challenge-module/challenge-credential.cpp b/src/challenge-module/challenge-credential.cpp
index 16724bc..bdc8b37 100644
--- a/src/challenge-module/challenge-credential.cpp
+++ b/src/challenge-module/challenge-credential.cpp
@@ -112,7 +112,7 @@
   ss2.clear();
 
   // verify the credential and the self-signed cert
-  Name signingKeyName = cert->getSignatureInfo().getKeyLocator().getName();
+  Name signingKeyName = cert->getSignature().getKeyLocator().getName();
   for (auto anchor : m_trustAnchors) {
     if (anchor.getKeyName() == signingKeyName) {
       if (security::verifySignature(*cert, anchor) && security::verifySignature(*self, *cert)
diff --git a/src/client-config.hpp b/src/client-config.hpp
index 0195c48..80d5241 100644
--- a/src/client-config.hpp
+++ b/src/client-config.hpp
@@ -22,12 +22,7 @@
 #define NDNCERT_CLIENT_CONFIG_HPP
 
 #include "certificate-request.hpp"
-<<<<<<< HEAD
-#include <ndn-cxx/security/certificate.hpp>
-=======
-
 #include <ndn-cxx/security/v2/certificate.hpp>
->>>>>>> Update CaConfig and ClientCaItem. Add INFO packet encoding and decoding.
 
 namespace ndn {
 namespace ndncert {
diff --git a/src/client-module.cpp b/src/client-module.cpp
index 069d796..697ff8f 100644
--- a/src/client-module.cpp
+++ b/src/client-module.cpp
@@ -320,19 +320,30 @@
   }
   catch (const std::exception& e) {
     _LOG_ERROR("Cannot add replied certificate into the keychain " << e.what());
-    return nullptr;
+    return;
   }
 }
 
-JsonSection
-ClientModule::getJsonFromData(const Data& data)
+void
+ClientModule::endSession()
 {
-  std::istringstream ss(encoding::readString(data.getContent()));
-  JsonSection json;
-  boost::property_tree::json_parser::read_json(ss, json);
-  return json;
+  if (getApplicationStatus() == STATUS_SUCCESS || getApplicationStatus() == STATUS_ENDED) {
+    return;
+  }
+  if (m_isNewlyCreatedIdentity) {
+    // put the identity into the if scope is because it may cause an error
+    // outside since when endSession is called, identity may not have been created yet.
+    auto identity = m_keyChain.getPib().getIdentity(m_identityName);
+    m_keyChain.deleteIdentity(identity);
+  }
+  else if (m_isNewlyCreatedKey) {
+    auto identity = m_keyChain.getPib().getIdentity(m_identityName);
+    m_keyChain.deleteKey(identity, m_key);
+  }
+  m_status = STATUS_ENDED;
 }
 
+
 std::vector<std::string>
 ClientModule::parseProbeComponents(const std::string& probe)
 {
@@ -348,66 +359,5 @@
   return components;
 }
 
-JsonSection
-ClientModule::genProbeRequestJson(const ClientCaItem& ca, const std::string& probeInfo)
-{
-  JsonSection root;
-  std::vector<std::string> fields = parseProbeComponents(ca.m_probe);
-  std::vector<std::string> arguments  = parseProbeComponents(probeInfo);;
-
-  if (arguments.size() != fields.size()) {
-    BOOST_THROW_EXCEPTION(Error("Error in genProbeRequestJson: argument list does not match field list in the config file."));
-  }
-  for (size_t i = 0; i < fields.size(); ++i) {
-      root.put(fields.at(i), arguments.at(i));
-  }
-  return root;
-}
-
-JsonSection
-ClientModule::genNewRequestJson(const std::string& ecdhPub, const security::v2::Certificate& certRequest,
-                                const shared_ptr<Data>& probeToken)
-{
-  JsonSection root;
-  std::stringstream ss;
-  try {
-    security::transform::bufferSource(certRequest.wireEncode().wire(), certRequest.wireEncode().size())
-    >> security::transform::base64Encode(false)
-    >> security::transform::streamSink(ss);
-  }
-  catch (const security::transform::Error& e) {
-    _LOG_ERROR("Cannot convert self-signed cert into BASE64 string " << e.what());
-    return root;
-  }
-  root.put(JSON_CLIENT_ECDH, ecdhPub);
-  root.put(JSON_CLIENT_CERT_REQ, ss.str());
-  if (probeToken != nullptr) {
-    // clear the stringstream
-    ss.str("");
-    ss.clear();
-    // transform the probe data into a base64 string
-    try {
-      security::transform::bufferSource(probeToken->wireEncode().wire(), probeToken->wireEncode().size())
-      >> security::transform::base64Encode(false)
-      >> security::transform::streamSink(ss);
-    }
-    catch (const security::transform::Error& e) {
-      _LOG_ERROR("Cannot convert self-signed cert into BASE64 string " << e.what());
-      return root;
-    }
-    // add the token into the JSON
-    root.put("probe-token", ss.str());
-  }
-  return root;
-}
-
-Block
-ClientModule::paramFromJson(const JsonSection& json)
-{
-  std::stringstream ss;
-  boost::property_tree::write_json(ss, json);
-  return makeStringBlock(ndn::tlv::ApplicationParameters, ss.str());
-}
-
 } // namespace ndncert
 } // namespace ndn
diff --git a/src/client-module.hpp b/src/client-module.hpp
index f45b034..46a0a29 100644
--- a/src/client-module.hpp
+++ b/src/client-module.hpp
@@ -111,13 +111,6 @@
   void
   onCertFetchResponse(const Data& reply);
 
-  // helper functions
-  static JsonSection
-  getJsonFromData(const Data& data);
-
-  static Block
-  paramFromJson(const JsonSection& json);
-
   static std::vector<std::string>
   parseProbeComponents(const std::string& probe);
 
@@ -125,14 +118,6 @@
   endSession();
 
 PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  JsonSection
-  genProbeRequestJson(const ClientCaItem& ca, const std::string& probeInfo);
-
-  JsonSection
-  genNewRequestJson(const std::string& ecdhPub, const security::v2::Certificate& certRequest,
-                    const shared_ptr<Data>& probeToken = nullptr);
-
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
   ClientConfig m_config;
   security::v2::KeyChain& m_keyChain;
 
diff --git a/src/crypto-support/crypto-helper.hpp b/src/crypto-support/crypto-helper.hpp
index 4381977..53f57f1 100644
--- a/src/crypto-support/crypto-helper.hpp
+++ b/src/crypto-support/crypto-helper.hpp
@@ -26,12 +26,12 @@
 
 #include "certificate-request.hpp"
 
-static const int INFO_LEN = 10;
-static const uint8_t INFO[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9};
-
 namespace ndn {
 namespace ndncert {
 
+static const int INFO_LEN = 10;
+static const uint8_t INFO[] = {0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9};
+
 struct ECDH_CTX {
   int EC_NID;
   EVP_PKEY_CTX* ctx_params;
diff --git a/src/ndncert-common.hpp b/src/ndncert-common.hpp
index ce43640..a6a7a04 100644
--- a/src/ndncert-common.hpp
+++ b/src/ndncert-common.hpp
@@ -46,7 +46,7 @@
 #include <ndn-cxx/encoding/block.hpp>
 #include <ndn-cxx/lp/nack.hpp>
 #include <ndn-cxx/security/key-chain.hpp>
-#include <ndn-cxx/security/certificate.hpp>
+#include <ndn-cxx/security/v2/certificate.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/assert.hpp>
diff --git a/tests/identity-management-fixture.cpp b/tests/identity-management-fixture.cpp
index db99d5a..1694dfa 100644
--- a/tests/identity-management-fixture.cpp
+++ b/tests/identity-management-fixture.cpp
@@ -20,7 +20,7 @@
  */
 
 #include "identity-management-fixture.hpp"
-#include <ndn-cxx/security/additional-description.hpp>
+#include <ndn-cxx/security/v2/additional-description.hpp>
 #include <ndn-cxx/util/io.hpp>
 #include <boost/filesystem.hpp>
 
@@ -92,7 +92,7 @@
 
   v2::AdditionalDescription description;
   description.set("type", "sub-certificate");
-  info.addCustomTlv(description.wireEncode());
+  info.appendTypeSpecificTlv(description.wireEncode());
 
   m_keyChain.sign(request, signingByIdentity(issuer).setSignatureInfo(info));
   m_keyChain.setDefaultCertificate(subIdentity.getDefaultKey(), request);
diff --git a/tests/unit-tests/client-module.t.cpp b/tests/unit-tests/client-module.t.cpp
index 888ad6b..7e6214b 100644
--- a/tests/unit-tests/client-module.t.cpp
+++ b/tests/unit-tests/client-module.t.cpp
@@ -65,26 +65,26 @@
                     "zhiyi@cs.ucla.edu");
 }
 
-BOOST_AUTO_TEST_CASE(GenProbeRequestJson)
-{
-  ClientModule client(m_keyChain);
-  client.getClientConf().load("tests/unit-tests/client.conf.test");
+// BOOST_AUTO_TEST_CASE(GenProbeRequestJson)
+// {
+//   ClientModule client(m_keyChain);
+//   client.getClientConf().load("tests/unit-tests/client.conf.test");
 
-  auto identity = addIdentity(Name("/site"));
-  auto key = identity.getDefaultKey();
-  auto cert = key.getDefaultCertificate();
+//   auto identity = addIdentity(Name("/site"));
+//   auto key = identity.getDefaultKey();
+//   auto cert = key.getDefaultCertificate();
 
-  ClientCaItem item;
-  item.m_probe = "email:uid:name";
-  item.m_caPrefix = Name("/site");
-  item.m_anchor = cert;
-  client.getClientConf().m_caItems.push_back(item);
+//   ClientCaItem item;
+//   item.m_probe = "email:uid:name";
+//   item.m_caPrefix = Name("/site");
+//   item.m_anchor = cert;
+//   client.getClientConf().m_caItems.push_back(item);
 
-  auto interestPacket = client.genProbeRequestJson(item, "yufeng@ucla.edu:123456789:Yufeng Zhang");
-  BOOST_CHECK_EQUAL(interestPacket.get("email", ""), "yufeng@ucla.edu");
-  BOOST_CHECK_EQUAL(interestPacket.get("uid", ""), "123456789");
-  BOOST_CHECK_EQUAL(interestPacket.get("name", ""), "Yufeng Zhang");
-}
+//   auto interestPacket = client.genProbeRequestJson(item, "yufeng@ucla.edu:123456789:Yufeng Zhang");
+//   BOOST_CHECK_EQUAL(interestPacket.get("email", ""), "yufeng@ucla.edu");
+//   BOOST_CHECK_EQUAL(interestPacket.get("uid", ""), "123456789");
+//   BOOST_CHECK_EQUAL(interestPacket.get("name", ""), "Yufeng Zhang");
+// }
 
 BOOST_AUTO_TEST_SUITE_END() // TestClientModule
 
diff --git a/tools/ndncert-client.cpp b/tools/ndncert-client.cpp
index 788ee74..f7bd7b0 100644
--- a/tools/ndncert-client.cpp
+++ b/tools/ndncert-client.cpp
@@ -20,6 +20,7 @@
 
 #include "challenge-module.hpp"
 #include "protocol-detail/info.hpp"
+#include "client-module.hpp"
 #include <iostream>
 #include <string>
 
@@ -119,7 +120,7 @@
   client.onCertFetchResponse(reply);
   std::cerr << "Step " << nStep++
             << ": DONE! Certificate has already been installed to local keychain\n"
-            << "Certificate Name: " << cert->getName().toUri() << std::endl;
+            << "Certificate Name: " << reply.getName().toUri() << std::endl;
 }
 
 static void
@@ -224,7 +225,7 @@
   auto caItem = INFO::decodeClientConfigFromContent(contentBlock);
 
   std::cerr << "Will use a new trust anchor, please double check the identity info: \n"
-            << "This trust anchor information is signed by " << reply.getSignatureInfo().getKeyLocator()
+            << "This trust anchor information is signed by " << reply.getSignature().getKeyLocator()
             << std::endl
             << "The certificate is " << caItem.m_anchor << std::endl
             << "Do you trust the information? Type in YES or NO" << std::endl;
