diff --git a/ndn-cxx/ims/in-memory-storage-entry.cpp b/ndn-cxx/ims/in-memory-storage-entry.cpp
index 5720bc9..546efe7 100644
--- a/ndn-cxx/ims/in-memory-storage-entry.cpp
+++ b/ndn-cxx/ims/in-memory-storage-entry.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2019 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -23,11 +23,6 @@
 
 namespace ndn {
 
-InMemoryStorageEntry::InMemoryStorageEntry()
-  : m_isFresh(true)
-{
-}
-
 void
 InMemoryStorageEntry::release()
 {
@@ -36,13 +31,6 @@
 }
 
 void
-InMemoryStorageEntry::setData(const Data& data)
-{
-  m_dataPacket = data.shared_from_this();
-  m_isFresh = true;
-}
-
-void
 InMemoryStorageEntry::scheduleMarkStale(Scheduler& sched, time::nanoseconds after)
 {
   m_markStaleEventId = sched.schedule(after, [this] { m_isFresh = false; });
diff --git a/ndn-cxx/ims/in-memory-storage-entry.hpp b/ndn-cxx/ims/in-memory-storage-entry.hpp
index b412a30..a2fdb1f 100644
--- a/ndn-cxx/ims/in-memory-storage-entry.hpp
+++ b/ndn-cxx/ims/in-memory-storage-entry.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -28,20 +28,12 @@
 
 namespace ndn {
 
-/** @brief Represents an in-memory storage entry
+/**
+ * @brief Represents an in-memory storage entry.
  */
 class InMemoryStorageEntry : noncopyable
 {
 public:
-  /** @brief Create an entry
-   */
-  InMemoryStorageEntry();
-
-  /** @brief Releases reference counts on shared objects
-   */
-  void
-  release();
-
   /** @brief Returns the name of the Data packet stored in the in-memory storage entry
    */
   const Name&
@@ -72,26 +64,36 @@
    *  This method also allows data to satisfy Interest with MustBeFresh
    */
   void
-  setData(const Data& data);
+  setData(const Data& data)
+  {
+    m_dataPacket = data.shared_from_this();
+    m_isFresh = true;
+  }
 
   /** @brief Schedule an event to mark this entry as non-fresh.
    */
   void
   scheduleMarkStale(Scheduler& sched, time::nanoseconds after);
 
-  /** @brief Check if the data can satisfy an interest with MustBeFresh
+  /**
+   * @brief Check if the data can satisfy an Interest with MustBeFresh.
    */
   bool
-  isFresh()
+  isFresh() const
   {
     return m_isFresh;
   }
 
+  /**
+   * @brief Releases reference counts on shared objects.
+   */
+  void
+  release();
+
 private:
   shared_ptr<const Data> m_dataPacket;
-
-  bool m_isFresh;
   scheduler::ScopedEventId m_markStaleEventId;
+  bool m_isFresh = true;
 };
 
 } // namespace ndn
diff --git a/ndn-cxx/ims/in-memory-storage.cpp b/ndn-cxx/ims/in-memory-storage.cpp
index c4ea1cf..e795914 100644
--- a/ndn-cxx/ims/in-memory-storage.cpp
+++ b/ndn-cxx/ims/in-memory-storage.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -42,14 +42,12 @@
 
 InMemoryStorage::InMemoryStorage(size_t limit)
   : m_limit(limit)
-  , m_nPackets(0)
 {
   init();
 }
 
 InMemoryStorage::InMemoryStorage(boost::asio::io_context& ioCtx, size_t limit)
   : m_limit(limit)
-  , m_nPackets(0)
 {
   m_scheduler = make_unique<Scheduler>(ioCtx);
   init();
@@ -58,7 +56,7 @@
 void
 InMemoryStorage::init()
 {
-  // TODO consider a more suitable initial value
+  // TODO: consider a more suitable initial value
   m_capacity = MIN_CAPACITY;
 
   if (m_limit != std::numeric_limits<size_t>::max() && m_capacity > m_limit) {
@@ -124,7 +122,7 @@
   if (it != m_cache.get<byFullName>().end())
     return;
 
-  //if full, double the capacity
+  // if full, double the capacity
   bool doesReachLimit = (getLimit() == getCapacity());
   if (isFull() && !doesReachLimit) {
     // note: This is incorrect if 2*capacity overflows, but memory should run out before that
@@ -132,12 +130,12 @@
     setCapacity(newCapacity);
   }
 
-  //if full and reach limitation of the capacity, employ replacement policy
+  // if full and reach limitation of the capacity, employ replacement policy
   if (isFull() && doesReachLimit) {
     evictItem();
   }
 
-  //insert to cache
+  // insert to cache
   BOOST_ASSERT(m_freeEntries.size() > 0);
   // take entry for the memory pool
   InMemoryStorageEntry* entry = m_freeEntries.top();
@@ -149,7 +147,7 @@
   }
   m_cache.insert(entry);
 
-  //let derived class do something with the entry
+  // let derived class do something with the entry
   afterInsert(entry);
 }
 
diff --git a/ndn-cxx/ims/in-memory-storage.hpp b/ndn-cxx/ims/in-memory-storage.hpp
index de4acde..53f3705 100644
--- a/ndn-cxx/ims/in-memory-storage.hpp
+++ b/ndn-cxx/ims/in-memory-storage.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -330,11 +330,11 @@
 private:
   Cache m_cache;
   /// user defined maximum capacity of the in-memory storage in packets
-  size_t m_limit;
+  size_t m_limit = 0;
   /// current capacity of the in-memory storage in packets
-  size_t m_capacity;
+  size_t m_capacity = 0;
   /// current number of packets in in-memory storage
-  size_t m_nPackets;
+  size_t m_nPackets = 0;
   /// memory pool
   std::stack<InMemoryStorageEntry*> m_freeEntries;
   /// scheduler
diff --git a/ndn-cxx/mgmt/nfd/face-traits.hpp b/ndn-cxx/mgmt/nfd/face-traits.hpp
index 7816665..eed1130 100644
--- a/ndn-cxx/mgmt/nfd/face-traits.hpp
+++ b/ndn-cxx/mgmt/nfd/face-traits.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -169,23 +169,16 @@
   }
 
 protected:
-  FaceTraits()
-    : m_faceId(INVALID_FACE_ID)
-    , m_faceScope(FACE_SCOPE_NON_LOCAL)
-    , m_facePersistency(FACE_PERSISTENCY_PERSISTENT)
-    , m_linkType(LINK_TYPE_POINT_TO_POINT)
-    , m_flags(0)
-  {
-  }
+  FaceTraits() = default;
 
 protected:
-  uint64_t m_faceId;
+  uint64_t m_faceId = INVALID_FACE_ID;
   std::string m_remoteUri;
   std::string m_localUri;
-  FaceScope m_faceScope;
-  FacePersistency  m_facePersistency;
-  LinkType m_linkType;
-  uint64_t m_flags;
+  FaceScope m_faceScope = FACE_SCOPE_NON_LOCAL;
+  FacePersistency  m_facePersistency = FACE_PERSISTENCY_PERSISTENT;
+  LinkType m_linkType = LINK_TYPE_POINT_TO_POINT;
+  uint64_t m_flags = 0;
 
   mutable Block m_wire;
 };
diff --git a/ndn-cxx/net/network-interface.cpp b/ndn-cxx/net/network-interface.cpp
index 250e1d6..fbfe8e9 100644
--- a/ndn-cxx/net/network-interface.cpp
+++ b/ndn-cxx/net/network-interface.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -32,14 +32,7 @@
 
 NDN_LOG_INIT(ndn.NetworkMonitor);
 
-NetworkInterface::NetworkInterface()
-  : m_index(0)
-  , m_type(InterfaceType::UNKNOWN)
-  , m_flags(0)
-  , m_state(InterfaceState::UNKNOWN)
-  , m_mtu(0)
-{
-}
+NetworkInterface::NetworkInterface() = default;
 
 bool
 NetworkInterface::addNetworkAddress(const NetworkAddress& address)
diff --git a/ndn-cxx/net/network-interface.hpp b/ndn-cxx/net/network-interface.hpp
index dca92b9..c449ce2 100644
--- a/ndn-cxx/net/network-interface.hpp
+++ b/ndn-cxx/net/network-interface.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -32,7 +32,8 @@
 
 namespace ndn::net {
 
-/** @brief Indicates the hardware type of a network interface
+/**
+ * @brief Indicates the hardware type of a network interface.
  */
 enum class InterfaceType {
   UNKNOWN,
@@ -44,7 +45,8 @@
 std::ostream&
 operator<<(std::ostream& os, InterfaceType type);
 
-/** @brief Indicates the state of a network interface
+/**
+ * @brief Indicates the state of a network interface.
  */
 enum class InterfaceState {
   UNKNOWN,    ///< interface is in an unknown state
@@ -61,31 +63,28 @@
  * @brief Represents one network interface attached to the host.
  *
  * Each network interface has a unique index, a name, and a set of flags indicating its
- * capabilities and current state. It may contain one hardware (Ethernet) address, and
+ * capabilities and current state. It may contain one link-layer (Ethernet) address, and
  * zero or more network-layer (IP) addresses. Specific signals are emitted when the
  * interface data change.
  */
 class NetworkInterface
 {
-public: // signals, marked 'mutable' so they can be connected on 'const NetworkInterface'
-  /** @brief Fires when interface state changes
-   */
+public: // signals, marked 'mutable' so they can be connected on a 'const NetworkInterface'
+  /// Fires when the interface state changes.
   mutable signal::Signal<NetworkInterface, InterfaceState /*old*/, InterfaceState /*new*/> onStateChanged;
 
-  /** @brief Fires when interface mtu changes
-   */
+  /// Fires when the interface MTU changes.
   mutable signal::Signal<NetworkInterface, uint32_t /*old*/, uint32_t /*new*/> onMtuChanged;
 
-  /** @brief Fires when a network-layer address is added to the interface
-   */
+  /// Fires when a network-layer address is added to the interface.
   mutable signal::Signal<NetworkInterface, NetworkAddress> onAddressAdded;
 
-  /** @brief Fires when a network-layer address is removed from the interface
-   */
+  /// Fires when a network-layer address is removed from the interface.
   mutable signal::Signal<NetworkInterface, NetworkAddress> onAddressRemoved;
 
 public: // getters
-  /** @brief Returns an opaque ID that uniquely identifies the interface on the system
+  /**
+   * @brief Returns an opaque ID that uniquely identifies the interface on the system.
    */
   int
   getIndex() const
@@ -93,7 +92,8 @@
     return m_index;
   }
 
-  /** @brief Returns the name of the interface, unique on the system
+  /**
+   * @brief Returns the name of the interface, unique on the system.
    */
   std::string
   getName() const
@@ -101,7 +101,8 @@
     return m_name;
   }
 
-  /** @brief Returns the hardware type of the interface
+  /**
+   * @brief Returns the hardware type of the interface.
    */
   InterfaceType
   getType() const
@@ -109,7 +110,8 @@
     return m_type;
   }
 
-  /** @brief Returns a bitset of platform-specific flags enabled on the interface
+  /**
+   * @brief Returns a bitset of platform-specific flags enabled on the interface.
    */
   uint32_t
   getFlags() const
@@ -117,7 +119,8 @@
     return m_flags;
   }
 
-  /** @brief Returns the current state of the interface
+  /**
+   * @brief Returns the current state of the interface.
    */
   InterfaceState
   getState() const
@@ -125,7 +128,8 @@
     return m_state;
   }
 
