diff --git a/src/ca-module.cpp b/src/ca-module.cpp
index 3560568..43becc5 100644
--- a/src/ca-module.cpp
+++ b/src/ca-module.cpp
@@ -77,8 +77,14 @@
   auto prefixId = m_face.registerPrefix(
       prefix,
       [&](const Name& name) {
+        // register INFO RDR metadata prefix
+        name::Component metaDataComp(32, reinterpret_cast<const uint8_t*>("metadata"), std::strlen("metadata"));
+        auto filterId = m_face.setInterestFilter(Name(name).append("INFO").append(metaDataComp),
+                                                 bind(&CaModule::onCaProfileDiscovery, this, _2));
+        m_interestFilterHandles.push_back(filterId);
+
         // register PROBE prefix
-        auto filterId = m_face.setInterestFilter(Name(name).append("PROBE"),
+        filterId = m_face.setInterestFilter(Name(name).append("PROBE"),
                                                  bind(&CaModule::onProbe, this, _2));
         m_interestFilterHandles.push_back(filterId);
 
@@ -108,32 +114,12 @@
   m_config.m_statusUpdateCallback = onUpdateCallback;
 }
 
-shared_ptr<Data>
-CaModule::generateCaProfileMetaData()
+Data
+CaModule::getCaProfileData()
 {
-  // @TODO
-  // make metadata a class member variable m_infoMetadata
-  // check whether the m_infoMetadata has the latest versioned name, if not, then generate a new one
-  // otherwise, directly reply m_infoMetadata.makeData
-
-  auto infoPacket = generateCaProfileData();
-  MetadataObject metadata;
-  metadata.setVersionedName(infoPacket->getName().getPrefix(-1));
-  Name discoveryInterestName(infoPacket->getName().getPrefix(-2));
-  name::Component metadataComponent(32, reinterpret_cast<const uint8_t*>("metadata"), std::strlen("metadata"));
-  discoveryInterestName.append(metadataComponent);
-  auto metadataData = metadata.makeData(discoveryInterestName, m_keyChain, signingByIdentity(m_config.m_caItem.m_caPrefix));
-  return make_shared<Data>(metadataData);
-}
-
-shared_ptr<Data>
-CaModule::generateCaProfileData()
-{
-  // @TODO
-  // make CaInfo Data packet a class member variable m_infoData
-  // check whether the m_infoData is still valid, if not, then generate a new one
-  // otherwise, directly reply m_infoData
-
+  if (m_profileData) {
+    return *m_profileData;
+  }
   const auto& pib = m_keyChain.getPib();
   const auto& identity = pib.getIdentity(m_config.m_caItem.m_caPrefix);
   const auto& cert = identity.getDefaultKey().getDefaultCertificate();
@@ -141,11 +127,26 @@
 
   Name infoPacketName(m_config.m_caItem.m_caPrefix);
   infoPacketName.append("CA").append("INFO").appendVersion().appendSegment(0);
-  Data infoData(infoPacketName);
-  infoData.setContent(contentTLV);
-  infoData.setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
-  m_keyChain.sign(infoData, signingByIdentity(m_config.m_caItem.m_caPrefix));
-  return make_shared<Data>(infoData);
+  m_profileData = std::make_unique<Data>(infoPacketName);
+  m_profileData->setContent(contentTLV);
+  m_profileData->setFreshnessPeriod(DEFAULT_DATA_FRESHNESS_PERIOD);
+  m_keyChain.sign(*m_profileData, signingByIdentity(m_config.m_caItem.m_caPrefix));
+  return *m_profileData;
+}
+
+void
+CaModule::onCaProfileDiscovery(const Interest& request)
+{
+  _LOG_TRACE("Received CA Profile MetaData discovery Interest");
+  if (m_profileData == nullptr) {
+    m_profileData = std::make_unique<Data>(getCaProfileData());
+  }
+  MetadataObject metadata;
+  metadata.setVersionedName(m_profileData->getName().getPrefix(-1));
+  Name discoveryInterestName(m_profileData->getName().getPrefix(-2));
+  name::Component metadataComponent(32, reinterpret_cast<const uint8_t*>("metadata"), std::strlen("metadata"));
+  discoveryInterestName.append(metadataComponent);
+  m_face.put(metadata.makeData(discoveryInterestName, m_keyChain, signingByIdentity(m_config.m_caItem.m_caPrefix)));
 }
 
 void
diff --git a/src/ca-module.hpp b/src/ca-module.hpp
index 4d6bebe..04d594f 100644
--- a/src/ca-module.hpp
+++ b/src/ca-module.hpp
@@ -51,12 +51,12 @@
   void
   setStatusUpdateCallback(const StatusUpdateCallback& onUpdateCallback);
 
-PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  shared_ptr<Data>
-  generateCaProfileMetaData();
+  Data
+  getCaProfileData();
 
-  shared_ptr<Data>
-  generateCaProfileData();
+PUBLIC_WITH_TESTS_ELSE_PRIVATE:
+  void
+  onCaProfileDiscovery(const Interest& request);
 
   void
   onProbe(const Interest& request);
@@ -88,6 +88,7 @@
   unique_ptr<CaStorage> m_storage;
   security::v2::KeyChain& m_keyChain;
   uint8_t m_requestIdGenKey[32];
+  std::unique_ptr<Data> m_profileData;
 
   std::list<RegisteredPrefixHandle> m_registeredPrefixHandles;
   std::list<InterestFilterHandle> m_interestFilterHandles;
