diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 56ab7e2..be44e11 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -22,6 +22,7 @@
 #include "challenge-module.hpp"
 #include "logging.hpp"
 #include "crypto-support/enc-tlv.hpp"
+#include "tlv.hpp"
 #include <ndn-cxx/util/io.hpp>
 #include <ndn-cxx/security/verification-helpers.hpp>
 #include <ndn-cxx/security/signing-helpers.hpp>
@@ -119,11 +120,11 @@
 CaModule::onInfo(const Interest& request)
 {
   _LOG_TRACE("Received INFO request");
-  JsonSection contentJson = genInfoResponseJson();
+  Block contentTLV = genInfoResponseTLV();
   Data result;
 
   result.setName(request.getName());
-  result.setContent(dataContentFromJson(contentJson));
+  result.setContent(contentTLV);
   result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
 
   m_keyChain.sign(result, signingByIdentity(m_config.m_caName));
@@ -551,6 +552,46 @@
   return root;
 }
 
+Block
+CaModule::genInfoResponseTLV()
+{
+  Block response;
+  // ca-prefix
+  Name caName = m_config.m_caName;
+  // response = makeStringBlock(CAPrefix, caName.toUri());
+  response = makeNestedBlock(CAPrefix, caName);
+
+  // ca-info
+  const auto& pib = m_keyChain.getPib();
+  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();
+  }
+  else {
+    caInfo = m_config.m_caInfo;
+  }
+
+  response.push_back(makeStringBlock(CAInfo, caInfo));
+
+
+  // parameter-key (Not implemented yet)
+  for() {
+    response.push_back(makeStringBlock(ParameterKey, ""));
+  }
+
+  // TODO: need to convert from days to seconds
+  response.push_back(makeNonNegativeIntegerBlock(MaxValidityPeriod, m_validityPeriod));
+
+  // certificate
+  response.push_back(makeNestedBlock(CACertificate, cert));
+  response.parse();
+
+  return response;
+}
+
+
 JsonSection
 CaModule::genNewResponseJson(const std::string& ecdhKey, const std::string& salt,
                              const CertificateRequest& request,
diff --git a/src/client-config.cpp b/src/client-config.cpp
index 589cd49..9273760 100644
--- a/src/client-config.cpp
+++ b/src/client-config.cpp
@@ -19,6 +19,7 @@
  */
 
 #include "client-config.hpp"
+#include "tlv.hpp"
 
 #include <ndn-cxx/util/io.hpp>
 #include <fstream>
@@ -83,17 +84,21 @@
 }
 
 ClientCaItem
-ClientConfig::extractCaItem(const JsonSection& configSection)
+ClientConfig::extractCaItem(const Block& contentBlock)
 {
   ClientCaItem item;
-  item.m_caName = Name(configSection.get("ca-prefix", ""));
+  item.m_caName = Name(readString(contentBlock.get(CAPrefix)));
   if (item.m_caName.empty()) {
     BOOST_THROW_EXCEPTION(Error("Cannot read ca-prefix from the config file"));
   }
-  item.m_caInfo = configSection.get("ca-info", "");
-  item.m_probe = configSection.get("probe", "");
-  std::istringstream ss(configSection.get("certificate", ""));
-  auto anchor = io::load<security::v2::Certificate>(ss);
+  item.m_caInfo = readString(contentBlock.get(CAInfo));
+  // item.m_probe = configSection.get("probe", "");
+
+  security::v2::Certificate anchor = contentBlock.get(CACertificate);
+
+  //std::istringstream ss(configSection.get("certificate", ""));
+  //auto anchor = io::load<security::v2::Certificate>(ss);
+
   if (anchor == nullptr) {
     BOOST_THROW_EXCEPTION(Error("Cannot load the certificate from config file"));
   }
diff --git a/src/client-module.cpp b/src/client-module.cpp
index bf0ce20..1789632 100644
--- a/src/client-module.cpp
+++ b/src/client-module.cpp
@@ -59,11 +59,10 @@
 }
 
 bool
-ClientModule::verifyProbeInfoResponse(const Data& reply)
+ClientModule::verifyProbeInfoResponse(const Block& contentBlock)
 {
   // parse the ca item
-  auto contentJson = getJsonFromData(reply);
-  auto caItem = ClientConfig::extractCaItem(contentJson);
+  auto caItem = ClientConfig::extractCaItem(contentBlock);
 
   // verify the probe Data's sig
   if (!security::verifySignature(reply, caItem.m_anchor)) {
@@ -76,9 +75,10 @@
 void
 ClientModule::addCaFromProbeInfoResponse(const Data& reply)
 {
+  const Block& contentBlock = reply.getContent();
+
   // parse the ca item
-  auto contentJson = getJsonFromData(reply);
-  auto caItem = ClientConfig::extractCaItem(contentJson);
+  auto caItem = ClientConfig::extractCaItem(contentBlock);
 
   // update the local config
   bool findItem = false;
diff --git a/tests/unit-tests/bench.t.cpp b/tests/unit-tests/bench.t.cpp
new file mode 100644
index 0000000..91622da
--- /dev/null
+++ b/tests/unit-tests/bench.t.cpp
@@ -0,0 +1,43 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2017-2019, Regents of the University of California.
+ *
+ * This file is part of ndncert, a certificate management system based on NDN.
+ *
+ * ndncert is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License along with
+ * ndncert, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndncert authors and contributors.
+ */
+
+#include "ca-module.hpp"
+#include "identity-management-fixture.hpp"
+
+#include <ndn-cxx/security/transform/base64-encode.hpp>
+#include <ndn-cxx/security/transform/buffer-source.hpp>
+#include <ndn-cxx/security/transform/stream-sink.hpp>
+
+namespace ndn {
+namespace ndncert {
+namespace tests {
+
+BOOST_FIXTURE_TEST_SUITE(TestForBenchmark, IdentityManagementFixture)
+
+BOOST_AUTO_TEST_CASE(ReadConfigFile)
+{
+  BOOST_CHECK(true);
+}
+
+BOOST_AUTO_TEST_SUITE_END() // TestCaConfig
+
+} // namespace tests
+} // namespace ndncert
+} // namespace ndn