-  /** @brief Returns the MTU (maximum transmission unit) of the interface
+  /**
+   * @brief Returns the MTU (maximum transmission unit) of the interface.
    */
   uint32_t
   getMtu() const
@@ -133,7 +137,8 @@
     return m_mtu;
   }
 
-  /** @brief Returns the link-layer (Ethernet) address of the interface
+  /**
+   * @brief Returns the link-layer (Ethernet) address of the interface.
    */
   ethernet::Address
   getEthernetAddress() const
@@ -141,7 +146,8 @@
     return m_etherAddress;
   }
 
-  /** @brief Returns the link-layer (Ethernet) broadcast address of the interface
+  /**
+   * @brief Returns the link-layer (Ethernet) broadcast address of the interface.
    */
   ethernet::Address
   getEthernetBroadcastAddress() const
@@ -149,7 +155,8 @@
     return m_etherBrdAddress;
   }
 
-  /** @brief Returns a list of all network-layer addresses present on the interface
+  /**
+   * @brief Returns all network-layer addresses present on the interface.
    */
   const std::set<NetworkAddress>&
   getNetworkAddresses() const
@@ -157,7 +164,8 @@
     return m_netAddresses;
   }
 
-  /** @brief Returns true if the interface is a loopback interface
+  /**
+   * @brief Returns true if the interface is a loopback interface.
    */
   bool
   isLoopback() const
