diff --git a/src/ca-config.hpp b/src/ca-config.hpp
index 5cba37f..4855aca 100644
--- a/src/ca-config.hpp
+++ b/src/ca-config.hpp
@@ -32,13 +32,13 @@
 /**
  * @brief The name assignment function provided by the CA operator to generate available
  * namecomponents.
- * The function does not guarantee that all the returned names are available. Therefore the 
+ * The function does not guarantee that all the returned names are available. Therefore the
  * CA should further check the availability of each returned name and remove unavailable results.
  *
  * @p vector, input, a list of parameter key-value pair used for name assignment.
  * @return a vector containing the possible namespaces derived from the parameters.
  */
-using ProbeHandler = function<std::string /*identity name*/ (const Block& tlv /*requester input*/)>;
+// using ProbeHandler = function<std::string /*identity name*/ (const Block& tlv /*requester input*/)>;
 using NameAssignmentFunc = function<std::vector<std::string>(const std::vector<std::tuple<std::string, std::string>>)>;
 
 /**
@@ -99,10 +99,10 @@
   /**
    * Set the NameAssignmentFunction.
    */
-  void
-  setNameAssignmentFunc(const NameAssignmentFunc& nameAssignmentFunc) {
-    m_nameAssignmentFunc = nameAssignmentFunc;
-  }
+  // void
+  // setNameAssignmentFunc(const NameAssignmentFunc& nameAssignmentFunc) {
+  //   m_nameAssignmentFunc = nameAssignmentFunc;
+  // }
 
   /**
    * Set the StatusUpdateCallback.
@@ -152,21 +152,6 @@
    * StatusUpdate Callback function
    */
   StatusUpdateCallback m_statusUpdateCallback;
-
-  //====================old
-
-  // basic info
-  Name m_caName;
-
-  // essential config
-  time::seconds m_freshnessPeriod;
-  time::days m_validityPeriod;
-
-  // optional parameters
-  std::string m_probe;
-
-  // callbacks
-  ProbeHandler m_probeHandler;
 };
 
 }  // namespace ndncert
diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 9e9bf61..47ab755 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -111,11 +111,10 @@
   m_registeredPrefixHandles.push_back(prefixId);
 }
 
-bool
-CaModule::setProbeHandler(const ProbeHandler& handler)
+void
+CaModule::setNameAssignmentFunction(const NameAssignmentFunc& handler)
 {
-  m_config.m_probeHandler = handler;
-  return false;
+  m_config.m_nameAssignmentFunc = handler;
 }
 
 bool
@@ -187,40 +186,40 @@
   _LOG_TRACE("Received PROBE request");
 
   // process PROBE requests: find an available name
-  std::string availableId;
+  std::string availableId = "";
   const auto& parameterTLV = request.getApplicationParameters();
   parameterTLV.parse();
   if (!parameterTLV.hasValue()) {
     _LOG_ERROR("Empty TLV obtained from the Interest parameter.");
     return;
   }
-  //std::string probeInfoStr = parameterJson.get(JSON_CLIENT_PROBE_INFO, "");
-  if (m_config.m_probeHandler) {
-    try {
-      availableId = m_config.m_probeHandler(parameterTLV);
-    }
-    catch (const std::exception& e) {
-      _LOG_TRACE("Cannot find PROBE input from PROBE parameters: " << e.what());
-      return;
-    }
-  }
-  else {
-    // if there is no app-specified name lookup, use a random name id
-    availableId = std::to_string(random::generateSecureWord64());
-  }
-  Name newIdentityName = m_config.m_caPrefix;
-  newIdentityName.append(availableId);
-  _LOG_TRACE("Handle PROBE: generate an identity " << newIdentityName);
 
-  Block contentTLV = PROBE::encodeDataContent(newIdentityName.toUri(), m_config.m_probe, parameterTLV);
+  // if (m_config.m_nameAssignmentFunc) {
+  //   try {
+  //     availableId = m_config.m_nameAssignmentFunc(parameterTLV);
+  //   }
+  //   catch (const std::exception& e) {
+  //     _LOG_TRACE("Cannot find PROBE input from PROBE parameters: " << e.what());
+  //     return;
+  //   }
+  // }
+  // else {
+  //   // if there is no app-specified name lookup, use a random name id
+  //   availableId = std::to_string(random::generateSecureWord64());
+  // }
+  // Name newIdentityName = m_config.m_caPrefix;
+  // newIdentityName.append(availableId);
+  // _LOG_TRACE("Handle PROBE: generate an identity " << newIdentityName);
 
-  Data result;
-  result.setName(request.getName());
-  result.setContent(contentTLV);
-  result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
-  m_face.put(result);
-  _LOG_TRACE("Handle PROBE: send out the PROBE response");
+  // Block contentTLV = PROBE::encodeDataContent(newIdentityName.toUri(), m_config.m_probe, parameterTLV);
+
+  // Data result;
+  // result.setName(request.getName());
+  // result.setContent(contentTLV);
+  // result.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
+  // m_keyChain.sign(result, signingByIdentity(m_config.m_caPrefix));
+  // m_face.put(result);
+  // _LOG_TRACE("Handle PROBE: send out the PROBE response");
 }
 
 void
@@ -302,7 +301,7 @@
     // verify the self-signed certificate, the request, and the token
     if (!m_config.m_caPrefix.isPrefixOf(clientCert->getName()) // under ca prefix
         || !security::v2::Certificate::isValidName(clientCert->getName()) // is valid cert name
-        || clientCert->getName().size() < m_config.m_caName.size() + IS_SUBNAME_MIN_OFFSET) {
+        || clientCert->getName().size() < m_config.m_caPrefix.size() + IS_SUBNAME_MIN_OFFSET) {
       _LOG_ERROR("Invalid self-signed certificate name " << clientCert->getName());
       return;
     }
@@ -329,13 +328,13 @@
     }
 
     // verify the certificate
-    if (!m_config.m_caName.isPrefixOf(clientCert->getName()) // under ca prefix
+    if (!m_config.m_caPrefix.isPrefixOf(clientCert->getName()) // under ca prefix
         || !security::v2::Certificate::isValidName(clientCert->getName()) // is valid cert name
-        || clientCert->getName().size() < m_config.m_caName.size() + IS_SUBNAME_MIN_OFFSET) {
+        || clientCert->getName().size() < m_config.m_caPrefix.size() + IS_SUBNAME_MIN_OFFSET) {
       _LOG_ERROR("Invalid certificate name " << clientCert->getName());
       return;
     }
-    const auto& cert = m_keyChain.getPib().getIdentity(m_config.m_caName).getDefaultKey().getDefaultCertificate();
+    const auto& cert = m_keyChain.getPib().getIdentity(m_config.m_caPrefix).getDefaultKey().getDefaultCertificate();
     if (!security::verifySignature(*clientCert, cert)) {
       _LOG_ERROR("Cert request with bad signature.");
       return;
diff --git a/src/ca-module.hpp b/src/ca-module.hpp
index 1e17e2b..b370132 100644
--- a/src/ca-module.hpp
+++ b/src/ca-module.hpp
@@ -58,8 +58,8 @@
     return m_storage;
   }
 
-  bool
-  setProbeHandler(const ProbeHandler& handler);
+  void
+  setNameAssignmentFunction(const NameAssignmentFunc& handler);
 
   bool
   setStatusUpdateCallback(const StatusUpdateCallback& onUpdateCallback);