@@ -165,7 +173,8 @@
     return (m_flags & IFF_LOOPBACK) != 0;
   }
 
-  /** @brief Returns true if the interface is a point-to-point interface
+  /**
+   * @brief Returns true if the interface is a point-to-point interface.
    */
   bool
   isPointToPoint() const
@@ -173,7 +182,8 @@
     return (m_flags & IFF_POINTOPOINT) != 0;
   }
 
-  /** @brief Returns true if the interface supports broadcast communication
+  /**
+   * @brief Returns true if the interface supports broadcast communication.
    */
   bool
   canBroadcast() const
@@ -181,7 +191,8 @@
     return (m_flags & IFF_BROADCAST) != 0;
   }
 
-  /** @brief Returns true if the interface supports multicast communication
+  /**
+   * @brief Returns true if the interface supports multicast communication.
    */
   bool
   canMulticast() const
@@ -189,7 +200,8 @@
     return (m_flags & IFF_MULTICAST) != 0;
   }
 
-  /** @brief Returns true if the interface is administratively up
+  /**
+   * @brief Returns true if the interface is administratively "up".
    */
   bool
   isUp() const
@@ -197,7 +209,7 @@
     return (m_flags & IFF_UP) != 0;
   }
 
-public: // modifiers: they update information on this instance, but do not change netif in the OS
+public: // modifiers: they update the info on this in-memory object, but do not modify the interface in the OS
   bool
   addNetworkAddress(const NetworkAddress& address);
 
@@ -232,12 +244,12 @@
   NetworkInterface(); // accessible through NetworkMonitorImpl::makeNetworkInterface
 
 private:
-  int m_index;
+  int m_index = 0;
   std::string m_name;
-  InterfaceType m_type;
-  uint32_t m_flags; // IFF_* in <net/if.h>
-  InterfaceState m_state;
-  uint32_t m_mtu;
+  InterfaceType m_type = InterfaceType::UNKNOWN;
+  uint32_t m_flags = 0; // IFF_* in <net/if.h>
+  InterfaceState m_state = InterfaceState::UNKNOWN;
+  uint32_t m_mtu = 0;
   ethernet::Address m_etherAddress;
   ethernet::Address m_etherBrdAddress;
   std::set<NetworkAddress> m_netAddresses;
diff --git a/ndn-cxx/security/certificate-bundle-fetcher.cpp b/ndn-cxx/security/certificate-bundle-fetcher.cpp
index 36bc4bc..55c1f71 100644
--- a/ndn-cxx/security/certificate-bundle-fetcher.cpp
+++ b/ndn-cxx/security/certificate-bundle-fetcher.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -21,41 +21,29 @@
 
 #include "ndn-cxx/security/certificate-bundle-fetcher.hpp"
 
-#include "ndn-cxx/face.hpp"
 #include "ndn-cxx/security/certificate-request.hpp"
 #include "ndn-cxx/security/certificate-storage.hpp"
 #include "ndn-cxx/security/validation-state.hpp"
+#include "ndn-cxx/tag.hpp"
 #include "ndn-cxx/util/logger.hpp"
 
+#define NDN_LOG_DEBUG_DEPTH(x) NDN_LOG_DEBUG(std::string(state->getDepth() + 1, '>') << ' ' << x)
+
 namespace ndn::security {
 
 NDN_LOG_INIT(ndn.security.CertificateBundleFetcher);
 
-#define NDN_LOG_DEBUG_DEPTH(x) NDN_LOG_DEBUG(std::string(state->getDepth() + 1, '>') << " " << x)
-#define NDN_LOG_TRACE_DEPTH(x) NDN_LOG_TRACE(std::string(state->getDepth() + 1, '>') << " " << x)
+using BundleNameTag = SimpleTag<Name, 1000>;
+using FinalBlockIdTag = SimpleTag<name::Component, 1001>;
 
-CertificateBundleFetcher::CertificateBundleFetcher(unique_ptr<CertificateFetcher> inner,
-                                                   Face& face)
+CertificateBundleFetcher::CertificateBundleFetcher(unique_ptr<CertificateFetcher> inner, Face& face)
   : m_inner(std::move(inner))
   , m_face(face)
-  , m_bundleInterestLifetime(1000)
 {
   BOOST_ASSERT(m_inner != nullptr);
 }
 
 void
-CertificateBundleFetcher::setBundleInterestLifetime(time::milliseconds time)
-{
-  m_bundleInterestLifetime = time;
-}
-
-time::milliseconds
-CertificateBundleFetcher::getBundleInterestLifetime() const
-{
-  return m_bundleInterestLifetime;
-}
-
-void
 CertificateBundleFetcher::setCertificateStorage(CertificateStorage& certStorage)
 {
   m_certStorage = &certStorage;
@@ -148,7 +136,7 @@
                                        const shared_ptr<ValidationState>& state,
                                        const ValidationContinuation& continueValidation)
 {
-  NDN_LOG_DEBUG_DEPTH("Fetched certificate bundle from network " << bundleData.getName());
+  NDN_LOG_DEBUG_DEPTH("Fetched certificate bundle " << bundleData.getName());
 
   name::Component currentSegment = bundleData.getName().get(-1);
   if (!currentSegment.isSegment()) {
@@ -188,7 +176,7 @@
                                        const ValidationContinuation& continueValidation,
                                        const Name& bundleName)
 {
-  NDN_LOG_DEBUG_DEPTH("NACK (" << nack.getReason() <<  ") while fetching certificate bundle"
+  NDN_LOG_DEBUG_DEPTH("NACK (" << nack.getReason() << ") while fetching certificate bundle "
                       << bundleName);
 
   m_inner->fetch(certRequest, state, continueValidation);
@@ -200,7 +188,7 @@
                                           const ValidationContinuation& continueValidation,
                                           const Name& bundleName)
 {
-  NDN_LOG_DEBUG_DEPTH("Timeout while fetching certificate bundle" << bundleName);
+  NDN_LOG_DEBUG_DEPTH("Timeout while fetching certificate bundle " << bundleName);
 
   m_inner->fetch(certRequest, state, continueValidation);
 }
@@ -208,9 +196,9 @@
 Name
 CertificateBundleFetcher::deriveBundleName(const Name& name)
 {
-  name::Component lastComponent = name.at(-1);
-
   Name bundleName = name;
+  const auto& lastComponent = name.at(-1);
+
   if (lastComponent.isImplicitSha256Digest()) {
     if (name.size() >= 2 && name.get(-2).isSegment()) {
       bundleName = name.getPrefix(-2);
@@ -222,9 +210,9 @@
   else if (lastComponent.isSegment()) {
     bundleName = name.getPrefix(-1);
   }
+
   bundleName.append("_BUNDLE");
   bundleName.appendNumber(0);
-
   return bundleName;
 }
 
diff --git a/ndn-cxx/security/certificate-bundle-fetcher.hpp b/ndn-cxx/security/certificate-bundle-fetcher.hpp
index 1d3e4ff..b4520c1 100644
--- a/ndn-cxx/security/certificate-bundle-fetcher.hpp
+++ b/ndn-cxx/security/certificate-bundle-fetcher.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,14 +22,13 @@
 #ifndef NDN_CXX_SECURITY_CERTIFICATE_BUNDLE_FETCHER_HPP
 #define NDN_CXX_SECURITY_CERTIFICATE_BUNDLE_FETCHER_HPP
 
-#include "ndn-cxx/name.hpp"
-#include "ndn-cxx/tag.hpp"
-#include "ndn-cxx/security/certificate-fetcher-from-network.hpp"
+#include "ndn-cxx/face.hpp"
+#include "ndn-cxx/security/certificate-fetcher.hpp"
 
 namespace ndn::security {
 
 /**
- * @brief Fetch certificate bundle from the network
+ * @brief Fetch certificate bundle from the network.
  *
  * Currently bundle fetching is attempted only for Data validation. This may change in the
  * future. Bundle fetching always goes to the infrastructure regardless of the inner
@@ -42,30 +41,36 @@
 {
 public:
   explicit
-  CertificateBundleFetcher(unique_ptr<CertificateFetcher> inner,
-                           Face& face);
+  CertificateBundleFetcher(unique_ptr<CertificateFetcher> inner, Face& face);
 
   /**
-   * @brief Set the lifetime of certificate bundle interest
-   */
-  void
-  setBundleInterestLifetime(time::milliseconds time);
-
-  /**
-   * @return The lifetime of certificate bundle interest
+   * @return The lifetime of certificate bundle Interest.
    */
   time::milliseconds
-  getBundleInterestLifetime() const;
+  getBundleInterestLifetime() const
+  {
+    return m_bundleInterestLifetime;
+  }
 
   /**
-   * Set the storage for this and inner certificate fetcher
+   * @brief Set the lifetime of certificate bundle Interest.
+   */
+  void
+  setBundleInterestLifetime(time::milliseconds time)
+  {
+    m_bundleInterestLifetime = time;
+  }
+
+  /**
+   * @brief Set the storage for this and inner certificate fetcher.
    */
   void
   setCertificateStorage(CertificateStorage& certStorage) override;
 
 protected:
   void
-  doFetch(const shared_ptr<CertificateRequest>& certRequest, const shared_ptr<ValidationState>& state,
+  doFetch(const shared_ptr<CertificateRequest>& certRequest,
+          const shared_ptr<ValidationState>& state,
           const ValidationContinuation& continueValidation) override;
 
 private:
@@ -137,9 +142,7 @@
 private:
   unique_ptr<CertificateFetcher> m_inner;
   Face& m_face;
-  using BundleNameTag = SimpleTag<Name, 1000>;
-  using FinalBlockIdTag = SimpleTag<name::Component, 1001>;
-  time::milliseconds m_bundleInterestLifetime;
+  time::milliseconds m_bundleInterestLifetime = 1_s;
 };
 
 } // namespace ndn::security
diff --git a/ndn-cxx/security/interest-signer.cpp b/ndn-cxx/security/interest-signer.cpp
index ae6fe9d..d70a4cc 100644
--- a/ndn-cxx/security/interest-signer.cpp
+++ b/ndn-cxx/security/interest-signer.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -24,12 +24,6 @@
 
 namespace ndn::security {
 
-InterestSigner::InterestSigner(KeyChain& keyChain)
-  : m_keyChain(keyChain)
-  , m_lastUsedSeqNum(-1) // Will wrap around to 0 on next Interest
-{
-}
-
 void
 InterestSigner::makeSignedInterest(Interest& interest, SigningInfo params, uint32_t signingFlags)
 {
diff --git a/ndn-cxx/security/interest-signer.hpp b/ndn-cxx/security/interest-signer.hpp
index e47e704..e278805 100644
--- a/ndn-cxx/security/interest-signer.hpp
+++ b/ndn-cxx/security/interest-signer.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -27,13 +27,19 @@
 namespace ndn::security {
 
 /**
- * @brief Helper class to create signed Interests
+ * @brief Helper class to create signed Interests.
  *
  * The signer generates signature elements for an Interest and signs it with the KeyChain.
  */
 class InterestSigner
 {
 public:
+  explicit
+  InterestSigner(KeyChain& keyChain) noexcept
+    : m_keyChain(keyChain)
+  {
+  }
+
   /**
    * @brief Flags to indicate which elements to include in Interest signatures created with
    *        makeSignedInterest.
@@ -45,10 +51,6 @@
     WantSeqNum = 1 << 2,
   };
 
-public:
-  explicit
-  InterestSigner(KeyChain& keyChain);
-
   /**
    * @brief Signs an Interest (following Packet Specification v0.3 or newer)
    * @param interest Interest to sign
@@ -83,7 +85,7 @@
 private:
   KeyChain& m_keyChain;
   time::system_clock::time_point m_lastUsedTimestamp;
-  uint64_t m_lastUsedSeqNum;
+  uint64_t m_lastUsedSeqNum = static_cast<uint64_t>(-1); // will wrap around to 0 on next Interest
 };
 
 } // namespace ndn::security
diff --git a/ndn-cxx/security/transform/bool-sink.cpp b/ndn-cxx/security/transform/bool-sink.cpp
index 3a86a0e..e1a8c5f 100644
--- a/ndn-cxx/security/transform/bool-sink.cpp
+++ b/ndn-cxx/security/transform/bool-sink.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -23,12 +23,6 @@
 
 namespace ndn::security::transform {
 
-BoolSink::BoolSink(bool& value)
-  : m_hasValue(false)
-  , m_value(value)
-{
-}
-
 size_t
 BoolSink::doWrite(span<const uint8_t> buf)
 {
@@ -39,12 +33,6 @@
   return buf.size();
 }
 
-void
-BoolSink::doEnd()
-{
-  // nothing to do.
-}
-
 unique_ptr<Sink>
 boolSink(bool& value)
 {
diff --git a/ndn-cxx/security/transform/bool-sink.hpp b/ndn-cxx/security/transform/bool-sink.hpp
index bf4b4df..ea3f5a3 100644
--- a/ndn-cxx/security/transform/bool-sink.hpp
+++ b/ndn-cxx/security/transform/bool-sink.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -39,7 +39,10 @@
    * @brief Create a bool sink whose output will be stored in @p value.
    */
   explicit
-  BoolSink(bool& value);
+  BoolSink(bool& value)
+    : m_value(value)
+  {
+  }
 
 private:
   /**
@@ -51,13 +54,16 @@
   doWrite(span<const uint8_t> buf) final;
 
   /**
-   * @brief Finalize sink processing
+   * @brief Finalize sink processing.
    */
   void
-  doEnd() final;
+  doEnd() final
+  {
+    // nothing to do
+  }
 
 private:
-  bool m_hasValue;
+  bool m_hasValue = false;
   bool& m_value;
 };
 
diff --git a/ndn-cxx/security/transform/hex-decode.cpp b/ndn-cxx/security/transform/hex-decode.cpp
index 97e6774..7f1fad0 100644
--- a/ndn-cxx/security/transform/hex-decode.cpp
+++ b/ndn-cxx/security/transform/hex-decode.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -45,13 +45,6 @@
 };
 static_assert(std::extent_v<decltype(C2H)> == 256);
 
-
-HexDecode::HexDecode()
-  : m_hasOddByte(false)
-  , m_oddByte(0)
-{
-}
-
 size_t
 HexDecode::convert(span<const uint8_t> hex)
 {
diff --git a/ndn-cxx/security/transform/hex-decode.hpp b/ndn-cxx/security/transform/hex-decode.hpp
index 72ffb18..18d23e7 100644
--- a/ndn-cxx/security/transform/hex-decode.hpp
+++ b/ndn-cxx/security/transform/hex-decode.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -36,12 +36,6 @@
  */
 class HexDecode final : public Transform
 {
-public:
-  /**
-   * @brief Create a hex decoding module
-   */
-  HexDecode();
-
 private:
   /**
    * @brief Decode data @p buf, and write the result into output buffer directly.
@@ -64,8 +58,8 @@
   toBytes(const uint8_t* hex, size_t hexLen);
 
 private:
-  bool m_hasOddByte;
-  uint8_t m_oddByte;
+  bool m_hasOddByte = false;
+  uint8_t m_oddByte = 0;
 };
 
 unique_ptr<Transform>
diff --git a/ndn-cxx/security/transform/hex-encode.cpp b/ndn-cxx/security/transform/hex-encode.cpp
index 1dc759a..3331bd6 100644
--- a/ndn-cxx/security/transform/hex-encode.cpp
+++ b/ndn-cxx/security/transform/hex-encode.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -35,12 +35,6 @@
 };
 static_assert(std::extent_v<decltype(H2CU)> == 16);
 
-
-HexEncode::HexEncode(bool useUpperCase)
-  : m_useUpperCase(useUpperCase)
-{
-}
-
 size_t
 HexEncode::convert(span<const uint8_t> data)
 {
diff --git a/ndn-cxx/security/transform/hex-encode.hpp b/ndn-cxx/security/transform/hex-encode.hpp
index 4d334b4..e6673b1 100644
--- a/ndn-cxx/security/transform/hex-encode.hpp
+++ b/ndn-cxx/security/transform/hex-encode.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -36,12 +36,15 @@
 {
 public:
   /**
-   * @brief Create a hex encoding module
+   * @brief Create a hex encoding module.
    *
    * @param useUpperCase if true, use upper case letters, otherwise lower case
    */
   explicit
-  HexEncode(bool useUpperCase = false);
+  HexEncode(bool useUpperCase = false)
+    : m_useUpperCase(useUpperCase)
+  {
+  }
 
 private:
   /**
@@ -59,7 +62,7 @@
   toHex(const uint8_t* data, size_t dataLen);
 
 private:
-  bool m_useUpperCase;
+  bool m_useUpperCase = false;
 };
 
 unique_ptr<Transform>
diff --git a/ndn-cxx/util/notification-stream.hpp b/ndn-cxx/util/notification-stream.hpp
index dceba06..0d7d23a 100644
--- a/ndn-cxx/util/notification-stream.hpp
+++ b/ndn-cxx/util/notification-stream.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2024 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,8 +29,9 @@
 
 namespace ndn::util {
 
-/** \brief Provides a publisher of Notification Stream.
- *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
+/**
+ * \brief A facility to publish notifications.
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
  */
 template<typename Notification>
 class NotificationStream : noncopyable
@@ -42,7 +43,6 @@
     : m_face(face)
     , m_prefix(prefix)
     , m_keyChain(keyChain)
-    , m_sequenceNo(0)
   {
   }
 
@@ -55,7 +55,7 @@
     Name dataName = m_prefix;
     dataName.appendSequenceNumber(m_sequenceNo);
 
-    shared_ptr<Data> data = make_shared<Data>(dataName);
+    auto data = make_shared<Data>(dataName);
     data->setContent(notification.wireEncode());
     data->setFreshnessPeriod(1_s);
 
@@ -69,7 +69,7 @@
   Face& m_face;
   const Name m_prefix;
   KeyChain& m_keyChain;
-  uint64_t m_sequenceNo;
+  uint64_t m_sequenceNo = 0;
 };
 
 } // namespace ndn::util
diff --git a/ndn-cxx/util/notification-subscriber.cpp b/ndn-cxx/util/notification-subscriber.cpp
index ac934d1..01bfe65 100644
--- a/ndn-cxx/util/notification-subscriber.cpp
+++ b/ndn-cxx/util/notification-subscriber.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2023 Regents of the University of California,
+ * Copyright (c) 2014-2024 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -36,10 +36,6 @@
                                                        time::milliseconds interestLifetime)
   : m_face(face)
   , m_prefix(prefix)
-  , m_isRunning(false)
-  , m_lastSequenceNum(std::numeric_limits<uint64_t>::max())
-  , m_lastNackSequenceNum(std::numeric_limits<uint64_t>::max())
-  , m_attempts(1)
   , m_scheduler(face.getIoContext())
   , m_interestLifetime(interestLifetime)
 {
@@ -50,20 +46,20 @@
 void
 NotificationSubscriberBase::start()
 {
-  if (m_isRunning) // already running
+  if (m_isRunning)
     return;
-  m_isRunning = true;
 
+  m_isRunning = true;
   sendInitialInterest();
 }
 
 void
 NotificationSubscriberBase::stop()
 {
-  if (!m_isRunning) // not running
+  if (!m_isRunning)
     return;
-  m_isRunning = false;
 
+  m_isRunning = false;
   m_lastInterest.cancel();
 }
 
@@ -98,9 +94,9 @@
 NotificationSubscriberBase::sendInterest(const Interest& interest)
 {
   m_lastInterest = m_face.expressInterest(interest,
-                                          [this] (const auto&, const auto& d) { this->afterReceiveData(d); },
-                                          [this] (const auto&, const auto& n) { this->afterReceiveNack(n); },
-                                          [this] (const auto&) { this->afterTimeout(); });
+                                          [this] (const auto&, const auto& d) { afterReceiveData(d); },
+                                          [this] (const auto&, const auto& n) { afterReceiveNack(n); },
+                                          [this] (const auto&) { afterTimeout(); });
 }
 
 bool
@@ -148,7 +144,7 @@
 
   onNack(nack);
 
-  time::milliseconds delay = exponentialBackoff(nack);
+  auto delay = exponentialBackoff(nack);
   m_nackEvent = m_scheduler.schedule(delay, [this] { sendInitialInterest(); });
 }
 
@@ -159,19 +155,18 @@
     return;
 
   onTimeout();
-
   sendInitialInterest();
 }
 
 time::milliseconds
-NotificationSubscriberBase::exponentialBackoff(lp::Nack nack)
+NotificationSubscriberBase::exponentialBackoff(const lp::Nack& nack)
 {
-  uint64_t nackSequenceNum;
+  uint64_t nackSequenceNum = 0;
   try {
     nackSequenceNum = nack.getInterest().getName().get(-1).toSequenceNumber();
   }
   catch (const tlv::Error&) {
-    nackSequenceNum = 0;
+    // pass
   }
 
   if (m_lastNackSequenceNum == nackSequenceNum) {
diff --git a/ndn-cxx/util/notification-subscriber.hpp b/ndn-cxx/util/notification-subscriber.hpp
index 0d8cede..8d104a7 100644
--- a/ndn-cxx/util/notification-subscriber.hpp
+++ b/ndn-cxx/util/notification-subscriber.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2023 Regents of the University of California,
+ * Copyright (c) 2014-2024 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -80,6 +80,13 @@
                              time::milliseconds interestLifetime);
 
 private:
+  /**
+   * \brief Check if the subscriber is or should be stopped.
+   * \retval true if the subscriber is stopped.
+   */
+  bool
+  shouldStop();
+
   void
   sendInitialInterest();
 
@@ -92,12 +99,6 @@
   virtual bool
   hasSubscriber() const = 0;
 
-  /** \brief Check if the subscriber is or should be stopped.
-   *  \return true if the subscriber is stopped.
-   */
-  bool
-  shouldStop();
-
   void
   afterReceiveData(const Data& data);
 
@@ -114,40 +115,35 @@
   afterTimeout();
 
   time::milliseconds
-  exponentialBackoff(lp::Nack nack);
+  exponentialBackoff(const lp::Nack& nack);
 
 public:
-  /**
-   * \brief Fires when a Nack is received.
-   */
+  /// Fires when a Nack is received.
   ndn::signal::Signal<NotificationSubscriberBase, lp::Nack> onNack;
 
-  /**
-   * \brief Fires when no Notification is received within getInterestLifetime() period.
-   */
+  /// Fires when no Notification is received within getInterestLifetime() period.
   ndn::signal::Signal<NotificationSubscriberBase> onTimeout;
 
-  /**
-   * \brief Fires when a Data packet in the notification stream cannot be decoded as a Notification.
-   */
+  /// Fires when a Data packet in the notification stream cannot be decoded as a Notification.
   ndn::signal::Signal<NotificationSubscriberBase, Data> onDecodeError;
 
 private:
   Face& m_face;
   Name m_prefix;
-  bool m_isRunning;
-  uint64_t m_lastSequenceNum;
-  uint64_t m_lastNackSequenceNum;
-  uint64_t m_attempts;
+  uint64_t m_lastSequenceNum = std::numeric_limits<uint64_t>::max();
+  uint64_t m_lastNackSequenceNum = std::numeric_limits<uint64_t>::max();
+  uint64_t m_attempts = 1;
   Scheduler m_scheduler;
   scheduler::ScopedEventId m_nackEvent;
   ScopedPendingInterestHandle m_lastInterest;
   time::milliseconds m_interestLifetime;
+  bool m_isRunning = false;
 };
 
-/** \brief Provides a subscriber of Notification Stream.
- *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
- *  \tparam Notification type of Notification item, appears in payload of Data packets
+/**
+ * \brief Provides the subscriber side of a Notification Stream.
+ * \tparam Notification type of Notification item, appears in payload of Data packets.
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
  */
 template<typename Notification>
 class NotificationSubscriber : public NotificationSubscriberBase
