diff --git a/ndn-cxx/data.hpp b/ndn-cxx/data.hpp
index 1f62d96..64425e0 100644
--- a/ndn-cxx/data.hpp
+++ b/ndn-cxx/data.hpp
@@ -31,8 +31,9 @@
 
 namespace ndn {
 
-/** @brief Represents a %Data packet.
- *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/data.html
+/**
+ * @brief Represents a %Data packet.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/data.html
  */
 class Data : public PacketBase, public std::enable_shared_from_this<Data>
 {
@@ -121,7 +122,8 @@
   getFullName() const;
 
 public: // Data fields
-  /** @brief Get name
+  /**
+   * @brief Get the data name.
    */
   const Name&
   getName() const noexcept
@@ -129,13 +131,15 @@
     return m_name;
   }
 
-  /** @brief Set name
-   *  @return a reference to this Data, to allow chaining
+  /**
+   * @brief Set the data name.
+   * @return A reference to this Data, to allow chaining.
    */
   Data&
   setName(const Name& name);
 
-  /** @brief Get MetaInfo
+  /**
+   * @brief Get the `MetaInfo` element.
    */
   const MetaInfo&
   getMetaInfo() const noexcept
@@ -143,14 +147,15 @@
     return m_metaInfo;
   }
 
-  /** @brief Set MetaInfo
-   *  @return a reference to this Data, to allow chaining
+  /**
+   * @brief Set the `MetaInfo` element.
+   * @return A reference to this Data, to allow chaining.
    */
   Data&
   setMetaInfo(const MetaInfo& metaInfo);
 
   /**
-   * @brief Return whether this Data has a Content element
+   * @brief Return whether this Data has a `Content` element.
    */
   bool
   hasContent() const noexcept
@@ -159,7 +164,7 @@
   }
 
   /**
-   * @brief Get the Content element
+   * @brief Get the `Content` element.
    *
    * If the element is not present (hasContent() == false), an invalid Block will be returned.
    *
@@ -178,9 +183,9 @@
   }
 
   /**
-   * @brief Set Content from a Block
+   * @brief Set `Content` from a Block.
    * @param block TLV block to be used as Content; must be valid
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    *
    * If the block's TLV-TYPE is tlv::Content, it will be used directly as this Data's
    * Content element. Otherwise, the block will be nested into a Content element.
@@ -189,18 +194,18 @@
   setContent(const Block& block);
 
   /**
-   * @brief Set Content by copying from a contiguous sequence of bytes
+   * @brief Set `Content` by copying from a contiguous sequence of bytes.
    * @param value buffer with the TLV-VALUE of the content
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    */
   Data&
   setContent(span<const uint8_t> value);
 
   /**
-   * @brief Set Content by copying from a raw buffer
+   * @brief Set `Content` by copying from a raw buffer.
    * @param value buffer with the TLV-VALUE of the content; may be nullptr if @p length is zero
    * @param length size of the buffer
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    * @deprecated Use setContent(span<const uint8_t>)
    */
   [[deprecated("use the overload that takes a span<>")]]
@@ -208,22 +213,23 @@
   setContent(const uint8_t* value, size_t length);
 
   /**
-   * @brief Set Content from a shared buffer
+   * @brief Set `Content` from a shared buffer.
    * @param value buffer with the TLV-VALUE of the content; must not be nullptr
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    */
   Data&
   setContent(ConstBufferPtr value);
 
   /**
-   * @brief Remove the Content element
-   * @return a reference to this Data, to allow chaining
+   * @brief Remove the `Content` element.
+   * @return A reference to this Data, to allow chaining.
    * @post hasContent() == false
    */
   Data&
   unsetContent();
 
-  /** @brief Get SignatureInfo
+  /**
+   * @brief Get the `SignatureInfo` element.
    */
   const SignatureInfo&
   getSignatureInfo() const noexcept
@@ -231,12 +237,12 @@
     return m_signatureInfo;
   }
 
-  /** @brief Set SignatureInfo
+  /** @brief Set the `SignatureInfo` element.
    *
    *  This is a low-level function that should not normally be called directly by applications.
    *  Instead, provide a SignatureInfo to the SigningInfo object passed to KeyChain::sign().
    *
-   *  @return a reference to this Data, to allow chaining
+   *  @return A reference to this Data, to allow chaining.
    *  @warning SignatureInfo is overwritten when the packet is signed via KeyChain::sign().
    *  @sa SigningInfo
    */
@@ -244,7 +250,7 @@
   setSignatureInfo(const SignatureInfo& info);
 
   /**
-   * @brief Get the SignatureValue element.
+   * @brief Get the `SignatureValue` element.
    */
   const Block&
   getSignatureValue() const noexcept
@@ -253,9 +259,9 @@
   }
 
   /**
-   * @brief Set SignatureValue by copying from a contiguous sequence of bytes.
+   * @brief Set `SignatureValue` by copying from a contiguous sequence of bytes.
    * @param value buffer from which the TLV-VALUE of the SignatureValue will be copied
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    *
    * This is a low-level function that should not normally be called directly by applications.
    * Instead, use KeyChain::sign() to sign the packet.
@@ -266,9 +272,9 @@
   setSignatureValue(span<const uint8_t> value);
 
   /**
-   * @brief Set SignatureValue from a shared buffer.
+   * @brief Set `SignatureValue` from a shared buffer.
    * @param value buffer containing the TLV-VALUE of the SignatureValue; must not be nullptr
-   * @return a reference to this Data, to allow chaining
+   * @return A reference to this Data, to allow chaining.
    *
    * This is a low-level function that should not normally be called directly by applications.
    * Instead, use KeyChain::sign() to sign the packet.
@@ -278,7 +284,7 @@
   Data&
   setSignatureValue(ConstBufferPtr value);
 
-  /** @brief Extract ranges of Data covered by the signature
+  /** @brief Extract ranges of Data covered by the signature.
    *  @throw Error Data cannot be encoded or is missing ranges necessary for signing
    *  @warning The returned pointers will be invalidated if wireDecode() or wireEncode() are called.
    */
@@ -314,8 +320,9 @@
   setFinalBlock(optional<name::Component> finalBlockId);
 
 public: // SignatureInfo fields
-  /** @brief Get SignatureType
-   *  @return tlv::SignatureTypeValue, or -1 to indicate the signature is invalid
+  /**
+   * @brief Get the `SignatureType`.
+   * @return tlv::SignatureTypeValue, or -1 to indicate the signature is invalid.
    */
   int32_t
   getSignatureType() const noexcept
@@ -323,7 +330,8 @@
     return m_signatureInfo.getSignatureType();
   }
 
-  /** @brief Get KeyLocator
+  /**
+   * @brief Get the `KeyLocator` element.
    */
   optional<KeyLocator>
   getKeyLocator() const noexcept
diff --git a/ndn-cxx/detail/packet-base.hpp b/ndn-cxx/detail/packet-base.hpp
index 43d836d..9924e54 100644
--- a/ndn-cxx/detail/packet-base.hpp
+++ b/ndn-cxx/detail/packet-base.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -26,17 +26,17 @@
 
 namespace ndn {
 
-/** \brief base class to allow simple management of packet tags
+/** \brief Base class to allow simple management of packet tags.
  */
 class PacketBase : public TagHost
 {
 public:
-  /** \brief get the value of the CongestionMark tag
+  /** \brief Get the value of the CongestionMark tag.
    */
   uint64_t
   getCongestionMark() const;
 
-  /** \brief set the CongestionMark tag to the specified value
+  /** \brief Set the CongestionMark tag to the specified value.
    */
   void
   setCongestionMark(uint64_t mark);
diff --git a/ndn-cxx/detail/tag-host.hpp b/ndn-cxx/detail/tag-host.hpp
index 8d3039c..4e4805f 100644
--- a/ndn-cxx/detail/tag-host.hpp
+++ b/ndn-cxx/detail/tag-host.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,12 +29,13 @@
 
 namespace ndn {
 
-/** \brief Base class to store tag information (e.g., inside Interest and Data packets)
+/**
+ * \brief Base class to store tag information, e.g., inside Interest and Data packets.
  */
 class TagHost
 {
 public:
-  /** \brief get a tag item
+  /** \brief Get a tag item.
    *  \tparam T type of the tag, which must be a subclass of ndn::Tag
    *  \retval nullptr if no Tag of type T is stored
    */
@@ -42,7 +43,7 @@
   shared_ptr<T>
   getTag() const;
 
-  /** \brief set a tag item
+  /** \brief Set (add or replace) a tag item.
    *  \tparam T type of the tag, which must be a subclass of ndn::Tag
    *  \note Tag can be set even on a const tag host instance
    */
@@ -50,7 +51,7 @@
   void
   setTag(shared_ptr<T> tag) const;
 
-  /** \brief remove tag item
+  /** \brief Remove a tag item.
    *  \note Tag can be removed even on a const tag host instance
    */
   template<typename T>
diff --git a/ndn-cxx/encoding/nfd-constants.hpp b/ndn-cxx/encoding/nfd-constants.hpp
index 72b70a4..686f4c8 100644
--- a/ndn-cxx/encoding/nfd-constants.hpp
+++ b/ndn-cxx/encoding/nfd-constants.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -86,7 +86,7 @@
 operator<<(std::ostream& os, FaceEventKind faceEventKind);
 
 /** \ingroup management
- *  \brief CS enablement flags
+ *  \brief CS enablement flags.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
  */
 enum CsFlagBit {
@@ -107,7 +107,7 @@
   ROUTE_ORIGIN_STATIC        = 255,
 };
 
-/** \brief extract RouteOrigin from stream
+/** \brief Extract RouteOrigin from stream.
  *  \post if the first token in \p contains a valid RouteOrigin as string or numeric value, it is
  *        extracted into \p routeOrigin ; otherwise, \p routeOrigin is set to \p ROUTE_ORIGIN_NONE ,
  *        and failbit is set on \p is
diff --git a/ndn-cxx/encoding/tlv.hpp b/ndn-cxx/encoding/tlv.hpp
index feb77f7..a892736 100644
--- a/ndn-cxx/encoding/tlv.hpp
+++ b/ndn-cxx/encoding/tlv.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -41,13 +41,14 @@
 const size_t MAX_NDN_PACKET_SIZE = 8800;
 
 /**
- * @brief Namespace defining NDN Packet Format related constants and procedures
+ * @brief Contains constants and low-level functions related to the NDN packet format.
  */
 namespace tlv {
 
-/** @brief represents an error in TLV encoding or decoding
+/**
+ * @brief Represents an error in TLV encoding or decoding.
  *
- *  Element::Error SHOULD inherit from this Error class.
+ * `Element::Error` SHOULD inherit from this Error class.
  */
 class Error : public std::runtime_error
 {
@@ -57,8 +58,9 @@
   Error(const char* expectedType, uint32_t actualType);
 };
 
-/** @brief TLV-TYPE numbers defined in NDN Packet Format v0.3
- *  @sa https://named-data.net/doc/NDN-packet-spec/current/types.html
+/**
+ * @brief TLV-TYPE numbers defined in NDN Packet Format v0.3.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/types.html
  */
 enum : uint32_t {
   Invalid                         = 0,
@@ -100,8 +102,9 @@
   AppPrivateBlock2 = 32768,
 };
 
-/** @brief TLV-TYPE numbers defined in NDN Packet Format v0.2 but not in v0.3
- *  @sa https://named-data.net/doc/NDN-packet-spec/0.2.1/types.html
+/**
+ * @brief TLV-TYPE numbers defined in NDN Packet Format v0.2 but not in v0.3.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.2.1/types.html
  */
 enum : uint32_t {
   Selectors                 = 9,
@@ -113,8 +116,9 @@
   Any                       = 19,
 };
 
-/** @brief TLV-TYPE numbers for typed name components.
- *  @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/NameComponentType
+/**
+ * @brief TLV-TYPE numbers for typed name components.
+ * @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/NameComponentType
  */
 enum : uint32_t {
   KeywordNameComponent     = 32,
@@ -125,9 +129,10 @@
   SequenceNumNameComponent = 58,
 };
 
-/** @brief SignatureType values
- *  @sa https://named-data.net/doc/NDN-packet-spec/current/signature.html
- *  @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/SignatureType
+/**
+ * @brief SignatureType values.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/signature.html
+ * @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/SignatureType
  */
 enum SignatureTypeValue : uint16_t {
   DigestSha256             = 0,
@@ -140,8 +145,9 @@
 std::ostream&
 operator<<(std::ostream& os, SignatureTypeValue st);
 
-/** @brief TLV-TYPE numbers for SignatureInfo extensions
- *  @sa <a href="../specs/certificate.html">NDN Certificate Format</a>
+/**
+ * @brief TLV-TYPE numbers for SignatureInfo extensions.
+ * @sa <a href="../specs/certificate.html">NDN Certificate Format</a>
  */
 enum : uint32_t {
   ValidityPeriod = 253,
@@ -154,8 +160,9 @@
   DescriptionValue = 514
 };
 
-/** @brief ContentType values
- *  @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/ContentType
+/**
+ * @brief ContentType values.
+ * @sa https://redmine.named-data.net/projects/ndn-tlv/wiki/ContentType
  */
 enum ContentTypeValue : uint32_t {
   ContentType_Blob      = 0,    ///< payload
@@ -250,7 +257,7 @@
 
 /**
  * @brief Write VAR-NUMBER to the specified stream.
- * @return length of written VAR-NUMBER
+ * @return Length of written VAR-NUMBER.
  */
 size_t
 writeVarNumber(std::ostream& os, uint64_t number);
@@ -280,7 +287,7 @@
 
 /**
  * @brief Write a NonNegativeInteger to the specified stream.
- * @return length of written NonNegativeInteger
+ * @return Length of written NonNegativeInteger.
  */
 size_t
 writeNonNegativeInteger(std::ostream& os, uint64_t integer);
@@ -297,7 +304,7 @@
 
 namespace detail {
 
-/** @brief Function object to read a number from InputIterator
+/** @brief Function object to read a number from InputIterator.
  */
 template<typename Iterator>
 class ReadNumberSlow
@@ -315,7 +322,7 @@
   }
 };
 
-/** @brief Function object to read a number from ContiguousIterator
+/** @brief Function object to read a number from ContiguousIterator.
  */
 template<typename Iterator>
 class ReadNumberFast
@@ -362,7 +369,7 @@
   }
 };
 
-/** @brief Determine whether to select ReadNumber implementation for ContiguousIterator
+/** @brief Determine whether to select ReadNumber implementation for ContiguousIterator.
  *
  *  This is not a full ContiguousIterator detection implementation. It returns true for the most
  *  common ContiguousIterator types used with TLV decoding function templates.
diff --git a/ndn-cxx/face.cpp b/ndn-cxx/face.cpp
index 48f1095..ed340e5 100644
--- a/ndn-cxx/face.cpp
+++ b/ndn-cxx/face.cpp
@@ -298,7 +298,7 @@
 }
 
 /**
- * @brief extract local fields from NDNLPv2 packet and tag onto a network layer packet
+ * @brief Extract local fields from NDNLPv2 packet and tag onto a network layer packet.
  */
 template<typename NetPkt>
 static void
diff --git a/ndn-cxx/face.hpp b/ndn-cxx/face.hpp
index 45eaad2..0a16fea 100644
--- a/ndn-cxx/face.hpp
+++ b/ndn-cxx/face.hpp
@@ -221,7 +221,7 @@
 
 public: // consumer
   /**
-   * @brief Express Interest
+   * @brief Express an Interest.
    * @param interest the Interest; a copy will be made, so that the caller is not
    *                 required to maintain the argument unchanged
    * @param afterSatisfied function to be invoked if Data is returned
@@ -238,13 +238,13 @@
                   const TimeoutCallback& afterTimeout);
 
   /**
-   * @brief Cancel all previously expressed Interests
+   * @brief Cancel all previously expressed Interests.
    */
   void
   removeAllPendingInterests();
 
   /**
-   * @brief Get number of pending Interests
+   * @brief Get number of pending Interests.
    */
   size_t
   getNPendingInterests() const;
@@ -252,7 +252,7 @@
 public: // producer
   /**
    * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
+   * callback and register the filtered prefix with the connected NDN forwarder.
    *
    * This version of setInterestFilter combines setInterestFilter and registerPrefix
    * operations and is intended to be used when only one filter for the same prefix needed
@@ -277,7 +277,7 @@
 
   /**
    * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
+   * callback and register the filtered prefix with the connected NDN forwarder.
    *
    * This version of setInterestFilter combines setInterestFilter and registerPrefix
    * operations and is intended to be used when only one filter for the same prefix needed
@@ -318,7 +318,7 @@
   setInterestFilter(const InterestFilter& filter, const InterestCallback& onInterest);
 
   /**
-   * @brief Register prefix with the connected NDN forwarder
+   * @brief Register prefix with the connected NDN forwarder.
    *
    * This method only modifies forwarder's RIB and does not associate any
    * onInterest callbacks.  Use setInterestFilter method to dispatch incoming Interests to
@@ -342,7 +342,7 @@
                  uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
 
   /**
-   * @brief Publish data packet
+   * @brief Publish a Data packet.
    * @param data the Data; a copy will be made, so that the caller is not required to
    *             maintain the argument unchanged
    *
@@ -355,7 +355,7 @@
   put(Data data);
 
   /**
-   * @brief Send a network NACK
+   * @brief Send a %Network Nack.
    * @param nack the Nack; a copy will be made, so that the caller is not required to
    *             maintain the argument unchanged
    * @throw OversizedPacketError encoded Nack size exceeds MAX_NDN_PACKET_SIZE
diff --git a/ndn-cxx/impl/face-impl.hpp b/ndn-cxx/impl/face-impl.hpp
index d2e2ae8..1f28ca7 100644
--- a/ndn-cxx/impl/face-impl.hpp
+++ b/ndn-cxx/impl/face-impl.hpp
@@ -53,7 +53,7 @@
 
 namespace ndn {
 
-/** @brief implementation detail of Face
+/** @brief Implementation detail of Face.
  */
 class Face::Impl : public std::enable_shared_from_this<Face::Impl>
 {
@@ -123,7 +123,8 @@
     m_pendingInterestTable.clear();
   }
 
-  /** @return whether the Data should be sent to the forwarder, if it does not come from the forwarder
+  /**
+   * @return Whether the Data should be sent to the forwarder, if it does not come from the forwarder.
    */
   bool
   satisfyPendingInterests(const Data& data)
@@ -150,7 +151,8 @@
     return hasForwarderMatch || !hasAppMatch;
   }
 
-  /** @return a Nack to be sent to the forwarder, or nullopt if no Nack should be sent
+  /**
+   * @return A Nack to be sent to the forwarder, or nullopt if no Nack should be sent.
    */
   optional<lp::Nack>
   nackPendingInterests(const lp::Nack& nack)
@@ -321,7 +323,7 @@
   }
 
 private:
-  /** @brief Finish packet encoding
+  /** @brief Finish packet encoding.
    *  @param lpPacket NDNLP packet without FragmentField
    *  @param wire wire encoding of Interest or Data
    *  @param pktType packet type, 'I' for Interest, 'D' for Data, 'N' for Nack
diff --git a/ndn-cxx/impl/interest-filter-record.hpp b/ndn-cxx/impl/interest-filter-record.hpp
index 6472b3d..e3989c1 100644
--- a/ndn-cxx/impl/interest-filter-record.hpp
+++ b/ndn-cxx/impl/interest-filter-record.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -34,7 +34,7 @@
 {
 public:
   /**
-   * @brief Construct an Interest filter record
+   * @brief Constructor.
    *
    * @param filter an InterestFilter that represents what Interest should invoke the callback
    * @param callback invoked when matching Interest is received
@@ -52,7 +52,7 @@
   }
 
   /**
-   * @brief Check if Interest name matches the filter
+   * @brief Check if Interest name matches the filter.
    * @param name Interest Name
    */
   bool
@@ -63,7 +63,7 @@
   }
 
   /**
-   * @brief invokes the InterestCallback
+   * @brief Invokes the InterestCallback.
    * @note This method does nothing if the Interest callback is empty
    */
   void
diff --git a/ndn-cxx/impl/name-component-types.hpp b/ndn-cxx/impl/name-component-types.hpp
index e1edd0e..8f88a97 100644
--- a/ndn-cxx/impl/name-component-types.hpp
+++ b/ndn-cxx/impl/name-component-types.hpp
@@ -76,8 +76,8 @@
    *  in the form of `<prefix>=<value>`, in addition to the plain `<type-number>=<escaped-value>`
    *  syntax.
    *
-   *  \return the `<prefix>` portion of the alternate URI representation.
-   *  \retval nullptr this component does not have an alternate URI representation.
+   *  \return The `<prefix>` portion of the alternate URI representation.
+   *  \retval nullptr This component does not have an alternate URI representation.
    */
   virtual const char*
   getAltUriPrefix() const
@@ -111,7 +111,7 @@
 protected:
   /**
    * \brief Calculate the successor of \p comp, extending TLV-LENGTH if value overflows.
-   * \return whether TLV-LENGTH was extended, and the successor
+   * \return Whether TLV-LENGTH was extended, and the successor.
    */
   static std::tuple<bool, Block>
   getSuccessorImpl(const Component& comp)
diff --git a/ndn-cxx/impl/pending-interest.hpp b/ndn-cxx/impl/pending-interest.hpp
index 5e1340b..1f88fdb 100644
--- a/ndn-cxx/impl/pending-interest.hpp
+++ b/ndn-cxx/impl/pending-interest.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -40,14 +40,14 @@
   FORWARDER ///< Interest was received from the forwarder via Transport
 };
 
-std::ostream&
+inline std::ostream&
 operator<<(std::ostream& os, PendingInterestOrigin origin)
 {
   switch (origin) {
-    case PendingInterestOrigin::APP:
-      return os << "app";
-    case PendingInterestOrigin::FORWARDER:
-      return os << "forwarder";
+  case PendingInterestOrigin::APP:
+    return os << "app";
+  case PendingInterestOrigin::FORWARDER:
+    return os << "forwarder";
   }
   NDN_CXX_UNREACHABLE;
 }
@@ -77,7 +77,7 @@
   }
 
   /**
-   * @brief Construct a pending Interest record for an Interest from the forwarder
+   * @brief Construct a pending Interest record for an Interest from the forwarder.
    */
   PendingInterest(shared_ptr<const Interest> interest, Scheduler& scheduler)
     : m_interest(std::move(interest))
@@ -99,7 +99,7 @@
   }
 
   /**
-   * @brief Record that the Interest has been forwarded to one destination
+   * @brief Record that the Interest has been forwarded to one destination.
    *
    * A "destination" could be either a local InterestFilter or the forwarder.
    */
@@ -110,9 +110,9 @@
   }
 
   /**
-   * @brief Record an incoming Nack against a forwarded Interest
-   * @return least severe Nack if all destinations where the Interest was forwarded have Nacked;
-   *         otherwise, nullopt
+   * @brief Record an incoming Nack against a forwarded Interest.
+   * @return Least severe Nack if all destinations where the Interest was forwarded have Nacked;
+   *         otherwise, @c nullopt.
    */
   optional<lp::Nack>
   recordNack(const lp::Nack& nack)
diff --git a/ndn-cxx/ims/in-memory-storage.hpp b/ndn-cxx/ims/in-memory-storage.hpp
index 8fa603e..0855e61 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-2021 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -36,7 +36,7 @@
 
 namespace ndn {
 
-/** @brief Represents in-memory storage
+/** @brief Represents in-memory storage.
  */
 class InMemoryStorage : noncopyable
 {
@@ -59,7 +59,7 @@
     >
   > Cache;
 
-  /** @brief Represents a self-defined const_iterator for the in-memory storage
+  /** @brief Represents a self-defined const_iterator for the in-memory storage.
    *
    *  @note Don't try to instantiate this class directly, use InMemoryStorage::begin() instead.
    */
@@ -100,7 +100,7 @@
   };
 
   /** @brief Represents an error might be thrown during reduce the current capacity of the
-   *  in-memory storage through function setCapacity(size_t nMaxPackets).
+   *         in-memory storage through function setCapacity(size_t nMaxPackets).
    */
   class Error : public std::runtime_error
   {
@@ -111,13 +111,15 @@
     }
   };
 
-  /** @brief Create a InMemoryStorage with up to @p limit entries
+  /** @brief Create a InMemoryStorage with up to @p limit entries.
+   *
    *  The InMemoryStorage created through this method will ignore MustBeFresh in interest processing
    */
   explicit
   InMemoryStorage(size_t limit = std::numeric_limits<size_t>::max());
 
-  /** @brief Create a InMemoryStorage with up to @p limit entries
+  /** @brief Create a InMemoryStorage with up to @p limit entries.
+   *
    *  The InMemoryStorage created through this method will handle MustBeFresh in interest processing
    */
   explicit
@@ -125,12 +127,12 @@
                   size_t limit = std::numeric_limits<size_t>::max());
 
   /** @note Please make sure to implement it to free m_freeEntries and evict
-    * all items in the derived class for anybody who wishes to inherit this class
-    */
+   *        all items in the derived class for anybody who wishes to inherit this class.
+   */
   virtual
   ~InMemoryStorage();
 
-  /** @brief Inserts a Data packet
+  /** @brief Inserts a Data packet.
    *
    *  @param data the packet to insert, must be signed and have wire encoding
    *  @param mustBeFreshProcessingWindow Beyond this time period after the data is inserted, the
@@ -145,7 +147,7 @@
   void
   insert(const Data& data, const time::milliseconds& mustBeFreshProcessingWindow = INFINITE_WINDOW);
 
-  /** @brief Finds the best match Data for an Interest
+  /** @brief Finds the best match Data for an Interest.
    *
    *  @note It will invoke afterAccess(shared_ptr<InMemoryStorageEntry>).
    *  As currently it is impossible to determine whether a Name contains implicit digest or not,
@@ -153,13 +155,12 @@
    *  including implicit digest) whose name is not the full name of the data matching the
    *  implicit digest.
    *
-   *  @return{ the best match, if any; otherwise a null shared_ptr }
+   *  @return the best match, if any; otherwise a null shared_ptr
    */
   shared_ptr<const Data>
   find(const Interest& interest);
 
-  /** @brief Finds the best match Data for a Name with or without
-   *  the implicit digest.
+  /** @brief Finds the best match Data for a Name with or without implicit digest.
    *
    *  If packets with the same name but different digests exist
    *  and the Name supplied is the one without implicit digest, a packet
@@ -167,12 +168,13 @@
    *
    *  @note It will invoke afterAccess(shared_ptr<InMemoryStorageEntry>).
    *
-   *  @return{ the one matched the Name; otherwise a null shared_ptr }
+   *  @return the one matched the Name; otherwise a null shared_ptr
    */
   shared_ptr<const Data>
   find(const Name& name);
 
   /** @brief Deletes in-memory storage entry by prefix by default.
+   *
    *  @param prefix Exact name of a prefix of the data to remove
    *  @param isPrefix If false, the function will only delete the
    *  entry completely matched with the prefix according to canonical ordering.
@@ -185,7 +187,7 @@
   void
   erase(const Name& prefix, const bool isPrefix = true);
 
-  /** @return{ maximum number of packets that can be allowed to store in in-memory storage }
+  /** @return Maximum number of packets that can be allowed to store in in-memory storage.
    */
   size_t
   getLimit() const
@@ -193,7 +195,7 @@
     return m_limit;
   }
 
-  /** @return{ number of packets stored in in-memory storage }
+  /** @return Number of packets stored in in-memory storage.
    */
   size_t
   size() const
@@ -201,18 +203,16 @@
     return m_nPackets;
   }
 
-  /** @brief Returns begin iterator of the in-memory storage ordering by
-   *  name with digest
+  /** @brief Returns begin iterator of the in-memory storage ordering by name with digest.
    *
-   *  @return{ const_iterator pointing to the beginning of the m_cache }
+   *  @return const_iterator pointing to the beginning of the m_cache
    */
   InMemoryStorage::const_iterator
   begin() const;
 
-  /** @brief Returns end iterator of the in-memory storage ordering by
-   *  name with digest
+  /** @brief Returns end iterator of the in-memory storage ordering by name with digest.
    *
-   *  @return{ const_iterator pointing to the end of the m_cache }
+   *  @return const_iterator pointing to the end of the m_cache
    */
   InMemoryStorage::const_iterator
   end() const;
@@ -249,13 +249,13 @@
   evictItem() = 0;
 
 NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
-  /** @brief sets current capacity of in-memory storage (in packets)
+  /** @brief Sets current capacity of in-memory storage (in packets).
    */
   void
   setCapacity(size_t nMaxPackets);
 
-  /** @brief returns current capacity of in-memory storage (in packets)
-   *  @return{ number of packets that can be stored in application cache }
+  /** @brief Returns current capacity of in-memory storage (in packets).
+   *  @return number of packets that can be stored in application cache
    */
   size_t
   getCapacity() const
@@ -263,7 +263,7 @@
     return m_capacity;
   }
 
-  /** @brief returns true if the in-memory storage uses up the current capacity, false otherwise
+  /** @brief Returns true if the in-memory storage uses up the current capacity, false otherwise.
    */
   bool
   isFull() const
@@ -271,7 +271,7 @@
     return size() >= m_capacity;
   }
 
-  /** @brief deletes in-memory storage entries by the Name with implicit digest.
+  /** @brief Deletes in-memory storage entries by the Name with implicit digest.
    *
    *  This is the function one should use to erase entry in the cache
    *  in derived class.
@@ -280,19 +280,20 @@
   void
   eraseImpl(const Name& name);
 
-  /** @brief Prints contents of the in-memory storage
+  /** @brief Prints contents of the in-memory storage.
    */
   void
   printCache(std::ostream& os) const;
 
 NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE:
-  /** @brief free in-memory storage entries by an iterator pointing to that entry.
-      @return An iterator pointing to the element that followed the last element erased.
+  /** @brief Free in-memory storage entries by an iterator pointing to that entry.
+   *  @return An iterator pointing to the element that followed the last element erased.
    */
   Cache::iterator
   freeEntry(Cache::iterator it);
 
   /** @brief Implements child selector (leftmost, rightmost, undeclared).
+   *
    *  Operates on the first layer of a skip list.
    *
    *  startingPoint must be less than Interest Name.
@@ -304,13 +305,14 @@
    *  other selectors. When childSelector = rightmost, it goes till the end, and returns application
    *  cache entry that satisfies other selectors. Returned application cache entry is the leftmost
    *  child of the rightmost child.
-   *  @return{ the best match, if any; otherwise 0 }
+   *
+   *  @return the best match, if any; otherwise 0
    */
   InMemoryStorageEntry*
   selectChild(const Interest& interest,
               Cache::index<byFullName>::type::iterator startingPoint) const;
 
-  /** @brief Get the next iterator (include startingPoint) that satisfies MustBeFresh requirement
+  /** @brief Get the next iterator (include startingPoint) that satisfies MustBeFresh requirement.
    *
    *  @param startingPoint The iterator to start with.
    *  @return The next qualified iterator
diff --git a/ndn-cxx/interest-filter.hpp b/ndn-cxx/interest-filter.hpp
index deee5f4..ac4600d 100644
--- a/ndn-cxx/interest-filter.hpp
+++ b/ndn-cxx/interest-filter.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,8 +29,9 @@
 class RegexPatternListMatcher;
 
 /**
- * @brief declares the set of Interests a producer can serve,
- *        which starts with a name prefix, plus an optional regular expression
+ * @brief Declares the set of Interests a producer can serve.
+ *
+ * A filter starts with a name prefix, followed by an optional NDN regular expression.
  */
 class InterestFilter
 {
@@ -42,7 +43,7 @@
   };
 
   /**
-   * @brief Construct an InterestFilter to match Interests by prefix
+   * @brief Construct an InterestFilter to match Interests by prefix.
    *
    * This filter matches Interests whose name start with the given prefix.
    *
@@ -51,7 +52,7 @@
   InterestFilter(const Name& prefix);
 
   /**
-   * @brief Construct an InterestFilter to match Interests by prefix
+   * @brief Construct an InterestFilter to match Interests by prefix.
    *
    * This filter matches Interests whose name start with the given prefix.
    *
@@ -61,7 +62,7 @@
   InterestFilter(const char* prefixUri);
 
   /**
-   * @brief Construct an InterestFilter to match Interests by prefix
+   * @brief Construct an InterestFilter to match Interests by prefix.
    *
    * This filter matches Interests whose name start with the given prefix.
    *
@@ -71,7 +72,7 @@
   InterestFilter(const std::string& prefixUri);
 
   /**
-   * @brief Construct an InterestFilter to match Interests by prefix and regular expression
+   * @brief Construct an InterestFilter to match Interests by prefix and regular expression.
    *
    * This filter matches Interests whose name start with the given prefix and
    * the remaining components match the given regular expression.
@@ -91,14 +92,14 @@
   InterestFilter(const Name& prefix, const std::string& regexFilter);
 
   /**
-   * @brief Implicit conversion to Name
+   * @brief Implicit conversion to Name.
    * @note This allows InterestCallback to be declared with `Name` rather than `InterestFilter`,
    *       but this does not work if InterestFilter has regular expression.
    */
   operator const Name&() const;
 
   /**
-   * @brief Check if specified Interest name matches the filter
+   * @brief Check if specified Interest name matches the filter.
    */
   bool
   doesMatch(const Name& name) const;
@@ -121,7 +122,7 @@
     return *m_regexFilter;
   }
 
-  /** \brief Get whether Interest loopback is allowed
+  /** \brief Get whether Interest loopback is allowed.
    */
   NDN_CXX_NODISCARD bool
   allowsLoopback() const
@@ -129,7 +130,7 @@
     return m_allowsLoopback;
   }
 
-  /** \brief Set whether Interest loopback is allowed
+  /** \brief Set whether Interest loopback is allowed.
    *  \param wantLoopback if true, this InterestFilter may receive Interests that are expressed
    *                      locally on the same \p ndn::Face ; if false, this InterestFilter can only
    *                      receive Interests received from the forwarder. The default is true.
diff --git a/ndn-cxx/interest.hpp b/ndn-cxx/interest.hpp
index 16a5006..1d438ca 100644
--- a/ndn-cxx/interest.hpp
+++ b/ndn-cxx/interest.hpp
@@ -37,13 +37,14 @@
 
 class Data;
 
-/** @var const unspecified_duration_type DEFAULT_INTEREST_LIFETIME;
- *  @brief default value for InterestLifetime
+/**
+ * @brief Default value of `InterestLifetime`.
  */
 const time::milliseconds DEFAULT_INTEREST_LIFETIME = 4_s;
 
-/** @brief Represents an %Interest packet.
- *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/interest.html
+/**
+ * @brief Represents an %Interest packet.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/interest.html
  */
 class Interest : public PacketBase, public std::enable_shared_from_this<Interest>
 {
@@ -174,13 +175,15 @@
     return m_name;
   }
 
-  /** @brief Set the Interest's name.
-   *  @throw std::invalid_argument @p name is invalid
+  /**
+   * @brief Set the %Interest's name.
+   * @throw std::invalid_argument @p name is invalid
    */
   Interest&
   setName(const Name& name);
 
-  /** @brief Check whether the CanBePrefix element is present.
+  /**
+   * @brief Check whether the `CanBePrefix` element is present.
    */
   bool
   getCanBePrefix() const noexcept
@@ -188,8 +191,9 @@
     return m_canBePrefix;
   }
 
-  /** @brief Add or remove CanBePrefix element.
-   *  @param canBePrefix whether CanBePrefix element should be present.
+  /**
+   * @brief Add or remove `CanBePrefix` element.
+   * @param canBePrefix Whether the element should be present.
    */
   Interest&
   setCanBePrefix(bool canBePrefix)
@@ -199,7 +203,8 @@
     return *this;
   }
 
-  /** @brief Check whether the MustBeFresh element is present.
+  /**
+   * @brief Check whether the `MustBeFresh` element is present.
    */
   bool
   getMustBeFresh() const noexcept
@@ -207,8 +212,9 @@
     return m_mustBeFresh;
   }
 
-  /** @brief Add or remove MustBeFresh element.
-   *  @param mustBeFresh whether MustBeFresh element should be present.
+  /**
+   * @brief Add or remove `MustBeFresh` element.
+   * @param mustBeFresh Whether the element should be present.
    */
   Interest&
   setMustBeFresh(bool mustBeFresh)
@@ -227,7 +233,8 @@
   Interest&
   setForwardingHint(std::vector<Name> value);
 
-  /** @brief Check if the Nonce element is present.
+  /**
+   * @brief Check if the `Nonce` element is present.
    */
   bool
   hasNonce() const noexcept
@@ -235,55 +242,66 @@
     return m_nonce.has_value();
   }
 
-  /** @brief Get nonce value.
+  /**
+   * @brief Get nonce value.
    *
-   *  If nonce was not present, it is added and assigned a random value.
+   * If nonce was not present, it is added and assigned a random value.
    */
   Nonce
   getNonce() const;
 
-  /** @brief Set the Interest's nonce.
+  /**
+   * @brief Set the %Interest's nonce.
    *
-   *  Use `setNonce(nullopt)` to remove any nonce from the Interest.
+   * Use `setNonce(nullopt)` to remove any nonce from the Interest.
    */
   Interest&
   setNonce(optional<Nonce> nonce);
 
-  /** @brief Change nonce value.
+  /**
+   * @brief Change nonce value.
    *
-   *  If the Nonce element is present, the new nonce value will differ from the old value.
-   *  If the Nonce element is not present, this method does nothing.
+   * If the `Nonce` element is present, the new nonce value will differ from the old value.
+   * If the `Nonce` element is not present, this method does nothing.
    */
   void
   refreshNonce();
 
+  /**
+   * @brief Get the %Interest's lifetime.
+   */
   time::milliseconds
   getInterestLifetime() const noexcept
   {
     return m_interestLifetime;
   }
 
-  /** @brief Set the Interest's lifetime.
-   *  @throw std::invalid_argument @p lifetime is negative
+  /**
+   * @brief Set the %Interest's lifetime.
+   * @throw std::invalid_argument @p lifetime is negative
    */
   Interest&
   setInterestLifetime(time::milliseconds lifetime);
 
+  /**
+   * @brief Get the %Interest's hop limit.
+   */
   optional<uint8_t>
   getHopLimit() const noexcept
   {
     return m_hopLimit;
   }
 
-  /** @brief Set the Interest's hop limit.
+  /**
+   * @brief Set the %Interest's hop limit.
    *
-   *  Use `setHopLimit(nullopt)` to remove any hop limit from the Interest.
+   * Use `setHopLimit(nullopt)` to remove any hop limit from the Interest.
    */
   Interest&
   setHopLimit(optional<uint8_t> hopLimit);
 
   /**
-   * @brief Return whether this Interest has any ApplicationParameters.
+   * @brief Return whether this Interest has any `ApplicationParameters` element.
    */
   bool
   hasApplicationParameters() const noexcept
@@ -292,7 +310,7 @@
   }
 
   /**
-   * @brief Get the ApplicationParameters.
+   * @brief Get the `ApplicationParameters` element.
    *
    * If the element is not present, an invalid Block will be returned.
    *
@@ -308,9 +326,9 @@
   }
 
   /**
-   * @brief Set ApplicationParameters from a Block.
+   * @brief Set `ApplicationParameters` from a Block.
    * @param block TLV block to be used as ApplicationParameters; must be valid
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    *
    * If the block's TLV-TYPE is tlv::ApplicationParameters, it will be used directly as
    * this Interest's ApplicationParameters element. Otherwise, the block will be nested
@@ -324,9 +342,9 @@
   setApplicationParameters(const Block& block);
 
   /**
-   * @brief Set ApplicationParameters by copying from a contiguous sequence of bytes.
+   * @brief Set `ApplicationParameters` by copying from a contiguous sequence of bytes.
    * @param value buffer from which the TLV-VALUE of the parameters will be copied
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    *
    * This function will also recompute the value of the ParametersSha256DigestComponent in the
    * Interest's name. If the name does not contain a ParametersSha256DigestComponent, one will
@@ -336,11 +354,11 @@
   setApplicationParameters(span<const uint8_t> value);
 
   /**
-   * @brief Set ApplicationParameters by copying from a raw buffer.
+   * @brief Set `ApplicationParameters` by copying from a raw buffer.
    * @param value points to a buffer from which the TLV-VALUE of the parameters will be copied;
    *              may be nullptr if @p length is zero
    * @param length size of the buffer
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    * @deprecated Use setApplicationParameters(span<const uint8_t>)
    *
    * This function will also recompute the value of the ParametersSha256DigestComponent in the
@@ -352,9 +370,9 @@
   setApplicationParameters(const uint8_t* value, size_t length);
 
   /**
-   * @brief Set ApplicationParameters from a shared buffer.
+   * @brief Set `ApplicationParameters` from a shared buffer.
    * @param value buffer containing the TLV-VALUE of the parameters; must not be nullptr
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    *
    * This function will also recompute the value of the ParametersSha256DigestComponent in the
    * Interest's name. If the name does not contain a ParametersSha256DigestComponent, one will
@@ -364,8 +382,8 @@
   setApplicationParameters(ConstBufferPtr value);
 
   /**
-   * @brief Remove the ApplicationParameters element from this Interest.
-   * @return a reference to this Interest
+   * @brief Remove the `ApplicationParameters` element from this Interest.
+   * @return A reference to this Interest.
    * @post hasApplicationParameters() == false
    *
    * This function will also remove any InterestSignatureInfo and InterestSignatureValue elements
@@ -374,26 +392,29 @@
   Interest&
   unsetApplicationParameters();
 
-  /** @brief Return whether the Interest is signed
-   *  @warning This function only determines whether signature information is present in the
-   *           Interest and does not verify that the signature is valid.
+  /**
+   * @brief Return whether the Interest is signed.
+   * @warning This function only determines whether signature information is present in the
+   *          Interest; it does not verify that the signature is valid.
    */
   bool
   isSigned() const noexcept;
 
-  /** @brief Get the InterestSignatureInfo
-   *  @retval nullopt InterestSignatureInfo is not present
+  /**
+   * @brief Get the `InterestSignatureInfo` element.
+   * @retval nullopt The element is not present.
    */
   optional<SignatureInfo>
   getSignatureInfo() const;
 
-  /** @brief Set the InterestSignatureInfo
+  /**
+   * @brief Set the `InterestSignatureInfo` element.
    */
   Interest&
   setSignatureInfo(const SignatureInfo& info);
 
   /**
-   * @brief Get the InterestSignatureValue element.
+   * @brief Get the `InterestSignatureValue` element.
    *
    * If the element is not present, an invalid Block will be returned.
    */
@@ -401,9 +422,9 @@
   getSignatureValue() const;
 
   /**
-   * @brief Set InterestSignatureValue by copying from a contiguous sequence of bytes.
+   * @brief Set `InterestSignatureValue` by copying from a contiguous sequence of bytes.
    * @param value buffer from which the TLV-VALUE of the InterestSignatureValue will be copied
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    * @throw Error InterestSignatureInfo is unset
    *
    * InterestSignatureInfo must be set before setting InterestSignatureValue.
@@ -412,9 +433,9 @@
   setSignatureValue(span<const uint8_t> value);
 
   /**
-   * @brief Set InterestSignatureValue from a shared buffer.
+   * @brief Set `InterestSignatureValue` from a shared buffer.
    * @param value buffer containing the TLV-VALUE of the InterestSignatureValue; must not be nullptr
-   * @return a reference to this Interest
+   * @return A reference to this Interest.
    * @throw Error InterestSignatureInfo is unset
    *
    * InterestSignatureInfo must be set before setting InterestSignatureValue.
diff --git a/ndn-cxx/key-locator.hpp b/ndn-cxx/key-locator.hpp
index 1643b5b..d12ac23 100644
--- a/ndn-cxx/key-locator.hpp
+++ b/ndn-cxx/key-locator.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -88,26 +88,26 @@
   KeyLocator&
   clear();
 
-  /** \brief Get nested Name element.
+  /** \brief Get nested `%Name` element.
    *  \throw Error if type is not tlv::Name
    */
   const Name&
   getName() const;
 
-  /** \brief Set nested Name element.
+  /** \brief Set nested `%Name` element.
    *  \post `getType() == tlv::Name`
    *  \return self
    */
   KeyLocator&
   setName(const Name& name);
 
-  /** \brief Get nested KeyDigest element.
+  /** \brief Get nested `KeyDigest` element.
    *  \throw Error if type is not tlv::KeyDigest
    */
   const Block&
   getKeyDigest() const;
 
-  /** \brief Set nested KeyDigest element (whole TLV).
+  /** \brief Set nested `KeyDigest` element (whole TLV).
    *  \post `getType() == tlv::KeyDigest`
    *  \throw std::invalid_argument Block type is not tlv::KeyDigest
    *  \return self
@@ -115,8 +115,8 @@
   KeyLocator&
   setKeyDigest(const Block& keyDigest);
 
-  /** \brief Set nested KeyDigest element value.
-   *  \param keyDigest buffer to use as TLV-VALUE of the nested KeyDigest element.
+  /** \brief Set nested `KeyDigest` element value.
+   *  \param keyDigest buffer to use as TLV-VALUE of the nested `KeyDigest` element.
    *  \post `getType() == tlv::KeyDigest`
    *  \return self
    */
diff --git a/ndn-cxx/link.hpp b/ndn-cxx/link.hpp
index b245530..6afac64 100644
--- a/ndn-cxx/link.hpp
+++ b/ndn-cxx/link.hpp
@@ -26,7 +26,9 @@
 
 namespace ndn {
 
-/** @brief represents a Link object
+/**
+ * @brief Represents a `%LinkObject` TLV element.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/link.html
  */
 class Link : public Data
 {
@@ -37,7 +39,7 @@
     using Data::Error::Error;
   };
 
-  /** @brief Create an empty Link object
+  /** @brief Create an empty Link object.
    *
    *  Note that in certain contexts that use Link::shared_from_this(), Link must be
    *  created using `make_shared`:
@@ -46,7 +48,7 @@
    */
   Link();
 
-  /** @brief Decode a Link object from a Block
+  /** @brief Decode a Link object from a Block.
    *  @param wire a TLV block
    *
    *  Note that in certain contexts that use Link::shared_from_this(), Link must be
@@ -57,7 +59,7 @@
   explicit
   Link(const Block& wire);
 
-  /** @brief Create a Link object with the given name and delegations
+  /** @brief Create a Link object with the given name and delegations.
    *  @param name A reference to the name of the redirected namespace
    *  @param delegations Delegations in payload
    *
@@ -69,13 +71,13 @@
   explicit
   Link(const Name& name, std::initializer_list<Name> delegations = {});
 
-  /** @brief Decode from the wire format
+  /** @brief Decode from the wire format.
    *  @param wire a TLV block
    */
   void
   wireDecode(const Block& wire);
 
-  /** @brief Get the delegations
+  /** @brief Get the delegations.
    */
   span<const Name>
   getDelegationList() const
@@ -83,20 +85,20 @@
     return m_delegations;
   }
 
-  /** @brief Set the delegations
+  /** @brief Set the delegations.
    *  @note This is more efficient than multiple addDelegation and removeDelegation invocations.
    */
   void
   setDelegationList(std::vector<Name> delegations);
 
-  /** @brief Append a delegation at the end
+  /** @brief Append a delegation at the end.
    *  @param name Delegation name
    *  @return true if delegation is added, false if same name already exists
    */
   bool
   addDelegation(const Name& name);
 
-  /** @brief Remove a delegation whose name is @p name
+  /** @brief Remove a delegation whose name is @p name.
    *  @param name Delegation name
    *  @return true if delegation is removed, otherwise false
    */
diff --git a/ndn-cxx/lp/cache-policy.hpp b/ndn-cxx/lp/cache-policy.hpp
index 4307ce1..1b2a436 100644
--- a/ndn-cxx/lp/cache-policy.hpp
+++ b/ndn-cxx/lp/cache-policy.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,7 +31,7 @@
 namespace lp {
 
 /**
- * \brief indicates the cache policy applied to a Data packet
+ * \brief Indicates the cache policy applied to a Data packet.
  */
 enum class CachePolicyType {
   NONE = 0,
@@ -42,7 +42,7 @@
 operator<<(std::ostream& os, CachePolicyType policy);
 
 /**
- * \brief represents a CachePolicy header field
+ * \brief Represents a CachePolicy header field.
  */
 class CachePolicy
 {
@@ -59,7 +59,7 @@
   CachePolicy(const Block& block);
 
   /**
-   * \brief prepend CachePolicy to encoder
+   * \brief Prepend CachePolicy to encoder.
    * \pre getPolicy() != CachePolicyType::NONE
    * \throw Error policy type is unset
    */
@@ -68,27 +68,27 @@
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
   /**
-   * \brief encode CachePolicy into wire format
+   * \brief Encode CachePolicy into wire format.
    */
   const Block&
   wireEncode() const;
 
   /**
-   * \brief get CachePolicyType from wire format
+   * \brief Get CachePolicyType from wire format.
    */
   void
   wireDecode(const Block& wire);
 
 public: // policy type
   /**
-   * \return policy type code
+   * \brief Get policy type code.
    * \retval CachePolicyType::NONE if policy type is unset or has an unknown code
    */
   CachePolicyType
   getPolicy() const;
 
   /**
-   * \brief set policy type code
+   * \brief Set policy type code.
    * \param policy a policy type code; CachePolicyType::NONE clears the policy
    */
   CachePolicy&
diff --git a/ndn-cxx/lp/empty-value.hpp b/ndn-cxx/lp/empty-value.hpp
index 9485ce2..2733d2d 100644
--- a/ndn-cxx/lp/empty-value.hpp
+++ b/ndn-cxx/lp/empty-value.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -28,7 +28,7 @@
 namespace lp {
 
 /**
- * \brief represents a zero-length TLV-VALUE
+ * \brief Represents a zero-length TLV-VALUE.
  */
 struct EmptyValue
 {
@@ -37,4 +37,4 @@
 } // namespace lp
 } // namespace ndn
 
-#endif // NDN_CXX_LP_TLV_EMPTY_VALUE_HPP
\ No newline at end of file
+#endif // NDN_CXX_LP_TLV_EMPTY_VALUE_HPP
diff --git a/ndn-cxx/lp/field.hpp b/ndn-cxx/lp/field.hpp
index 6ae7465..abe40a1 100644
--- a/ndn-cxx/lp/field.hpp
+++ b/ndn-cxx/lp/field.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2020 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 namespace lp {
 
 /**
- * \brief indicates where a field may occur
+ * \brief Indicates where a field may occur.
  */
 namespace field_location_tags {
 
@@ -39,14 +39,14 @@
 };
 
 /**
- * \brief a header field
+ * \brief A header field.
  */
 class Header : public Base
 {
 };
 
 /**
- * \brief the Fragment field
+ * \brief The Fragment field.
  */
 class Fragment : public Base
 {
@@ -55,7 +55,7 @@
 } // namespace field_location_tags
 
 /**
- * \brief concept check for fields
+ * \brief Concept check for fields.
  */
 template<class X>
 struct Field
diff --git a/ndn-cxx/lp/nack-header.hpp b/ndn-cxx/lp/nack-header.hpp
index 5e2525b..6284624 100644
--- a/ndn-cxx/lp/nack-header.hpp
+++ b/ndn-cxx/lp/nack-header.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -32,7 +32,7 @@
 namespace lp {
 
 /**
- * \brief indicates the reason type of a network NACK
+ * \brief Indicates the reason type of a %Network %Nack.
  */
 enum class NackReason {
   NONE = 0,
@@ -44,15 +44,16 @@
 std::ostream&
 operator<<(std::ostream& os, NackReason reason);
 
-/** \brief compare NackReason for severity
+/**
+ * \brief Compare NackReason according to severity.
  *
- *  lp::NackReason::NONE is treated as most severe
+ * NackReason::NONE is treated as most severe.
  */
 bool
 isLessSevere(lp::NackReason x, lp::NackReason y);
 
 /**
- * \brief represents a Network NACK header
+ * \brief Represents a %Network %Nack header.
  */
 class NackHeader
 {
@@ -74,14 +75,14 @@
 
 public: // reason
   /**
-   * \return reason code
+   * \brief Get reason code.
    * \retval NackReason::NONE if NackReason element does not exist or has an unknown code
    */
   NackReason
   getReason() const;
 
   /**
-   * \brief set reason code
+   * \brief Set reason code.
    * \param reason a reason code; NackReason::NONE clears the reason
    */
   NackHeader&
diff --git a/ndn-cxx/lp/nack.hpp b/ndn-cxx/lp/nack.hpp
index e08307d..e166971 100644
--- a/ndn-cxx/lp/nack.hpp
+++ b/ndn-cxx/lp/nack.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,9 +31,10 @@
 namespace ndn {
 namespace lp {
 
-/** \brief represents a Network Nack
+/**
+ * \brief Represents a %Network %Nack.
  *
- *  This type binds a NackHeader and an Interest, and is intended for use in network layer.
+ * This type binds a NackHeader and an Interest, and is intended for use in network layer.
  */
 class Nack : public PacketBase
 {
diff --git a/ndn-cxx/lp/packet.hpp b/ndn-cxx/lp/packet.hpp
index d3a9766..4febf54 100644
--- a/ndn-cxx/lp/packet.hpp
+++ b/ndn-cxx/lp/packet.hpp
@@ -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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -25,6 +25,9 @@
 #include "ndn-cxx/lp/fields.hpp"
 
 namespace ndn {
+/**
+ * @brief Contains classes and functions related to NDNLPv2.
+ */
 namespace lp {
 
 class Packet
@@ -42,13 +45,13 @@
   Packet(const Block& wire);
 
   /**
-   * \brief encode packet into wire format
+   * \brief Encode packet into wire format.
    */
   Block
   wireEncode() const;
 
   /**
-   * \brief decode packet from wire format
+   * \brief Decode packet from wire format.
    * \throws Error unknown TLV-TYPE
    */
   void
@@ -66,7 +69,7 @@
 
 public: // field access
   /**
-   * \return true if FIELD occurs one or more times
+   * \brief Returns true if \c FIELD occurs one or more times.
    * \details This is equivalent to count() > 0
    */
   template<typename FIELD>
@@ -77,7 +80,7 @@
   }
 
   /**
-   * \return number of occurrences of FIELD
+   * \brief Returns the number of occurrences of \c FIELD.
    */
   template<typename FIELD>
   NDN_CXX_NODISCARD size_t
@@ -88,8 +91,8 @@
   }
 
   /**
-   * \return value of index-th occurrence of FIELD
-   * \throw std::out_of_range if index>=count()
+   * \brief Returns the value of the index-th occurrence of \c FIELD.
+   * \throw std::out_of_range if index >= count()
    */
   template<typename FIELD>
   typename FIELD::ValueType
@@ -109,7 +112,7 @@
   }
 
   /**
-   * \return values of all occurrences of FIELD
+   * \brief Returns the values of all occurrences of \c FIELD.
    */
   template<typename FIELD>
   NDN_CXX_NODISCARD std::vector<typename FIELD::ValueType>
@@ -128,7 +131,7 @@
   }
 
   /**
-   * \brief remove all occurrences of FIELD, and add a FIELD with value
+   * \brief Remove all occurrences of \c FIELD, and add a \c FIELD with value.
    * \details This equivalent to clear() followed by add(value)
    */
   template<typename FIELD>
@@ -140,7 +143,7 @@
   }
 
   /**
-   * \brief add a FIELD with value
+   * \brief Add a \c FIELD with value.
    * \throw std::invalid_argument if field already exists and is not repeatable
    */
   template<typename FIELD>
@@ -165,7 +168,7 @@
   }
 
   /**
-   * \brief remove the index-th occurrence of FIELD
+   * \brief Remove the index-th occurrence of \c FIELD.
    * \throw std::out_of_range if index>=count()
    */
   template<typename FIELD>
@@ -187,7 +190,7 @@
   }
 
   /**
-   * \brief remove all occurrences of FIELD
+   * \brief Remove all occurrences of \c FIELD.
    */
   template<typename FIELD>
   Packet&
diff --git a/ndn-cxx/lp/pit-token.hpp b/ndn-cxx/lp/pit-token.hpp
index 413bf7c..9d0371d 100644
--- a/ndn-cxx/lp/pit-token.hpp
+++ b/ndn-cxx/lp/pit-token.hpp
@@ -28,7 +28,7 @@
 namespace ndn {
 namespace lp {
 
-/** \brief represent a PIT token field
+/** \brief Represent a PIT token field.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2#PIT-Token
  */
 class PitToken : public Buffer, public Tag
diff --git a/ndn-cxx/lp/prefix-announcement-header.hpp b/ndn-cxx/lp/prefix-announcement-header.hpp
index 89b59a6..a316ee4 100644
--- a/ndn-cxx/lp/prefix-announcement-header.hpp
+++ b/ndn-cxx/lp/prefix-announcement-header.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -27,7 +27,7 @@
 namespace ndn {
 namespace lp {
 
-/** \brief represents a PrefixAnnouncement header field in NDNLP
+/** \brief Represents a PrefixAnnouncement header field in NDNLP.
  */
 class PrefixAnnouncementHeader
 {
@@ -43,14 +43,14 @@
   explicit
   PrefixAnnouncementHeader(const Block& block);
 
-  /** \brief constructs PrefixAnnouncementHeader using PrefixAnnouncement
+  /** \brief Constructs PrefixAnnouncementHeader using PrefixAnnouncement.
    *
    *  \throw Error PrefixAnnouncement does not contain Data.
    */
   explicit
   PrefixAnnouncementHeader(PrefixAnnouncement prefixAnn);
 
-  /** \brief encodes the prefix announcement header to the wire format
+  /** \brief Encodes the prefix announcement header to the wire format.
    *
    *  \throw Error this instance does not contain a PrefixAnnouncement.
    */
diff --git a/ndn-cxx/lp/sequence.hpp b/ndn-cxx/lp/sequence.hpp
index f6b3184..b6dfddd 100644
--- a/ndn-cxx/lp/sequence.hpp
+++ b/ndn-cxx/lp/sequence.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,11 +30,11 @@
 namespace lp {
 
 /**
- * \brief represents a sequence number
+ * \brief Represents a sequence number.
  */
 typedef uint64_t Sequence;
 
 } // namespace lp
 } // namespace ndn
 
-#endif // NDN_CXX_LP_SEQUENCE_HPP
\ No newline at end of file
+#endif // NDN_CXX_LP_SEQUENCE_HPP
diff --git a/ndn-cxx/lp/tags.hpp b/ndn-cxx/lp/tags.hpp
index 9863700..b32bc60 100644
--- a/ndn-cxx/lp/tags.hpp
+++ b/ndn-cxx/lp/tags.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,47 +30,53 @@
 namespace ndn {
 namespace lp {
 
-/** \class IncomingFaceIdTag
- *  \brief a packet tag for IncomingFaceId field
+/**
+ * \class IncomingFaceIdTag
+ * \brief A packet tag for IncomingFaceId field.
  *
- *  This tag can be attached to Interest, Data, Nack.
+ * This tag can be attached to Interest, Data, Nack.
  */
-typedef SimpleTag<uint64_t, 10> IncomingFaceIdTag;
+using IncomingFaceIdTag = SimpleTag<uint64_t, 10>;
 
-/** \class NextHopFaceIdTag
- *  \brief a packet tag for NextHopFaceId field
+/**
+ * \class NextHopFaceIdTag
+ * \brief A packet tag for NextHopFaceId field.
  *
- *  This tag can be attached to Interest.
+ * This tag can be attached to Interest.
  */
-typedef SimpleTag<uint64_t, 11> NextHopFaceIdTag;
+using NextHopFaceIdTag = SimpleTag<uint64_t, 11>;
 
-/** \class CachePolicyTag
- *  \brief a packet tag for CachePolicy field
+/**
+ * \class CachePolicyTag
+ * \brief A packet tag for CachePolicy field.
  *
- *  This tag can be attached to Data.
+ * This tag can be attached to Data.
  */
-typedef SimpleTag<CachePolicy, 12> CachePolicyTag;
+using CachePolicyTag = SimpleTag<CachePolicy, 12>;
 
-/** \class CongestionMarkTag
- *  \brief a packet tag for CongestionMark field
+/**
+ * \class CongestionMarkTag
+ * \brief A packet tag for CongestionMark field.
  *
- *  This tag can be attached to Interest, Data, Nack.
+ * This tag can be attached to Interest, Data, Nack.
  */
-typedef SimpleTag<uint64_t, 13> CongestionMarkTag;
+using CongestionMarkTag = SimpleTag<uint64_t, 13>;
 
-/** \class NonDiscoveryTag
- *  \brief a packet tag for NonDiscovery field
+/**
+ * \class NonDiscoveryTag
+ * \brief A packet tag for NonDiscovery field.
  *
- *  This tag can be attached to Interest.
+ * This tag can be attached to Interest.
  */
-typedef SimpleTag<EmptyValue, 14> NonDiscoveryTag;
+using NonDiscoveryTag = SimpleTag<EmptyValue, 14>;
 
-/** \class PrefixAnnouncementTag
- *  \brief a packet tag for PrefixAnnouncement field
+/**
+ * \class PrefixAnnouncementTag
+ * \brief A packet tag for PrefixAnnouncement field.
  *
- *  This tag can be attached to Data.
+ * This tag can be attached to Data.
  */
-typedef SimpleTag<PrefixAnnouncementHeader, 15> PrefixAnnouncementTag;
+using PrefixAnnouncementTag = SimpleTag<PrefixAnnouncementHeader, 15>;
 
 } // namespace lp
 } // namespace ndn
diff --git a/ndn-cxx/lp/tlv.hpp b/ndn-cxx/lp/tlv.hpp
index b1db594..3678dbd 100644
--- a/ndn-cxx/lp/tlv.hpp
+++ b/ndn-cxx/lp/tlv.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -24,10 +24,13 @@
 
 namespace ndn {
 namespace lp {
+/**
+ * @brief Contains constants related to the NDNLPv2 packet format.
+ */
 namespace tlv {
 
 /**
- * \brief TLV-TYPE numbers for NDNLPv2
+ * \brief TLV-TYPE numbers for NDNLPv2.
  */
 enum {
   LpPacket = 100,
@@ -51,22 +54,22 @@
 
 enum {
   /**
-   * \brief lower bound of 1-octet header field
+   * \brief Lower bound of 1-octet header field.
    */
   HEADER1_MIN = 81,
 
   /**
-   * \brief upper bound of 1-octet header field
+   * \brief Upper bound of 1-octet header field.
    */
   HEADER1_MAX = 99,
 
   /**
-   * \brief lower bound of 3-octet header field
+   * \brief Lower bound of 3-octet header field.
    */
   HEADER3_MIN = 800,
 
   /**
-   * \brief upper bound of 3-octet header field
+   * \brief Upper bound of 3-octet header field.
    */
   HEADER3_MAX = 959
 };
diff --git a/ndn-cxx/meta-info.hpp b/ndn-cxx/meta-info.hpp
index a4155cd..0003c35 100644
--- a/ndn-cxx/meta-info.hpp
+++ b/ndn-cxx/meta-info.hpp
@@ -32,10 +32,13 @@
 
 namespace ndn {
 
-const time::milliseconds DEFAULT_FRESHNESS_PERIOD = time::milliseconds::zero();
+/**
+ * @brief Default value of `FreshnessPeriod`.
+ */
+const time::milliseconds DEFAULT_FRESHNESS_PERIOD{0};
 
 /**
- * @brief A MetaInfo holds the meta info which is signed inside the data packet.
+ * @brief A MetaInfo holds the meta info which is signed inside the Data packet.
  *
  * The class allows experimentation with application-defined meta-information elements.
  * When using these application-defined elements, be aware that it may result in dropped
@@ -67,7 +70,7 @@
   MetaInfo();
 
   /**
-   * @brief Create from wire encoding
+   * @brief Create from wire encoding.
    */
   explicit
   MetaInfo(const Block& block);
@@ -83,9 +86,9 @@
   wireDecode(const Block& wire);
 
 public: // getter/setter
-  /** @brief return ContentType
+  /** @brief Return the value of `ContentType`.
    *
-   *  If ContentType element is omitted, returns \c tlv::ContentType_Blob.
+   *  If the `ContentType` element is not present, returns tlv::ContentType_Blob.
    */
   uint32_t
   getType() const
@@ -93,15 +96,15 @@
     return m_type;
   }
 
-  /** @brief set ContentType
-   *  @param type a number defined in \c tlv::ContentTypeValue
+  /** @brief Set `ContentType`.
+   *  @param type a number defined in tlv::ContentTypeValue
    */
   MetaInfo&
   setType(uint32_t type);
 
-  /** @brief return FreshnessPeriod
+  /** @brief Return the value of `FreshnessPeriod`.
    *
-   *  If FreshnessPeriod element is omitted, returns \c DEFAULT_FRESHNESS_PERIOD.
+   *  If the `FreshnessPeriod` element is not present, returns #DEFAULT_FRESHNESS_PERIOD.
    */
   time::milliseconds
   getFreshnessPeriod() const
@@ -109,13 +112,13 @@
     return m_freshnessPeriod;
   }
 
-  /** @brief set FreshnessPeriod
+  /** @brief Set `FreshnessPeriod`.
    *  @throw std::invalid_argument specified FreshnessPeriod is negative
    */
   MetaInfo&
   setFreshnessPeriod(time::milliseconds freshnessPeriod);
 
-  /** @brief return FinalBlockId
+  /** @brief Return the value of `FinalBlockId`.
    */
   const optional<name::Component>&
   getFinalBlock() const
@@ -123,14 +126,14 @@
     return m_finalBlockId;
   }
 
-  /** @brief set FinalBlockId
+  /** @brief Set `FinalBlockId`.
    */
   MetaInfo&
   setFinalBlock(optional<name::Component> finalBlockId);
 
 public: // app-defined MetaInfo items
   /**
-   * @brief Get all app-defined MetaInfo items
+   * @brief Get all app-defined MetaInfo items.
    *
    * @note If MetaInfo is decoded from wire and setType, setFreshnessPeriod, or setFinalBlock
    *       is called before *AppMetaInfo, all app-defined blocks will be lost
@@ -139,7 +142,7 @@
   getAppMetaInfo() const;
 
   /**
-   * @brief Set app-defined MetaInfo items
+   * @brief Set app-defined MetaInfo items.
    *
    * This method will replace all existing app-defined MetaInfo items, if they existed.
    *
@@ -153,7 +156,7 @@
   setAppMetaInfo(const std::list<Block>& info);
 
   /**
-   * @brief Add an app-defined MetaInfo item
+   * @brief Add an app-defined MetaInfo item.
    *
    * @throw Error if @p block has type not in the application range
    *              (https://named-data.net/doc/NDN-packet-spec/0.3/types.html)
@@ -165,7 +168,7 @@
   addAppMetaInfo(const Block& block);
 
   /**
-   * @brief Remove a first app-defined MetaInfo item with type @p tlvType
+   * @brief Remove a first app-defined MetaInfo item with type @p tlvType.
    *
    * @return true if an item was deleted
    *
@@ -176,7 +179,7 @@
   removeAppMetaInfo(uint32_t tlvType);
 
   /**
-   * @brief Find a first app-defined MetaInfo item of type @p tlvType
+   * @brief Find a first app-defined MetaInfo item of type @p tlvType.
    *
    * @return NULL if an item is not found, otherwise const pointer to the item
    *
diff --git a/ndn-cxx/mgmt/control-parameters.hpp b/ndn-cxx/mgmt/control-parameters.hpp
index 8992571..382a7af 100644
--- a/ndn-cxx/mgmt/control-parameters.hpp
+++ b/ndn-cxx/mgmt/control-parameters.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -27,7 +27,8 @@
 namespace ndn {
 namespace mgmt {
 
-/** \brief base class for a struct that contains ControlCommand parameters
+/**
+ * \brief Base class for a struct that contains ControlCommand parameters.
  */
 class ControlParameters
 {
diff --git a/ndn-cxx/mgmt/dispatcher.hpp b/ndn-cxx/mgmt/dispatcher.hpp
index a382e65..d0c88ef 100644
--- a/ndn-cxx/mgmt/dispatcher.hpp
+++ b/ndn-cxx/mgmt/dispatcher.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -37,29 +37,29 @@
 
 // ---- AUTHORIZATION ----
 
-/** \brief a function to be called if authorization is successful
+/** \brief A function to be called if authorization is successful.
  *  \param requester a string that indicates the requester, whose semantics is determined by
  *                   the Authorization function; this value is intended for logging only,
  *                   and should not affect how the request is processed
  */
 typedef std::function<void(const std::string& requester)> AcceptContinuation;
 
-/** \brief indicate how to reply in case authorization is rejected
+/** \brief Indicate how to reply in case authorization is rejected.
  */
 enum class RejectReply {
-  /** \brief do not reply
+  /** \brief Do not reply.
    */
   SILENT,
-  /** \brief reply with a ControlResponse where StatusCode is 403
+  /** \brief Reply with a ControlResponse where StatusCode is 403.
    */
   STATUS403
 };
 
-/** \brief a function to be called if authorization is rejected
+/** \brief A function to be called if authorization is rejected.
  */
 typedef std::function<void(RejectReply reply)> RejectContinuation;
 
-/** \brief a function that performs authorization
+/** \brief A function that performs authorization.
  *  \param prefix top-level prefix, e.g., "/localhost/nfd";
  *                This argument can be inspected to allow Interests only under a subset of
  *                top-level prefixes (e.g., allow "/localhost/nfd" only),
@@ -76,25 +76,25 @@
                            const AcceptContinuation& accept,
                            const RejectContinuation& reject)> Authorization;
 
-/** \brief return an Authorization that accepts all Interests, with empty string as requester
+/** \brief Return an Authorization that accepts all Interests, with empty string as requester.
  */
 Authorization
 makeAcceptAllAuthorization();
 
 // ---- CONTROL COMMAND ----
 
-/** \brief a function to validate input ControlParameters
+/** \brief A function to validate input ControlParameters.
  *  \param params parsed ControlParameters;
  *                This is guaranteed to have correct type for the command.
  */
 typedef std::function<bool(const ControlParameters& params)> ValidateParameters;
 
-/** \brief a function to be called after ControlCommandHandler completes
+/** \brief A function to be called after ControlCommandHandler completes.
  *  \param resp the response to be sent to requester
  */
 typedef std::function<void(const ControlResponse& resp)> CommandContinuation;
 
-/** \brief a function to handle an authorized ControlCommand
+/** \brief A function to handle an authorized ControlCommand.
  *  \param prefix top-level prefix, e.g., "/localhost/nfd";
  *  \param interest incoming Interest
  *  \param params parsed ControlParameters;
@@ -107,7 +107,7 @@
 
 // ---- STATUS DATASET ----
 
-/** \brief a function to handle a StatusDataset request
+/** \brief A function to handle a StatusDataset request.
  *  \param prefix top-level prefix, e.g., "/localhost/nfd";
  *  \param interest incoming Interest; its Name doesn't contain version and segment components
  *
@@ -119,18 +119,18 @@
 
 //---- NOTIFICATION STREAM ----
 
-/** \brief a function to post a notification
+/** \brief A function to post a notification.
  */
 typedef std::function<void(const Block& notification)> PostNotification;
 
 // ---- DISPATCHER ----
 
-/** \brief represents a dispatcher on server side of NFD Management protocol
+/** \brief Implements a request dispatcher on server side of NFD Management protocol.
  */
 class Dispatcher : noncopyable
 {
 public:
-  /** \brief constructor
+  /** \brief Constructor.
    *  \param face the Face on which the dispatcher operates
    *  \param keyChain a KeyChain to sign Data
    *  \param signingInfo signing parameters to sign Data with \p keyChain
@@ -143,7 +143,7 @@
   virtual
   ~Dispatcher();
 
-  /** \brief add a top-level prefix
+  /** \brief Add a top-level prefix.
    *  \param prefix a top-level prefix, e.g., "/localhost/nfd"
    *  \param wantRegister whether prefix registration should be performed through the Face
    *  \param signingInfo signing parameters to sign the prefix registration command
@@ -166,7 +166,7 @@
   addTopPrefix(const Name& prefix, bool wantRegister = true,
                const security::SigningInfo& signingInfo = security::SigningInfo());
 
-  /** \brief remove a top-level prefix
+  /** \brief Remove a top-level prefix.
    *  \param prefix a top-level prefix, e.g., "/localhost/nfd"
    *
    *  Procedure for removing a top-level prefix:
@@ -178,7 +178,7 @@
   removeTopPrefix(const Name& prefix);
 
 public: // ControlCommand
-  /** \brief register a ControlCommand
+  /** \brief Register a ControlCommand.
    *  \tparam CP subclass of ControlParameters used by this command
    *  \param relPrefix a prefix for this command, e.g., "faces/create";
    *                   relPrefixes in ControlCommands, StatusDatasets, NotificationStreams must be
@@ -211,7 +211,7 @@
                     ControlCommandHandler handle);
 
 public: // StatusDataset
-  /** \brief register a StatusDataset or a prefix under which StatusDatasets can be requested
+  /** \brief Register a StatusDataset or a prefix under which StatusDatasets can be requested.
    *  \param relPrefix a prefix for this dataset, e.g., "faces/list";
    *                   relPrefixes in ControlCommands, StatusDatasets, NotificationStreams must be
    *                   non-overlapping (no relPrefix is a prefix of another relPrefix)
@@ -247,7 +247,7 @@
                    StatusDatasetHandler handle);
 
 public: // NotificationStream
-  /** \brief register a NotificationStream
+  /** \brief Register a NotificationStream.
    *  \param relPrefix a prefix for this notification stream, e.g., "faces/events";
    *                   relPrefixes in ControlCommands, StatusDatasets, NotificationStreams must be
    *                   non-overlapping (no relPrefix is a prefix of another relPrefix)
@@ -280,8 +280,8 @@
   using AuthorizationRejectedCallback = std::function<void(RejectReply, const Interest&)>;
 
   /**
-   * @brief the parser for extracting control parameters from a name component.
-   * @return a shared pointer to the extracted ControlParameters.
+   * @brief The parser for extracting control parameters from a name component.
+   * @return A shared pointer to the extracted ControlParameters.
    * @throw tlv::Error if the name component cannot be parsed as ControlParameters
    */
   using ControlParametersParser = std::function<shared_ptr<ControlParameters>(const name::Component&)>;
@@ -290,7 +290,7 @@
   isOverlappedWithOthers(const PartialName& relPrefix) const;
 
   /**
-   * @brief process unauthorized request
+   * @brief Process unauthorized request.
    * @param act action to reply
    * @param interest the incoming Interest
    */
@@ -298,7 +298,7 @@
   afterAuthorizationRejected(RejectReply act, const Interest& interest);
 
   /**
-   * @brief query Data the in-memory storage by a given Interest
+   * @brief Query Data the in-memory storage by a given Interest.
    *
    * if the query fails, invoke @p missContinuation to process @p interest.
    *
@@ -317,7 +317,7 @@
   };
 
   /**
-   * @brief send data to the face and/or in-memory storage
+   * @brief Send data to the face and/or in-memory storage.
    *
    * Create a Data packet with the given @p dataName, @p content, and @p metaInfo,
    * set its FreshnessPeriod to 1 second, and then send it out through the face
@@ -336,7 +336,7 @@
            SendDestination destination);
 
   /**
-   * @brief send out a data packt through the face
+   * @brief Send out a data packt through the face.
    *
    * @param data the data packet to insert
    */
@@ -344,7 +344,7 @@
   sendOnFace(const Data& data);
 
   /**
-   * @brief process the control-command Interest before authorization.
+   * @brief Process the control-command Interest before authorization.
    *
    * @param prefix the top-level prefix
    * @param relPrefix the relative prefix
@@ -364,7 +364,7 @@
                                 const AuthorizationRejectedCallback& rejected);
 
   /**
-   * @brief process the authorized control-command.
+   * @brief Process the authorized control-command.
    *
    * @param requester the requester
    * @param prefix the top-level prefix
@@ -385,7 +385,7 @@
   sendControlResponse(const ControlResponse& resp, const Interest& interest, bool isNack = false);
 
   /**
-   * @brief process the status-dataset Interest before authorization.
+   * @brief Process the status-dataset Interest before authorization.
    *
    * @param prefix the top-level prefix
    * @param interest the incoming Interest
@@ -401,7 +401,7 @@
                                const AuthorizationRejectedCallback& rejected);
 
   /**
-   * @brief process the authorized StatusDataset request
+   * @brief Process the authorized StatusDataset request.
    *
    * @param prefix the top-level prefix
    * @param interest the incoming Interest
@@ -413,7 +413,7 @@
                                          const StatusDatasetHandler& handler);
 
   /**
-   * @brief send a segment of StatusDataset
+   * @brief Send a segment of StatusDataset.
    *
    * @param dataName the name of this piece of data
    * @param content the content of this piece of data
diff --git a/ndn-cxx/mgmt/nfd/channel-status.hpp b/ndn-cxx/mgmt/nfd/channel-status.hpp
index 8c4d9b1..2373ef5 100644
--- a/ndn-cxx/mgmt/nfd/channel-status.hpp
+++ b/ndn-cxx/mgmt/nfd/channel-status.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,7 +29,7 @@
 
 /**
  * \ingroup management
- * \brief represents an item in NFD Channel dataset
+ * \brief Represents an item in NFD Channel dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Channel-Dataset
  */
 class ChannelStatus
diff --git a/ndn-cxx/mgmt/nfd/command-options.hpp b/ndn-cxx/mgmt/nfd/command-options.hpp
index 18afe62..5101294 100644
--- a/ndn-cxx/mgmt/nfd/command-options.hpp
+++ b/ndn-cxx/mgmt/nfd/command-options.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -28,28 +28,29 @@
 namespace nfd {
 
 /** \ingroup management
- *  \brief contains options for ControlCommand execution
+ *  \brief Contains options for ControlCommand execution.
  *  \note This type is intentionally copyable
  */
 class CommandOptions
 {
 public:
-  /** \brief constructs CommandOptions
+  /** \brief Constructs CommandOptions.
    *  \post getTimeout() == DEFAULT_TIMEOUT
    *  \post getPrefix() == DEFAULT_PREFIX
    *  \post getSigningInfo().getSignerType() == SIGNER_TYPE_NULL
    */
   CommandOptions();
 
-  /** \return command timeout
+  /**
+   * \brief Returns the command timeout.
    */
-  const time::milliseconds&
+  time::milliseconds
   getTimeout() const
   {
     return m_timeout;
   }
 
-  /** \brief sets command timeout
+  /** \brief Sets the command timeout.
    *  \param timeout the new command timeout, must be positive
    *  \throw std::out_of_range if timeout is non-positive
    *  \return self
@@ -57,7 +58,8 @@
   CommandOptions&
   setTimeout(const time::milliseconds& timeout);
 
-  /** \return command prefix
+  /**
+   * \brief Returns the command prefix.
    */
   const Name&
   getPrefix() const
@@ -65,13 +67,14 @@
     return m_prefix;
   }
 
-  /** \brief sets command prefix
+  /** \brief Sets the command prefix.
    *  \return self
    */
   CommandOptions&
   setPrefix(const Name& prefix);
 
-  /** \return signing parameters
+  /**
+   * \brief Returns the signing parameters.
    */
   const security::SigningInfo&
   getSigningInfo() const
@@ -79,19 +82,17 @@
     return m_signingInfo;
   }
 
-  /** \brief sets signing parameters
+  /** \brief Sets the signing parameters.
    *  \return self
    */
   CommandOptions&
   setSigningInfo(const security::SigningInfo& signingInfo);
 
 public:
-  /** \brief gives the default command timeout: 10000ms
-   */
+  /// The default command timeout: 10 seconds.
   static const time::milliseconds DEFAULT_TIMEOUT;
 
-  /** \brief gives the default command prefix: ndn:/localhost/nfd
-   */
+  /// The default command prefix: `/localhost/nfd`.
   static const Name DEFAULT_PREFIX;
 
 private:
diff --git a/ndn-cxx/mgmt/nfd/control-command.hpp b/ndn-cxx/mgmt/nfd/control-command.hpp
index 19d12ed..9aa5820 100644
--- a/ndn-cxx/mgmt/nfd/control-command.hpp
+++ b/ndn-cxx/mgmt/nfd/control-command.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,50 +29,46 @@
 
 /**
  * \ingroup management
- * \brief base class of NFD ControlCommand
+ * \brief Base class of NFD `%ControlCommand`.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/ControlCommand
  */
 class ControlCommand : noncopyable
 {
 public:
-  /** \brief represents an error in ControlParameters
+  /** \brief Represents an error in ControlParameters.
    */
   class ArgumentError : public std::invalid_argument
   {
   public:
-    explicit
-    ArgumentError(const std::string& what)
-      : std::invalid_argument(what)
-    {
-    }
+    using std::invalid_argument::invalid_argument;
   };
 
   virtual
   ~ControlCommand();
 
-  /** \brief validate request parameters
+  /** \brief Validate request parameters.
    *  \throw ArgumentError if parameters are invalid
    */
   virtual void
   validateRequest(const ControlParameters& parameters) const;
 
-  /** \brief apply default values to missing fields in request
+  /** \brief Apply default values to missing fields in request.
    */
   virtual void
   applyDefaultsToRequest(ControlParameters& parameters) const;
 
-  /** \brief validate response parameters
+  /** \brief Validate response parameters.
    *  \throw ArgumentError if parameters are invalid
    */
   virtual void
   validateResponse(const ControlParameters& parameters) const;
 
-  /** \brief apply default values to missing fields in response
+  /** \brief Apply default values to missing fields in response.
    */
   virtual void
   applyDefaultsToResponse(ControlParameters& parameters) const;
 
-  /** \brief construct the Name for a request Interest
+  /** \brief Construct the Name for a request Interest.
    *  \throw ArgumentError if parameters are invalid
    */
   Name
@@ -86,7 +82,7 @@
   public:
     FieldValidator();
 
-    /** \brief declare a required field
+    /** \brief Declare a required field.
      */
     FieldValidator&
     required(ControlParameterField field)
@@ -95,7 +91,7 @@
       return *this;
     }
 
-    /** \brief declare an optional field
+    /** \brief Declare an optional field.
      */
     FieldValidator&
     optional(ControlParameterField field)
@@ -104,8 +100,8 @@
       return *this;
     }
 
-    /** \brief verify that all required fields are present,
-     *         and all present fields are either required or optional
+    /** \brief Verify that all required fields are present,
+     *         and all present fields are either required or optional.
      *  \throw ArgumentError
      */
     void
@@ -117,12 +113,12 @@
   };
 
 protected:
-  /** \brief FieldValidator for request ControlParameters
+  /** \brief FieldValidator for request ControlParameters.
    *
    *  Constructor of subclass should populate this validator.
    */
   FieldValidator m_requestValidator;
-  /** \brief FieldValidator for response ControlParameters
+  /** \brief FieldValidator for response ControlParameters.
    *
    *  Constructor of subclass should populate this validator.
    */
@@ -136,7 +132,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/create command
+ * \brief Represents a `faces/create` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
  */
 class FaceCreateCommand : public ControlCommand
@@ -154,7 +150,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/update command
+ * \brief Represents a `faces/update` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-the-static-properties-of-a-face
  */
 class FaceUpdateCommand : public ControlCommand
@@ -176,7 +172,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/destroy command
+ * \brief Represents a `faces/destroy` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
  */
 class FaceDestroyCommand : public ControlCommand
@@ -194,7 +190,7 @@
 
 /**
  * \ingroup management
- * \brief represents a fib/add-nexthop command
+ * \brief Represents a `fib/add-nexthop` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
  */
 class FibAddNextHopCommand : public ControlCommand
@@ -212,7 +208,7 @@
 
 /**
  * \ingroup management
- * \brief represents a fib/remove-nexthop command
+ * \brief Represents a `fib/remove-nexthop` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
  */
 class FibRemoveNextHopCommand : public ControlCommand
@@ -230,7 +226,7 @@
 
 /**
  * \ingroup management
- * \brief represents a cs/config command
+ * \brief Represents a `cs/config` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-configuration
  */
 class CsConfigCommand : public ControlCommand
@@ -242,7 +238,7 @@
 
 /**
  * \ingroup management
- * \brief represents a cs/erase command
+ * \brief Represents a `cs/erase` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Erase-entries
  */
 class CsEraseCommand : public ControlCommand
@@ -260,7 +256,7 @@
 
 /**
  * \ingroup management
- * \brief represents a strategy-choice/set command
+ * \brief Represents a `strategy-choice/set` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
  */
 class StrategyChoiceSetCommand : public ControlCommand
@@ -272,7 +268,7 @@
 
 /**
  * \ingroup management
- * \brief represents a strategy-choice/set command
+ * \brief Represents a `strategy-choice/set` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
  */
 class StrategyChoiceUnsetCommand : public ControlCommand
@@ -290,7 +286,7 @@
 
 /**
  * \ingroup management
- * \brief represents a rib/register command
+ * \brief Represents a `rib/register` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
  */
 class RibRegisterCommand : public ControlCommand
@@ -308,7 +304,7 @@
 
 /**
  * \ingroup management
- * \brief represents a rib/unregister command
+ * \brief Represents a `rib/unregister` command.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
  */
 class RibUnregisterCommand : public ControlCommand
diff --git a/ndn-cxx/mgmt/nfd/control-parameters.hpp b/ndn-cxx/mgmt/nfd/control-parameters.hpp
index adf96f4..2d1a3ea 100644
--- a/ndn-cxx/mgmt/nfd/control-parameters.hpp
+++ b/ndn-cxx/mgmt/nfd/control-parameters.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -74,7 +74,7 @@
 
 /**
  * \ingroup management
- * \brief represents parameters in a ControlCommand request or response
+ * \brief Represents parameters in a ControlCommand request or response.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/ControlCommand#ControlParameters
  * \details This type is copyable because it's an abstraction of a TLV type.
  */
@@ -529,7 +529,7 @@
     return m_hasFields[CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD];
   }
 
-  /** \brief get default congestion threshold (measured in bytes)
+  /** \brief Get default congestion threshold (measured in bytes).
    */
   uint64_t
   getDefaultCongestionThreshold() const
@@ -538,7 +538,7 @@
     return m_defaultCongestionThreshold;
   }
 
-  /** \brief set default congestion threshold (measured in bytes)
+  /** \brief Set default congestion threshold (measured in bytes).
    */
   ControlParameters&
   setDefaultCongestionThreshold(uint64_t threshold)
@@ -563,7 +563,7 @@
     return m_hasFields[CONTROL_PARAMETER_MTU];
   }
 
-  /** \brief get MTU (measured in bytes)
+  /** \brief Get MTU (measured in bytes).
    *
    *  This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
    */
@@ -574,7 +574,7 @@
     return m_mtu;
   }
 
-  /** \brief set MTU (measured in bytes)
+  /** \brief Set MTU (measured in bytes).
    *
    *  This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
    */
@@ -617,7 +617,7 @@
   getFlagBit(size_t bit) const;
 
   /**
-   * \brief set a bit in Flags
+   * \brief Set a bit in Flags.
    * \param bit bit position within range [0, 64) (least significant bit is 0)
    * \param value new value in Flags
    * \param wantMask if true, enable the bit in Mask
@@ -626,7 +626,7 @@
   setFlagBit(size_t bit, bool value, bool wantMask = true);
 
   /**
-   * \brief disable a bit in Mask
+   * \brief Disable a bit in Mask.
    * \param bit bit position within range [0, 64) (least significant bit is 0)
    * \post If all bits are disabled, Flags and Mask fields are deleted.
    */
diff --git a/ndn-cxx/mgmt/nfd/controller.hpp b/ndn-cxx/mgmt/nfd/controller.hpp
index 0d4bb6a..3cb2c0d 100644
--- a/ndn-cxx/mgmt/nfd/controller.hpp
+++ b/ndn-cxx/mgmt/nfd/controller.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -40,38 +40,41 @@
 
 /**
  * \defgroup management Management
- * \brief Classes and data structures to manage NDN forwarder
+ * \brief Classes and data structures to manage NDN forwarder.
  */
 
 /**
  * \ingroup management
- * \brief NFD Management protocol client
+ * \brief NFD Management protocol client.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/Management
  */
 class Controller : noncopyable
 {
 public:
-  /** \brief a callback on command success
+  /**
+   * \brief Callback on command success.
    */
   using CommandSucceedCallback = function<void(const ControlParameters&)>;
 
-  /** \brief a callback on command failure
+  /**
+   * \brief Callback on command failure.
    */
   using CommandFailCallback = function<void(const ControlResponse&)>;
 
-  /** \brief a callback on dataset retrieval failure
+  /**
+   * \brief Callback on dataset retrieval failure.
    */
   using DatasetFailCallback = function<void(uint32_t code, const std::string& reason)>;
 
-  /** \brief construct a Controller that uses face for transport,
-   *         and uses the passed KeyChain to sign commands
+  /**
+   * \brief Construct a Controller that uses \p face as transport and \p keyChain to sign commands.
    */
   Controller(Face& face, KeyChain& keyChain,
              security::Validator& validator = security::getAcceptAllValidator());
 
   ~Controller();
 
-  /** \brief start command execution
+  /** \brief Start command execution.
    */
   template<typename Command>
   void
@@ -83,7 +86,7 @@
     startCommand(make_shared<Command>(), parameters, onSuccess, onFailure, options);
   }
 
-  /** \brief start dataset fetching
+  /** \brief Start dataset fetching.
    */
   template<typename Dataset>
   std::enable_if_t<std::is_default_constructible<Dataset>::value>
@@ -94,7 +97,7 @@
     fetchDataset(make_shared<Dataset>(), onSuccess, onFailure, options);
   }
 
-  /** \brief start dataset fetching
+  /** \brief Start dataset fetching.
    */
   template<typename Dataset, typename ParamType = typename Dataset::ParamType>
   void
@@ -150,24 +153,19 @@
   processDatasetFetchError(const DatasetFailCallback& onFailure, uint32_t code, std::string msg);
 
 public:
-  /** \brief error code for timeout
-   */
+  /// Error code for timeout.
   static const uint32_t ERROR_TIMEOUT;
 
-  /** \brief error code for network Nack
-   */
+  /// Error code for network %Nack.
   static const uint32_t ERROR_NACK;
 
-  /** \brief error code for response validation failure
-   */
+  /// Error code for response validation failure.
   static const uint32_t ERROR_VALIDATION;
 
-  /** \brief error code for server error
-   */
+  /// Error code for server error.
   static const uint32_t ERROR_SERVER;
 
-  /** \brief inclusive lower bound of error codes
-   */
+  /// Inclusive lower bound of error codes.
   static const uint32_t ERROR_LBOUND;
 
 protected:
diff --git a/ndn-cxx/mgmt/nfd/cs-info.hpp b/ndn-cxx/mgmt/nfd/cs-info.hpp
index 85dc615..095c86f 100644
--- a/ndn-cxx/mgmt/nfd/cs-info.hpp
+++ b/ndn-cxx/mgmt/nfd/cs-info.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,7 +31,7 @@
 namespace nfd {
 
 /** \ingroup management
- *  \brief represents the CS Information dataset
+ *  \brief Represents the CS Information dataset.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#CS-Information-Dataset
  */
 class CsInfo
@@ -58,7 +58,7 @@
   void
   wireDecode(const Block& wire);
 
-  /** \brief get CS capacity (in number of packets)
+  /** \brief Get CS capacity (in number of packets).
    */
   uint64_t
   getCapacity() const
@@ -69,7 +69,7 @@
   CsInfo&
   setCapacity(uint64_t capacity);
 
-  /** \brief get CS_ENABLE_ADMIT flag
+  /** \brief Get \c CS_ENABLE_ADMIT flag.
    */
   bool
   getEnableAdmit() const
@@ -80,7 +80,7 @@
   CsInfo&
   setEnableAdmit(bool enableAdmit);
 
-  /** \brief get CS_ENABLE_SERVE flag
+  /** \brief Get \c CS_ENABLE_SERVE flag.
    */
   bool
   getEnableServe() const
@@ -91,7 +91,7 @@
   CsInfo&
   setEnableServe(bool enableServe);
 
-  /** \brief get number of stored CS entries
+  /** \brief Get number of stored CS entries.
    */
   uint64_t
   getNEntries() const
@@ -102,7 +102,7 @@
   CsInfo&
   setNEntries(uint64_t nEntries);
 
-  /** \brief get number of CS lookup hits since NFD starts
+  /** \brief Get number of CS lookup hits since NFD started.
    */
   uint64_t
   getNHits() const
@@ -113,7 +113,7 @@
   CsInfo&
   setNHits(uint64_t nHits);
 
-  /** \brief get number of CS lookup misses since NFD starts
+  /** \brief Get number of CS lookup misses since NFD started.
    */
   uint64_t
   getNMisses() const
diff --git a/ndn-cxx/mgmt/nfd/face-event-notification.hpp b/ndn-cxx/mgmt/nfd/face-event-notification.hpp
index ea1fbdd..df6909b 100644
--- a/ndn-cxx/mgmt/nfd/face-event-notification.hpp
+++ b/ndn-cxx/mgmt/nfd/face-event-notification.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,7 +29,7 @@
 
 /**
  * \ingroup management
- * \brief represents a Face status change notification
+ * \brief Represents a Face status change notification.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Status-Change-Notification
  */
 class FaceEventNotification : public FaceTraits<FaceEventNotification>
@@ -40,18 +40,18 @@
   explicit
   FaceEventNotification(const Block& block);
 
-  /** \brief prepend FaceEventNotification to the encoder
+  /** \brief Prepend FaceEventNotification to the encoder.
    */
   template<encoding::Tag TAG>
   size_t
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
-  /** \brief encode FaceEventNotification
+  /** \brief Encode FaceEventNotification.
    */
   const Block&
   wireEncode() const;
 
-  /** \brief decode FaceEventNotification
+  /** \brief Decode FaceEventNotification.
    */
   void
   wireDecode(const Block& wire);
diff --git a/ndn-cxx/mgmt/nfd/face-query-filter.hpp b/ndn-cxx/mgmt/nfd/face-query-filter.hpp
index 4362acc..7bff9aa 100644
--- a/ndn-cxx/mgmt/nfd/face-query-filter.hpp
+++ b/ndn-cxx/mgmt/nfd/face-query-filter.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,7 +31,7 @@
 
 /**
  * \ingroup management
- * \brief represents Face Query Filter
+ * \brief Represents Face Query Filter.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
  */
 class FaceQueryFilter
@@ -48,23 +48,23 @@
   explicit
   FaceQueryFilter(const Block& block);
 
-  /** \brief prepend FaceQueryFilter to the encoder
+  /** \brief Prepend FaceQueryFilter to the encoder.
    */
   template<encoding::Tag TAG>
   size_t
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
-  /** \brief encode FaceQueryFilter
+  /** \brief Encode FaceQueryFilter.
    */
   const Block&
   wireEncode() const;
 
-  /** \brief decode FaceQueryFilter
+  /** \brief Decode FaceQueryFilter.
    */
   void
   wireDecode(const Block& wire);
 
-  /** \return whether the filter is empty
+  /** \return Whether the filter is empty.
    */
   bool
   empty() const;
diff --git a/ndn-cxx/mgmt/nfd/face-status.hpp b/ndn-cxx/mgmt/nfd/face-status.hpp
index 5419694..8d0e59c 100644
--- a/ndn-cxx/mgmt/nfd/face-status.hpp
+++ b/ndn-cxx/mgmt/nfd/face-status.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,7 +31,7 @@
 
 /**
  * \ingroup management
- * \brief represents an item in NFD Face dataset
+ * \brief Represents an item in NFD %Face dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset
  */
 class FaceStatus : public FaceTraits<FaceStatus>
@@ -42,18 +42,18 @@
   explicit
   FaceStatus(const Block& block);
 
-  /** \brief prepend FaceStatus to the encoder
+  /** \brief Prepend FaceStatus to the encoder.
    */
   template<encoding::Tag TAG>
   size_t
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
-  /** \brief encode FaceStatus
+  /** \brief Encode FaceStatus.
    */
   const Block&
   wireEncode() const;
 
-  /** \brief decode FaceStatus
+  /** \brief Decode FaceStatus.
    */
   void
   wireDecode(const Block& wire);
@@ -103,7 +103,7 @@
     return !!m_defaultCongestionThreshold;
   }
 
-  /** \brief get default congestion threshold (measured in bytes)
+  /** \brief Get default congestion threshold (measured in bytes).
    */
   uint64_t
   getDefaultCongestionThreshold() const
@@ -112,7 +112,7 @@
     return *m_defaultCongestionThreshold;
   }
 
-  /** \brief set default congestion threshold (measured in bytes)
+  /** \brief Set default congestion threshold (measured in bytes).
    */
   FaceStatus&
   setDefaultCongestionThreshold(uint64_t threshold);
@@ -126,7 +126,7 @@
     return !!m_mtu;
   }
 
-  /** \brief get MTU (measured in bytes)
+  /** \brief Get MTU (measured in bytes).
    *
    *  This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
    */
@@ -137,7 +137,7 @@
     return *m_mtu;
   }
 
-  /** \brief set MTU (measured in bytes)
+  /** \brief Set MTU (measured in bytes).
    *
    *  This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
    */
diff --git a/ndn-cxx/mgmt/nfd/face-traits.hpp b/ndn-cxx/mgmt/nfd/face-traits.hpp
index 67bf8c4..d497b4d 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-2021 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,8 +30,8 @@
 
 /**
  * \ingroup management
- * \brief provides getters and setters for face information fields
- * \tparam C the concrete subclass
+ * \brief Provides getters and setters for face information fields.
+ * \tparam C The concrete subclass
  */
 template<class C>
 class FaceTraits
diff --git a/ndn-cxx/mgmt/nfd/forwarder-status.hpp b/ndn-cxx/mgmt/nfd/forwarder-status.hpp
index d20a1ff..5733c1f 100644
--- a/ndn-cxx/mgmt/nfd/forwarder-status.hpp
+++ b/ndn-cxx/mgmt/nfd/forwarder-status.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 
 /**
  * \ingroup management
- * \brief represents NFD General Status dataset
+ * \brief Represents NFD General Status dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus#General-Status-Dataset
  */
 class ForwarderStatus
@@ -47,7 +47,7 @@
   explicit
   ForwarderStatus(const Block& payload);
 
-  /** \brief prepend ForwarderStatus as a Content block to the encoder
+  /** \brief Prepend ForwarderStatus as a Content block to the encoder.
    *
    *  The outermost Content element isn't part of ForwarderStatus structure.
    */
@@ -55,14 +55,14 @@
   size_t
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
-  /** \brief encode ForwarderStatus as a Content block
+  /** \brief Encode ForwarderStatus as a Content block.
    *
    *  The outermost Content element isn't part of ForwarderStatus structure.
    */
   const Block&
   wireEncode() const;
 
-  /** \brief decode ForwarderStatus from a Content block
+  /** \brief Decode ForwarderStatus from a Content block.
    *
    *  The outermost Content element isn't part of ForwarderStatus structure.
    */
diff --git a/ndn-cxx/mgmt/nfd/rib-entry.hpp b/ndn-cxx/mgmt/nfd/rib-entry.hpp
index 9cf673c..066bbab 100644
--- a/ndn-cxx/mgmt/nfd/rib-entry.hpp
+++ b/ndn-cxx/mgmt/nfd/rib-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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -32,7 +32,7 @@
 
 /**
  * \ingroup management
- * \brief represents a route in a RibEntry
+ * \brief Represents a route in a RibEntry.
  *
  * A route indicates the availability of content via a certain face and
  * provides meta-information about the face.
@@ -144,7 +144,7 @@
 
 /**
  * \ingroup management
- * \brief represents an item in NFD RIB dataset
+ * \brief Represents an item in NFD RIB dataset.
  *
  * A RIB entry contains one or more routes for a name prefix
  *
diff --git a/ndn-cxx/mgmt/nfd/route-flags-traits.hpp b/ndn-cxx/mgmt/nfd/route-flags-traits.hpp
index a23ab85..be7553e 100644
--- a/ndn-cxx/mgmt/nfd/route-flags-traits.hpp
+++ b/ndn-cxx/mgmt/nfd/route-flags-traits.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,7 +29,7 @@
 
 /**
  * \ingroup management
- * \brief defines getters for each route inheritance flag
+ * \brief Defines getters for each route inheritance flag.
  *
  * \tparam T class containing a RouteFlags field and implementing
  *           a `RouteFlags getFlags() const` member function
diff --git a/ndn-cxx/mgmt/nfd/status-dataset.cpp b/ndn-cxx/mgmt/nfd/status-dataset.cpp
index 005d1e5..54d638f 100644
--- a/ndn-cxx/mgmt/nfd/status-dataset.cpp
+++ b/ndn-cxx/mgmt/nfd/status-dataset.cpp
@@ -47,7 +47,7 @@
 }
 
 /**
- * \brief parses elements into a vector of T
+ * \brief Parses elements into a vector of T.
  * \tparam T element type
  * \param payload pointer to a buffer of zero or more blocks of decodable by T
  * \return a vector of T
diff --git a/ndn-cxx/mgmt/nfd/status-dataset.hpp b/ndn-cxx/mgmt/nfd/status-dataset.hpp
index d06950a..24ac0a8 100644
--- a/ndn-cxx/mgmt/nfd/status-dataset.hpp
+++ b/ndn-cxx/mgmt/nfd/status-dataset.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -37,7 +37,7 @@
 
 /**
  * \ingroup management
- * \brief base class of NFD StatusDataset
+ * \brief Base class of NFD `%StatusDataset`.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
  */
 class StatusDataset : noncopyable
@@ -48,29 +48,29 @@
 
 #ifdef DOXYGEN
   /**
-   * \brief if defined, specifies constructor argument type;
-   *        otherwise, constructor has no argument
+   * \brief If defined, specifies constructor argument type;
+   *        otherwise, the constructor has no arguments.
    */
   using ParamType = int;
 #endif
 
   /**
-   * \brief constructs a name prefix for the dataset
+   * \brief Constructs a name prefix for the dataset.
    * \param prefix top-level prefix, such as ndn:/localhost/nfd
-   * \return name prefix without version and segment components
+   * \return %Name prefix without version and segment components.
    */
   Name
   getDatasetPrefix(const Name& prefix) const;
 
 #ifdef DOXYGEN
   /**
-   * \brief provides the result type, usually a vector
+   * \brief Specifies the result type, usually a vector.
    */
   using ResultType = std::vector<int>;
 #endif
 
   /**
-   * \brief indicates reassembled payload cannot be parsed as ResultType
+   * \brief Indicates reassembled payload cannot be parsed as ResultType.
    */
   class ParseResultError : public tlv::Error
   {
@@ -80,7 +80,7 @@
 
 #ifdef DOXYGEN
   /**
-   * \brief parses a result from reassembled payload
+   * \brief Parses a result from reassembled payload.
    * \param payload reassembled payload
    * \throw tlv::Error cannot parse payload
    */
@@ -90,7 +90,7 @@
 
 protected:
   /**
-   * \brief constructs a StatusDataset instance with given sub-prefix
+   * \brief Constructs a StatusDataset instance with given sub-prefix.
    * \param datasetName dataset name after top-level prefix, such as faces/list
    */
   explicit
@@ -98,7 +98,7 @@
 
 private:
   /**
-   * \brief appends parameters to the dataset name prefix
+   * \brief Appends parameters to the dataset name prefix.
    * \param[in,out] the dataset name prefix onto which parameter components can be appended
    */
   virtual void
@@ -110,7 +110,7 @@
 
 /**
  * \ingroup management
- * \brief represents a status/general dataset
+ * \brief Represents a `status/general` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus#General-Status-Dataset
  */
 class ForwarderGeneralStatusDataset : public StatusDataset
@@ -126,7 +126,7 @@
 
 /**
  * \ingroup management
- * \brief provides common functionality among FaceDataset and FaceQueryDataset
+ * \brief Provides common functionality among FaceDataset and FaceQueryDataset.
  */
 class FaceDatasetBase : public StatusDataset
 {
@@ -143,7 +143,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/list dataset
+ * \brief Represents a `faces/list` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset
  */
 class FaceDataset : public FaceDatasetBase
@@ -154,7 +154,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/query dataset
+ * \brief Represents a `faces/query` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
  */
 class FaceQueryDataset : public FaceDatasetBase
@@ -175,7 +175,7 @@
 
 /**
  * \ingroup management
- * \brief represents a faces/channels dataset
+ * \brief Represents a `faces/channels` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Channel-Dataset
  */
 class ChannelDataset : public StatusDataset
@@ -191,7 +191,7 @@
 
 /**
  * \ingroup management
- * \brief represents a fib/list dataset
+ * \brief Represents a `fib/list` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset
  */
 class FibDataset : public StatusDataset
@@ -207,7 +207,7 @@
 
 /**
  * \ingroup management
- * \brief represents a cs/info dataset
+ * \brief Represents a `cs/info` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#CS-Information-Dataset
  */
 class CsInfoDataset : public StatusDataset
@@ -223,7 +223,7 @@
 
 /**
  * \ingroup management
- * \brief represents a strategy-choice/list dataset
+ * \brief Represents a `strategy-choice/list` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy-Choice-Dataset
  */
 class StrategyChoiceDataset : public StatusDataset
@@ -239,7 +239,7 @@
 
 /**
  * \ingroup management
- * \brief represents a rib/list dataset
+ * \brief Represents a `rib/list` dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset
  */
 class RibDataset : public StatusDataset
diff --git a/ndn-cxx/mgmt/nfd/strategy-choice.hpp b/ndn-cxx/mgmt/nfd/strategy-choice.hpp
index efb3132..59db5ba 100644
--- a/ndn-cxx/mgmt/nfd/strategy-choice.hpp
+++ b/ndn-cxx/mgmt/nfd/strategy-choice.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 
 /**
  * \ingroup management
- * \brief represents an item in NFD StrategyChoice dataset
+ * \brief Represents an item in NFD StrategyChoice dataset.
  * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy-Choice-Dataset
  */
 class StrategyChoice
diff --git a/ndn-cxx/name.hpp b/ndn-cxx/name.hpp
index 98a9d7d..36c579b 100644
--- a/ndn-cxx/name.hpp
+++ b/ndn-cxx/name.hpp
@@ -31,12 +31,14 @@
 
 class Name;
 
-/** @brief Represents an arbitrary sequence of name components
+/**
+ * @brief Represents an arbitrary sequence of name components.
  */
 using PartialName = Name;
 
-/** @brief Represents an absolute name
- *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html
+/**
+ * @brief Represents an absolute name.
+ * @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html
  */
 class Name
 {
@@ -61,12 +63,12 @@
   using size_type              = component_container::size_type;
 
 public: // constructors, encoding, decoding
-  /** @brief Create an empty name
+  /** @brief Create an empty name.
    *  @post empty() == true
    */
   Name();
 
-  /** @brief Decode Name from wire encoding
+  /** @brief Decode Name from wire encoding.
    *  @throw tlv::Error wire encoding is invalid
    *
    *  This is a more efficient equivalent for
@@ -78,25 +80,25 @@
   explicit
   Name(const Block& wire);
 
-  /** @brief Parse name from NDN URI
+  /** @brief Parse name from NDN URI.
    *  @param uri a null-terminated URI string
    *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
    */
   Name(const char* uri);
 
-  /** @brief Create name from NDN URI
+  /** @brief Create name from NDN URI.
    *  @param uri a URI string
    *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
    */
   Name(std::string uri);
 
-  /** @brief Write URI representation of the name to the output stream
+  /** @brief Write URI representation of the name to the output stream.
    *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
    */
   void
   toUri(std::ostream& os, name::UriFormat format = name::UriFormat::DEFAULT) const;
 
-  /** @brief Get URI representation of the name
+  /** @brief Get URI representation of the name.
    *  @return URI representation; the "ndn:" scheme identifier is not included
    *  @note To print URI representation into a stream, it is more efficient to use `os << name`.
    *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
@@ -104,7 +106,7 @@
   std::string
   toUri(name::UriFormat format = name::UriFormat::DEFAULT) const;
 
-  /** @brief Check if this instance already has wire encoding
+  /** @brief Check if this instance already has wire encoding.
    */
   bool
   hasWire() const noexcept
@@ -112,26 +114,26 @@
     return m_wire.hasWire();
   }
 
-  /** @brief Fast encoding or block size estimation
+  /** @brief Fast encoding or block size estimation.
    */
   template<encoding::Tag TAG>
   size_t
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
-  /** @brief Perform wire encoding, or return existing wire encoding
+  /** @brief Perform wire encoding, or return existing wire encoding.
    *  @post hasWire() == true
    */
   const Block&
   wireEncode() const;
 
-  /** @brief Decode name from wire encoding
+  /** @brief Decode name from wire encoding.
    *  @throw tlv::Error wire encoding is invalid
    *  @post hasWire() == true
    */
   void
   wireDecode(const Block& wire);
 
-  /** @brief Make a deep copy of the name, reallocating the underlying memory buffer
+  /** @brief Make a deep copy of the name, reallocating the underlying memory buffer.
    */
   Name
   deepCopy() const;
@@ -215,7 +217,7 @@
   }
 
 public: // iterators
-  /** @brief Begin iterator
+  /** @brief Begin iterator.
    */
   const_iterator
   begin() const
@@ -223,7 +225,7 @@
     return reinterpret_cast<const_iterator>(m_wire.elements().data());
   }
 
-  /** @brief End iterator
+  /** @brief End iterator.
    */
   const_iterator
   end() const
@@ -231,7 +233,7 @@
     return reinterpret_cast<const_iterator>(m_wire.elements().data() + m_wire.elements().size());
   }
 
-  /** @brief Reverse begin iterator
+  /** @brief Reverse begin iterator.
    */
   const_reverse_iterator
   rbegin() const
@@ -239,7 +241,7 @@
     return const_reverse_iterator(end());
   }
 
-  /** @brief Reverse end iterator
+  /** @brief Reverse end iterator.
    */
   const_reverse_iterator
   rend() const
@@ -252,7 +254,7 @@
    *  @param i zero-based index of the component to replace;
    *           if negative, it is interpreted as offset from the end of the name
    *  @param component the new component to use as a replacement
-   *  @return a reference to this name, to allow chaining.
+   *  @return A reference to this Name, to allow chaining.
    *  @warning No bounds checking is performed, using an out-of-range index is undefined behavior.
    */
   Name&
@@ -262,14 +264,15 @@
    *  @param i zero-based index of the component to replace;
    *           if negative, it is interpreted as offset from the end of the name
    *  @param component the new component to use as a replacement
-   *  @return a reference to this name, to allow chaining.
+   *  @return A reference to this Name, to allow chaining.
    *  @warning No bounds checking is performed, using an out-of-range index is undefined behavior.
    */
   Name&
   set(ssize_t i, Component&& component);
 
-  /** @brief Append a component.
-   *  @return a reference to this name, to allow chaining.
+  /**
+   * @brief Append a name component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   append(const Component& component)
@@ -278,8 +281,9 @@
     return *this;
   }
 
-  /** @brief Append a component.
-   *  @return a reference to this name, to allow chaining.
+  /**
+   * @brief Append a name component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   append(Component&& component)
@@ -289,8 +293,8 @@
   }
 
   /**
-   * @brief Append a NameComponent of TLV-TYPE @p type, copying the TLV-VALUE from @p value.
-   * @return a reference to this name, to allow chaining.
+   * @brief Append a `NameComponent` of TLV-TYPE @p type, copying the TLV-VALUE from @p value.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   append(uint32_t type, span<const uint8_t> value)
@@ -299,8 +303,8 @@
   }
 
   /**
-   * @brief Append a GenericNameComponent, copying the TLV-VALUE from @p value.
-   * @return a reference to this name, to allow chaining.
+   * @brief Append a `GenericNameComponent`, copying the TLV-VALUE from @p value.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   append(span<const uint8_t> value)
@@ -309,8 +313,8 @@
   }
 
   /**
-   * @brief Append a NameComponent of TLV-TYPE @p type, copying @p count bytes at @p value as TLV-VALUE.
-   * @return a reference to this name, to allow chaining.
+   * @brief Append a `NameComponent` of TLV-TYPE @p type, copying @p count bytes at @p value as TLV-VALUE.
+   * @return A reference to this Name, to allow chaining.
    * @deprecated Use append(uint32_t, span<const uint8_t>)
    */
   [[deprecated("use the overload that takes a span<>")]]
@@ -321,8 +325,8 @@
   }
 
   /**
-   * @brief Append a GenericNameComponent, copying @p count bytes at @p value as TLV-VALUE.
-   * @return a reference to this name, to allow chaining.
+   * @brief Append a `GenericNameComponent`, copying @p count bytes at @p value as TLV-VALUE.
+   * @return A reference to this Name, to allow chaining.
    * @deprecated Use append(span<const uint8_t>)
    */
   [[deprecated("use the overload that takes a span<>")]]
@@ -332,13 +336,13 @@
     return append(make_span(value, count));
   }
 
-  /** @brief Append a NameComponent of TLV-TYPE @p type, copying TLV-VALUE from a range.
+  /** @brief Append a `NameComponent` of TLV-TYPE @p type, copying TLV-VALUE from a range.
    *  @tparam Iterator an @c InputIterator dereferencing to a one-octet value type. More efficient
    *                   implementation is available when it is a @c RandomAccessIterator.
    *  @param type      the TLV-TYPE.
    *  @param first     beginning of the range.
    *  @param last      past-end of the range.
-   *  @return a reference to this name, to allow chaining.
+   *  @return A reference to this Name, to allow chaining.
    */
   template<class Iterator>
   Name&
@@ -347,12 +351,12 @@
     return append(Component(type, first, last));
   }
 
-  /** @brief Append a GenericNameComponent, copying TLV-VALUE from a range.
+  /** @brief Append a `GenericNameComponent`, copying TLV-VALUE from a range.
    *  @tparam Iterator an @c InputIterator dereferencing to a one-octet value type. More efficient
    *                   implementation is available when it is a @c RandomAccessIterator.
    *  @param first     beginning of the range.
    *  @param last      past-end of the range.
-   *  @return a reference to this name, to allow chaining.
+   *  @return A reference to this Name, to allow chaining.
    */
   template<class Iterator>
   Name&
@@ -361,10 +365,10 @@
     return append(Component(tlv::GenericNameComponent, first, last));
   }
 
-  /** @brief Append a GenericNameComponent, copying TLV-VALUE from a null-terminated string.
+  /** @brief Append a `GenericNameComponent`, copying TLV-VALUE from a null-terminated string.
    *  @param str a null-terminated string. Bytes from the string are copied as is, and not
    *             interpreted as URI component.
-   *  @return a reference to this name, to allow chaining.
+   *  @return A reference to this Name, to allow chaining.
    */
   Name&
   append(const char* str)
@@ -374,13 +378,13 @@
 
   /** @brief Append a PartialName.
    *  @param name the components to append
-   *  @return a reference to this name, to allow chaining
+   *  @return A reference to this Name, to allow chaining.
    */
   Name&
   append(const PartialName& name);
 
-  /** @brief Append a component with a NonNegativeInteger
-   *  @return a reference to this name, to allow chaining
+  /** @brief Append a component with a NonNegativeInteger.
+   *  @return A reference to this Name, to allow chaining.
    *  @sa https://named-data.net/doc/NDN-packet-spec/0.3/tlv.html#non-negative-integer-encoding
    */
   Name&
@@ -389,13 +393,13 @@
     return append(Component::fromNumber(number));
   }
 
-  /** @brief Append a component with a marked number
+  /** @brief Append a component with a marked number.
    *  @param marker 1-octet marker
    *  @param number the number
    *
    *  The component is encoded as a 1-octet marker, followed by a NonNegativeInteger.
    *
-   *  @return a reference to this name, to allow chaining
+   *  @return A reference to this Name, to allow chaining.
    *  @sa NDN Naming Conventions revision 1 (obsolete)
    *      https://named-data.net/wp-content/uploads/2014/08/ndn-tr-22-ndn-memo-naming-conventions.pdf
    */
@@ -406,8 +410,8 @@
   }
 
   /**
-   * @brief Append a segment number (sequential) component
-   * @return a reference to this name, to allow chaining
+   * @brief Append a segment number (sequential) component.
+   * @return A reference to this Name, to allow chaining.
    * @sa NDN Naming Conventions
    *     https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
    */
@@ -418,8 +422,8 @@
   }
 
   /**
-   * @brief Append a byte offset component
-   * @return a reference to this name, to allow chaining
+   * @brief Append a byte offset component.
+   * @return A reference to this Name, to allow chaining.
    * @sa NDN Naming Conventions
    *     https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
    */
@@ -430,10 +434,10 @@
   }
 
   /**
-   * @brief Append a version component
+   * @brief Append a version component.
    * @param version the version number to append; if nullopt, the current UNIX time
    *                in milliseconds is used
-   * @return a reference to this name, to allow chaining
+   * @return A reference to this Name, to allow chaining.
    * @sa NDN Naming Conventions
    *     https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
    */
@@ -441,9 +445,9 @@
   appendVersion(const optional<uint64_t>& version = nullopt);
 
   /**
-   * @brief Append a timestamp component
+   * @brief Append a timestamp component.
    * @param timestamp the timestamp to append; if nullopt, the current system time is used
-   * @return a reference to this name, to allow chaining
+   * @return A reference to this Name, to allow chaining.
    * @sa NDN Naming Conventions
    *     https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
    */
@@ -451,8 +455,8 @@
   appendTimestamp(const optional<time::system_clock::time_point>& timestamp = nullopt);
 
   /**
-   * @brief Append a sequence number component
-   * @return a reference to this name, to allow chaining
+   * @brief Append a sequence number component.
+   * @return A reference to this Name, to allow chaining.
    * @sa NDN Naming Conventions
    *     https://named-data.net/publications/techreports/ndn-tr-22-3-ndn-memo-naming-conventions/
    */
@@ -463,8 +467,8 @@
   }
 
   /**
-   * @brief Append an ImplicitSha256Digest component.
-   * @return a reference to this name, to allow chaining
+   * @brief Append an `ImplicitSha256Digest` component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendImplicitSha256Digest(ConstBufferPtr digest)
@@ -473,8 +477,8 @@
   }
 
   /**
-   * @brief Append an ImplicitSha256Digest component.
-   * @return a reference to this name, to allow chaining
+   * @brief Append an `ImplicitSha256Digest` component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendImplicitSha256Digest(span<const uint8_t> digestBytes)
@@ -483,8 +487,8 @@
   }
 
   /**
-   * @brief Append a ParametersSha256Digest component.
-   * @return a reference to this name, to allow chaining
+   * @brief Append a `ParametersSha256Digest` component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendParametersSha256Digest(ConstBufferPtr digest)
@@ -493,8 +497,8 @@
   }
 
   /**
-   * @brief Append a ParametersSha256Digest component.
-   * @return a reference to this name, to allow chaining
+   * @brief Append a `ParametersSha256Digest` component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendParametersSha256Digest(span<const uint8_t> digestBytes)
@@ -503,15 +507,15 @@
   }
 
   /**
-   * @brief Append a placeholder for a ParametersSha256Digest component.
-   * @return a reference to this name, to allow chaining
+   * @brief Append a placeholder for a `ParametersSha256Digest` component.
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendParametersSha256DigestPlaceholder();
 
   /**
    * @brief Append a keyword component.
-   * @return a reference to this name, to allow chaining
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendKeyword(span<const uint8_t> keyword)
@@ -521,7 +525,7 @@
 
   /**
    * @brief Append a keyword component.
-   * @return a reference to this name, to allow chaining
+   * @return A reference to this Name, to allow chaining.
    */
   Name&
   appendKeyword(const char* keyword)
@@ -531,8 +535,8 @@
   }
 
   /**
-   * @brief Append a component.
-   * @note This makes push_back an alias of append, giving Name a similar API as `std::vector`.
+   * @brief Append a name component.
+   * @note This makes push_back() an alias of append(), giving Name a similar API as `std::vector`.
    */
   template<class T>
   void
@@ -558,7 +562,7 @@
   clear();
 
 public: // algorithms
-  /** @brief Get the successor of a name
+  /** @brief Get the successor of a name.
    *
    *  The successor of a name is defined as follows:
    *
@@ -585,7 +589,7 @@
   Name
   getSuccessor() const;
 
-  /** @brief Check if this name is a prefix of another name
+  /** @brief Check if this name is a prefix of another name.
    *
    *  This name is a prefix of @p other if the N components of this name are same as the first N
    *  components of @p other.
@@ -596,7 +600,7 @@
   bool
   isPrefixOf(const Name& other) const;
 
-  /** @brief Check if this name equals another name
+  /** @brief Check if this name equals another name.
    *
    *  Two names are equal if they have the same number of components, and components at each index
    *  are equal.
@@ -631,8 +635,8 @@
     return this->compare(0, npos, other);
   }
 
-  /** @brief compares [pos1, pos1+count1) components in this Name
-   *         to [pos2, pos2+count2) components in @p other
+  /** @brief Compares `[pos1, pos1+count1)` components in this Name
+   *         to `[pos2, pos2+count2)` components in @p other.
    *
    *  Equivalent to `getSubName(pos1, count1).compare(other.getSubName(pos2, count2))`.
    */
diff --git a/ndn-cxx/net/ethernet.hpp b/ndn-cxx/net/ethernet.hpp
index 9d81cce..ad79187 100644
--- a/ndn-cxx/net/ethernet.hpp
+++ b/ndn-cxx/net/ethernet.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021 Regents of the University of California,
+ * Copyright (c) 2014-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -46,37 +46,37 @@
 const size_t MAX_DATA_LEN = 1500;   ///< Max octets in Ethernet payload
 const size_t CRC_LEN      = 4;      ///< Octets in Ethernet frame check sequence
 
-
-/** \brief represents an Ethernet hardware address
+/**
+ * \brief Represents an Ethernet hardware address.
  */
 class Address : public std::array<uint8_t, ADDR_LEN>
 {
 public:
-  /// Constructs a null Ethernet address (00:00:00:00:00:00)
+  /// Constructs a null Ethernet address (`00:00:00:00:00:00`).
   Address();
 
-  /// Constructs a new Ethernet address with the given octets
+  /// Constructs a new Ethernet address with the given octets.
   Address(uint8_t a1, uint8_t a2, uint8_t a3,
           uint8_t a4, uint8_t a5, uint8_t a6);
 
-  /// Constructs a new Ethernet address with the given octets
+  /// Constructs a new Ethernet address with the given octets.
   explicit
   Address(const uint8_t octets[ADDR_LEN]);
 
-  /// True if this is a broadcast address (ff:ff:ff:ff:ff:ff)
+  /// True if this is a broadcast address (`ff:ff:ff:ff:ff:ff`).
   bool
   isBroadcast() const;
 
-  /// True if this is a multicast address
+  /// True if this is a multicast address.
   bool
   isMulticast() const;
 
-  /// True if this is a null address (00:00:00:00:00:00)
+  /// True if this is a null address (`00:00:00:00:00:00`).
   bool
   isNull() const;
 
   /**
-   * \brief Converts the address to a human-readable string
+   * \brief Converts the address to a human-readable string.
    *
    * \param sep A character used to visually separate the octets,
    *            usually ':' (the default value) or '-'
@@ -86,7 +86,7 @@
 
   /**
    * \brief Creates an Address from a string containing an Ethernet address
-   *        in hexadecimal notation, with colons or hyphens as separators
+   *        in hexadecimal notation, with colons or hyphens as separators.
    *
    * \param str The string to be parsed
    * \return Always an instance of Address, which will be null
@@ -96,11 +96,15 @@
   fromString(const std::string& str);
 };
 
-/// Returns the Ethernet broadcast address (ff:ff:ff:ff:ff:ff)
+/**
+ * @brief Returns the Ethernet broadcast address (`ff:ff:ff:ff:ff:ff`).
+ */
 Address
 getBroadcastAddress();
 
-/// Returns the default Ethernet multicast address for NDN
+/**
+ * @brief Returns the default Ethernet multicast address for NDN.
+ */
 Address
 getDefaultMulticastAddress();
 
diff --git a/ndn-cxx/net/face-uri.cpp b/ndn-cxx/net/face-uri.cpp
index 00e1060..cb4e279 100644
--- a/ndn-cxx/net/face-uri.cpp
+++ b/ndn-cxx/net/face-uri.cpp
@@ -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-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -211,7 +211,7 @@
 }
 
 
-/** \brief a CanonizeProvider provides FaceUri canonization functionality for a group of schemes
+/** \brief A CanonizeProvider provides FaceUri canonization functionality for a group of schemes.
  */
 class CanonizeProvider : noncopyable
 {
@@ -389,7 +389,7 @@
     onFailure(reason);
   }
 
-  /** \brief when overriden in a subclass, check the IP address is allowable
+  /** \brief When overriden in a subclass, check the IP address is allowable.
    *  \return (true,ignored) if the address is allowable;
    *          (false,reason) if the address is not allowable.
    */
diff --git a/ndn-cxx/net/face-uri.hpp b/ndn-cxx/net/face-uri.hpp
index 8194dad..87555f4 100644
--- a/ndn-cxx/net/face-uri.hpp
+++ b/ndn-cxx/net/face-uri.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-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -38,8 +38,9 @@
 
 namespace ndn {
 
-/** \brief represents the underlying protocol and address used by a Face
- *  \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#FaceUri
+/**
+ * \brief The underlying protocol and address used by a Face.
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#FaceUri
  */
 class FaceUri
 {
@@ -52,10 +53,10 @@
 
   FaceUri();
 
-  /** \brief construct by parsing
-   *
-   *  \param uri scheme://host[:port]/path
-   *  \throw FaceUri::Error if URI cannot be parsed
+  /**
+   * \brief Construct by parsing.
+   * \param uri scheme://host[:port]/path
+   * \throw FaceUri::Error if URI cannot be parsed
    */
   explicit
   FaceUri(const std::string& uri);
@@ -65,84 +66,85 @@
   explicit
   FaceUri(const char* uri);
 
-  /// exception-safe parsing
+  /// Exception-safe parsing.
   NDN_CXX_NODISCARD bool
   parse(const std::string& uri);
 
 public: // scheme-specific construction
-  /// construct udp4 or udp6 canonical FaceUri
+  /// Construct a udp4 or udp6 canonical FaceUri.
   explicit
   FaceUri(const boost::asio::ip::udp::endpoint& endpoint);
 
-  /// construct tcp4 or tcp6 canonical FaceUri
+  /// Construct a tcp4 or tcp6 canonical FaceUri.
   explicit
   FaceUri(const boost::asio::ip::tcp::endpoint& endpoint);
 
-  /// construct tcp canonical FaceUri with custom scheme
+  /// Construct a tcp canonical FaceUri with custom scheme.
   FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme);
 
 #ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS
-  /// construct unix canonical FaceUri
+  /// Construct a unix canonical FaceUri.
   explicit
   FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint);
 #endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
 
-  /// create fd FaceUri from file descriptor
+  /// Construct an fd FaceUri from a file descriptor.
   static FaceUri
   fromFd(int fd);
 
-  /// construct ether canonical FaceUri
+  /// Construct an ether canonical FaceUri.
   explicit
   FaceUri(const ethernet::Address& address);
 
-  /// create dev FaceUri from network device name
+  /// Construct a dev FaceUri from a network device name.
   static FaceUri
   fromDev(const std::string& ifname);
 
-  /// create udp4 or udp6 NIC-associated FaceUri from endpoint and network device name
+  /// Construct a udp4 or udp6 NIC-associated FaceUri from endpoint and network device name.
   static FaceUri
   fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname);
 
 public: // getters
-  /// get scheme (protocol)
+  /// Get scheme (protocol)
   const std::string&
   getScheme() const
   {
     return m_scheme;
   }
 
-  /// get host (domain)
+  /// Get host (domain)
   const std::string&
   getHost() const
   {
     return m_host;
   }
 
-  /// get port
+  /// Get port
   const std::string&
   getPort() const
   {
     return m_port;
   }
 
-  /// get path
+  /// Get path
   const std::string&
   getPath() const
   {
     return m_path;
   }
 
-  /// write as a string
+  /// Serialize as a string
   std::string
   toString() const;
 
 public: // canonical FaceUri
-  /** \return whether a FaceUri of the scheme can be canonized
+  /**
+   * \brief Return whether a FaceUri of the specified scheme can be canonized.
    */
   static bool
   canCanonize(const std::string& scheme);
 
-  /** \brief determine whether this FaceUri is in canonical form
+  /** \brief Determine whether this FaceUri is in canonical form.
    *  \return true if this FaceUri is in canonical form,
    *          false if this FaceUri is not in canonical form or
    *          or it's undetermined whether this FaceUri is in canonical form
@@ -153,7 +155,7 @@
   typedef function<void(const FaceUri&)> CanonizeSuccessCallback;
   typedef function<void(const std::string& reason)> CanonizeFailureCallback;
 
-  /** \brief asynchronously convert this FaceUri to canonical form
+  /** \brief Asynchronously convert this FaceUri to canonical form.
    *  \param onSuccess function to call after this FaceUri is converted to canonical form
    *  \note A new FaceUri in canonical form will be created; this FaceUri is unchanged.
    *  \param onFailure function to call if this FaceUri cannot be converted to canonical form
diff --git a/ndn-cxx/net/impl/network-monitor-impl-netlink.hpp b/ndn-cxx/net/impl/network-monitor-impl-netlink.hpp
index 87dcf35..a7c7193 100644
--- a/ndn-cxx/net/impl/network-monitor-impl-netlink.hpp
+++ b/ndn-cxx/net/impl/network-monitor-impl-netlink.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -41,7 +41,7 @@
 class NetworkMonitorImplNetlink : public NetworkMonitorImpl
 {
 public:
-  /** \brief initialize netlink socket and start enumerating interfaces
+  /** \brief Initialize netlink socket and start enumerating interfaces.
    */
   explicit
   NetworkMonitorImplNetlink(boost::asio::io_service& io);
diff --git a/ndn-cxx/net/network-monitor-stub.hpp b/ndn-cxx/net/network-monitor-stub.hpp
index fcfe536..054a85a 100644
--- a/ndn-cxx/net/network-monitor-stub.hpp
+++ b/ndn-cxx/net/network-monitor-stub.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,23 +29,24 @@
 
 class NetworkMonitorImplStub;
 
-/** \brief a stub NetworkMonitor for unit testing
+/**
+ * \brief A dummy NetworkMonitor for unit testing.
  */
 class NetworkMonitorStub : public NetworkMonitor
 {
 public:
-  /** \brief constructor
+  /** \brief Constructor.
    *  \param capabilities capabilities reported by \p getCapabilities
    */
   explicit
   NetworkMonitorStub(uint32_t capabilities);
 
-  /** \brief create a NetworkInterface instance
+  /** \brief Create a NetworkInterface instance.
    */
   static shared_ptr<NetworkInterface>
   makeNetworkInterface();
 
-  /** \brief emit the \p onInterfaceAdded signal and add \p netif internally
+  /** \brief Emit the \p onInterfaceAdded signal and add \p netif internally.
    *  \param netif new network interface
    *  \post getNetworkInterface(netif->getName()) == netif
    *  \post listNetworkInterface() contains netif
@@ -54,7 +55,7 @@
   void
   addInterface(shared_ptr<NetworkInterface> netif);
 
-  /** \brief emit the \p onInterfaceRemoved signal and remove \p netif internally
+  /** \brief Emit the \p onInterfaceRemoved signal and remove \p netif internally.
    *  \param ifname network interface name
    *  \post getNetworkInterface(ifname) == nullptr
    *  \post listNetworkInterface() does not contains an interface with specified name
@@ -63,7 +64,7 @@
   void
   removeInterface(const std::string& ifname);
 
-  /** \brief emit the \p onEnumerationCompleted signal
+  /** \brief Emit the \p onEnumerationCompleted signal.
    *
    *  A real NetworkMonitor starts with an "enumerating" state, during which the initial
    *  information about network interfaces is collected from the OS. Upon discovering a network
diff --git a/ndn-cxx/security/certificate-request.hpp b/ndn-cxx/security/certificate-request.hpp
index d856a72..bb270dd 100644
--- a/ndn-cxx/security/certificate-request.hpp
+++ b/ndn-cxx/security/certificate-request.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,7 +29,7 @@
 inline namespace v2 {
 
 /**
- * @brief Request for a certificate, associated with the number of attempts
+ * @brief Request for a certificate, associated with the number of attempts.
  */
 class CertificateRequest : noncopyable
 {
@@ -50,11 +50,11 @@
   }
 
 public:
-  /// @brief the name for the requested data/certificate.
+  /// The name for the requested certificate.
   Interest interest;
-  /// @brief the number of remaining retries after timeout or NACK.
+  /// The number of remaining retries after a timeout or Nack.
   int nRetriesLeft = 0;
-  /// @brief the amount of time to wait before sending the next interest after a NACK.
+  /// The amount of time to wait before sending the next Interest after a Nack.
   time::milliseconds waitAfterNack = 500_ms;
 };
 
diff --git a/ndn-cxx/security/certificate-storage.hpp b/ndn-cxx/security/certificate-storage.hpp
index e3ce5cd..0f5a126 100644
--- a/ndn-cxx/security/certificate-storage.hpp
+++ b/ndn-cxx/security/certificate-storage.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -39,24 +39,23 @@
   CertificateStorage();
 
   /**
-   * @brief Find a trusted certificate in trust anchor container or in verified cache
+   * @brief Find a trusted certificate in trust anchor container or in verified cache.
    * @param interestForCert Interest for certificate
-   * @return found certificate, nullptr if not found.
+   * @return Found certificate, nullptr if not found.
    *
-   * @note The returned pointer may get invalidated after next findTrustedCert or findCert calls.
+   * @note The returned pointer may get invalidated after next findTrustedCert() or findCert() calls.
    */
   const Certificate*
   findTrustedCert(const Interest& interestForCert) const;
 
   /**
-   * @brief Check if certificate exists in verified, unverified cache, or in the set of trust
-   *        anchors
+   * @brief Check if certificate exists in the verified/unverified cache or in the set of trust anchors.
    */
   bool
   isCertKnown(const Name& certPrefix) const;
 
   /**
-   * @brief Cache unverified certificate for a period of time (5 minutes)
+   * @brief Cache unverified certificate for a period of time (5 minutes).
    * @param cert  The certificate packet
    *
    * @todo Add ability to customize time period
@@ -84,7 +83,7 @@
 
 protected:
   /**
-   * @brief load static trust anchor.
+   * @brief Load static trust anchor.
    *
    * Static trust anchors are permanently associated with the validator and never expire.
    *
@@ -95,7 +94,7 @@
   loadAnchor(const std::string& groupId, Certificate&& cert);
 
   /**
-   * @brief load dynamic trust anchors.
+   * @brief Load dynamic trust anchors.
    *
    * Dynamic trust anchors are associated with the validator for as long as the underlying
    * trust anchor file (set of files) exist(s).
@@ -110,13 +109,13 @@
              time::nanoseconds refreshPeriod, bool isDir = false);
 
   /**
-   * @brief remove any previously loaded static or dynamic trust anchor
+   * @brief Remove any previously loaded static or dynamic trust anchor.
    */
   void
   resetAnchors();
 
   /**
-   * @brief Cache verified certificate a period of time (1 hour)
+   * @brief Cache verified certificate a period of time (1 hour).
    * @param cert  The certificate packet
    *
    * @todo Add ability to customize time period
@@ -125,7 +124,7 @@
   cacheVerifiedCert(Certificate&& cert);
 
   /**
-   * @brief Remove any cached verified certificates
+   * @brief Remove any cached verified certificates.
    */
   void
   resetVerifiedCerts();
diff --git a/ndn-cxx/security/key-params.hpp b/ndn-cxx/security/key-params.hpp
index 0c657d6..fc28f10 100644
--- a/ndn-cxx/security/key-params.hpp
+++ b/ndn-cxx/security/key-params.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -70,7 +70,7 @@
 
 protected:
   /**
-   * @brief Constructor
+   * @brief Constructor.
    *
    * @param keyType Type of the created key
    * @param keyIdType The method how the key id should be generated; must not be
@@ -79,7 +79,7 @@
   KeyParams(KeyType keyType, KeyIdType keyIdType);
 
   /**
-   * @brief Constructor
+   * @brief Constructor.
    *
    * @param keyType Type of the created key
    * @param keyId The user-specified key id. The keyIdType will be set to KeyIdType::USER_SPECIFIED.
@@ -108,7 +108,7 @@
   }
 
   /**
-   * @brief check if @p size is valid and supported for this key type.
+   * @brief Check if @p size is valid and supported for this key type.
    *
    * @throw KeyParams::Error if the key size is not supported.
    */
@@ -130,7 +130,7 @@
   }
 
   /**
-   * @brief check if @p size is valid and supported for this key type.
+   * @brief Check if @p size is valid and supported for this key type.
    *
    * @throw KeyParams::Error if the key size is not supported.
    */
@@ -215,7 +215,7 @@
   }
 
   /**
-   * @brief check if @p size is valid and supported for this key type.
+   * @brief Check if @p size is valid and supported for this key type.
    *
    * @throw KeyParams::Error if the key size is not supported.
    */
@@ -237,7 +237,7 @@
   }
 
   /**
-   * @brief check if @p size is valid and supported for this key type.
+   * @brief Check if @p size is valid and supported for this key type.
    *
    * @throw KeyParams::Error if the key size is not supported.
    */
diff --git a/ndn-cxx/security/pib/pib.hpp b/ndn-cxx/security/pib/pib.hpp
index e6a26bf..4ae4c8d 100644
--- a/ndn-cxx/security/pib/pib.hpp
+++ b/ndn-cxx/security/pib/pib.hpp
@@ -123,7 +123,7 @@
    *
    * If no default identity is currently set, the new identity will become the default identity.
    *
-   * @return handle of the added identity.
+   * @return Handle of the added identity.
    */
   Identity
   addIdentity(const Name& identity);
@@ -141,7 +141,7 @@
    *
    * The identity will be created if it does not exist.
    *
-   * @return handle of the default identity
+   * @return Handle of the default identity.
    */
   Identity
   setDefaultIdentity(const Name& identity);
diff --git a/ndn-cxx/security/security-common.hpp b/ndn-cxx/security/security-common.hpp
index dfbe6cf..b193746 100644
--- a/ndn-cxx/security/security-common.hpp
+++ b/ndn-cxx/security/security-common.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -34,7 +34,7 @@
 const ssize_t POS_SIG_VALUE = -1;
 const ssize_t POS_SIG_INFO = -2;
 
-/** \brief minimal number of components for Signed Interest
+/** \brief Minimum number of name components for an old-style Signed %Interest.
  *  \sa https://redmine.named-data.net/projects/ndn-cxx/wiki/SignedInterest
  */
 const size_t MIN_SIZE = 2;
@@ -48,7 +48,7 @@
 const ssize_t POS_RANDOM_VAL = -3;
 const ssize_t POS_TIMESTAMP = -4;
 
-/** \brief minimal number of components for Command Interest
+/** \brief Minimum number of name components for a Command %Interest.
  *  \sa https://redmine.named-data.net/projects/ndn-cxx/wiki/CommandInterest
  */
 const size_t MIN_SIZE = 4;
diff --git a/ndn-cxx/security/signing-helpers.hpp b/ndn-cxx/security/signing-helpers.hpp
index 55d8ad5..3ebadfb 100644
--- a/ndn-cxx/security/signing-helpers.hpp
+++ b/ndn-cxx/security/signing-helpers.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,50 +22,49 @@
 #ifndef NDN_CXX_SECURITY_SIGNING_HELPERS_HPP
 #define NDN_CXX_SECURITY_SIGNING_HELPERS_HPP
 
-#include "ndn-cxx/detail/common.hpp"
 #include "ndn-cxx/security/signing-info.hpp"
 
 namespace ndn {
 namespace security {
 
 /**
- * \return a SigningInfo for signing with an identity
+ * \brief Return a SigningInfo for signing with an identity.
  */
 SigningInfo
 signingByIdentity(const Name& identityName);
 
 /**
- * \return a SigningInfo for signing with an identity
+ * \brief Return a SigningInfo for signing with an identity.
  */
 SigningInfo
 signingByIdentity(const Identity& identity);
 
 /**
- * \return a SigningInfo for signing with a key
+ * \brief Return a SigningInfo for signing with a key.
  */
 SigningInfo
 signingByKey(const Name& keyName);
 
 /**
- * \return a SigningInfo for signing with a key
+ * \brief Return a SigningInfo for signing with a key.
  */
 SigningInfo
 signingByKey(const Key& key);
 
 /**
- * \return a SigningInfo for signing with a certificate
+ * \brief Return a SigningInfo for signing with a certificate.
  */
 SigningInfo
 signingByCertificate(const Name& certName);
 
 /**
- * \return a SigningInfo for signing with a certificate
+ * \brief Return a SigningInfo for signing with a certificate.
  */
 SigningInfo
 signingByCertificate(const Certificate& cert);
 
 /**
- * \return a SigningInfo for signing with Sha256
+ * \brief Return a SigningInfo for signing with a SHA-256 digest.
  */
 SigningInfo
 signingWithSha256();
diff --git a/ndn-cxx/security/signing-info.hpp b/ndn-cxx/security/signing-info.hpp
index 12bc713..7a87a3f 100644
--- a/ndn-cxx/security/signing-info.hpp
+++ b/ndn-cxx/security/signing-info.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -152,21 +152,21 @@
   setSha256Signing();
 
   /**
-   * @brief Set signer as a PIB identity handler @p identity
+   * @brief Set signer as a PIB identity handle @p identity
    * @post Change the signerType to SIGNER_TYPE_ID
    */
   SigningInfo&
   setPibIdentity(const Identity& identity);
 
   /**
-   * @brief Set signer as a PIB key handler @p key
+   * @brief Set signer as a PIB key handle @p key
    * @post Change the signerType to SIGNER_TYPE_KEY
    */
   SigningInfo&
   setPibKey(const Key& key);
 
   /**
-   * @return Type of the signer
+   * @brief Return the signer type.
    */
   SignerType
   getSignerType() const
@@ -175,7 +175,7 @@
   }
 
   /**
-   * @return Name of signer; interpretation differs per signerType
+   * @return Name of signer; interpretation differs per signerType.
    */
   const Name&
   getSignerName() const
@@ -185,8 +185,8 @@
 
   /**
    * @pre signerType must be SIGNER_TYPE_ID
-   * @return the identity handler of signer, or Identity() if getSignerName() should be used
-   *         to find the identity
+   * @return The identity handle of signer, or Identity() if getSignerName() should be used
+   *         to find the identity.
    */
   const Identity&
   getPibIdentity() const
@@ -197,7 +197,7 @@
 
   /**
    * @pre signerType must be SIGNER_TYPE_KEY
-   * @return the key handler of signer, or Key() if getSignerName() should be used to find the key
+   * @return The key handle of signer, or Key() if getSignerName() should be used to find the key.
    */
   const Key&
   getPibKey() const
@@ -214,7 +214,7 @@
   }
 
   /**
-   * @brief Set the digest algorithm for signing operations
+   * @brief Set the digest algorithm for signing operations.
    */
   SigningInfo&
   setDigestAlgorithm(const DigestAlgorithm& algorithm)
@@ -224,7 +224,7 @@
   }
 
   /**
-   * @return The digest algorithm for signing operations
+   * @brief Get the digest algorithm for signing operations.
    */
   DigestAlgorithm
   getDigestAlgorithm() const
@@ -233,13 +233,13 @@
   }
 
   /**
-   * @brief Set a semi-prepared SignatureInfo
+   * @brief Set a semi-prepared SignatureInfo.
    */
   SigningInfo&
   setSignatureInfo(const SignatureInfo& signatureInfo);
 
   /**
-   * @return Semi-prepared SignatureInfo
+   * @brief Get a semi-prepared SignatureInfo.
    */
   const SignatureInfo&
   getSignatureInfo() const
@@ -248,7 +248,7 @@
   }
 
   /**
-   * @brief Set signed Interest format
+   * @brief Set the signed %Interest format.
    * @note  This is a transitional API to handle the change in signed Interest format and will
    *        disappear after a few releases.
    */
@@ -260,9 +260,9 @@
   }
 
   /**
-   * @return Signed Interest format
-   * @note   This is a transitional API to handle the change in signed Interest format and will
-   *         disappear after a few releases.
+   * @brief Get the signed %Interest format.
+   * @note  This is a transitional API to handle the change in signed Interest format and will
+   *        disappear after a few releases.
    */
   SignedInterestFormat
   getSignedInterestFormat() const
diff --git a/ndn-cxx/security/transform/step-source.hpp b/ndn-cxx/security/transform/step-source.hpp
index 10fe86a..2c08260 100644
--- a/ndn-cxx/security/transform/step-source.hpp
+++ b/ndn-cxx/security/transform/step-source.hpp
@@ -51,7 +51,7 @@
    * One can keep calling this method to until end() is called, which
    * indicates the end of input.  After that, calling this method will cause Error.
    *
-   * @return number of bytes that has been written into next module
+   * @return Number of bytes that have been written into the next module.
    */
   size_t
   write(span<const uint8_t> buf);
diff --git a/ndn-cxx/security/transform/stream-sink.hpp b/ndn-cxx/security/transform/stream-sink.hpp
index 53e5408..d2e6e32 100644
--- a/ndn-cxx/security/transform/stream-sink.hpp
+++ b/ndn-cxx/security/transform/stream-sink.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -35,23 +35,20 @@
 {
 public:
   /**
-   * @brief Create a stream sink which outputs to @p os
+   * @brief Create a stream sink which outputs to @p os.
    */
   explicit
   StreamSink(std::ostream& os);
 
 private:
   /**
-   * @brief Write data into the stream
+   * @brief Write data into the stream.
    *
-   * @return number of bytes that have been written into the stream
+   * @return Number of bytes that have been written into the stream.
    */
   size_t
   doWrite(span<const uint8_t> buf) final;
 
-  /**
-   * @brief Finalize sink processing
-   */
   void
   doEnd() final;
 
diff --git a/ndn-cxx/security/transform/strip-space.hpp b/ndn-cxx/security/transform/strip-space.hpp
index b4867c6..f01e936 100644
--- a/ndn-cxx/security/transform/strip-space.hpp
+++ b/ndn-cxx/security/transform/strip-space.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -54,7 +54,7 @@
   std::bitset<CHARMAP_SIZE> m_isWhitespace; // char => whether char is whitespace
 };
 
-/** \brief constructs a StripSpace transform
+/** \brief Constructs a StripSpace transform.
  *  \param whitespaces characters classified as whitespaces, terminated with null
  */
 unique_ptr<Transform>
diff --git a/ndn-cxx/security/transform/transform-base.hpp b/ndn-cxx/security/transform/transform-base.hpp
index f1f9806..faf96be 100644
--- a/ndn-cxx/security/transform/transform-base.hpp
+++ b/ndn-cxx/security/transform/transform-base.hpp
@@ -85,7 +85,7 @@
    * If a Downstream implementation expects structured input (e.g., hex decoding requires byte-pair),
    * it should not return less than size if final portion of input is not a complete record.
    *
-   * @return number of bytes that has been written into this module
+   * @return Number of bytes that have been written into this module.
    * @throws Error if this module is closed or transformation error happens.
    */
   size_t
diff --git a/ndn-cxx/security/trust-anchor-container.hpp b/ndn-cxx/security/trust-anchor-container.hpp
index 6db7d2e..18afa36 100644
--- a/ndn-cxx/security/trust-anchor-container.hpp
+++ b/ndn-cxx/security/trust-anchor-container.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -36,7 +36,7 @@
 inline namespace v2 {
 
 /**
- * @brief represents a container for trust anchors.
+ * @brief A container for trust anchors.
  *
  * There are two kinds of anchors:
  * - static anchors that are permanent for the lifetime of the container
@@ -92,13 +92,13 @@
          time::nanoseconds refreshPeriod, bool isDir = false);
 
   /**
-   * @brief Remove all static or dynamic anchors
+   * @brief Remove all static or dynamic anchors.
    */
   void
   clear();
 
   /**
-   * @brief Search for certificate across all groups (longest prefix match)
+   * @brief Search for certificate across all groups (longest prefix match).
    * @param keyName  Key name prefix for searching the certificate.
    * @return The found certificate, nullptr if not found.
    *
@@ -108,26 +108,25 @@
   find(const Name& keyName) const;
 
   /**
-   * @brief Find certificate given interest
+   * @brief Find certificate given interest.
    * @param interest  The input interest packet.
    * @return The found certificate, nullptr if not found.
    *
    * @note The returned value may be invalidated after next call to one of `find` methods.
-   *
    * @note Interest with implicit digest is not supported.
    */
   const Certificate*
   find(const Interest& interest) const;
 
   /**
-   * @brief Get trusted anchor group
+   * @brief Get trusted anchor group.
    * @throw Error @p groupId does not exist
    */
   TrustAnchorGroup&
   getGroup(const std::string& groupId) const;
 
   /**
-   * @brief Get number of trust anchors across all groups
+   * @brief Get number of trust anchors across all groups.
    */
   size_t
   size() const;
diff --git a/ndn-cxx/security/validation-policy-command-interest.hpp b/ndn-cxx/security/validation-policy-command-interest.hpp
index 34a0e9a..68a7719 100644
--- a/ndn-cxx/security/validation-policy-command-interest.hpp
+++ b/ndn-cxx/security/validation-policy-command-interest.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -50,7 +50,7 @@
     }
 
   public:
-    /** \brief tolerance of initial timestamp
+    /** \brief Tolerance of initial timestamp.
      *
      *  A stop-and-wait command Interest is considered "initial" if the validator
      *  has not recorded the last timestamp from the same public key, or when
@@ -65,7 +65,7 @@
      */
     time::nanoseconds gracePeriod = 2_min;
 
-    /** \brief max number of distinct public keys of which to record the last timestamp
+    /** \brief Max number of distinct public keys of which to record the last timestamp.
      *
      *  The validator records last timestamps for every public key.
      *  For a subsequent command Interest using the same public key,
@@ -82,7 +82,7 @@
      */
     ssize_t maxRecords = 1000;
 
-    /** \brief max lifetime of a last timestamp record
+    /** \brief Max lifetime of a last timestamp record.
      *
      *  A last timestamp record expires and can be deleted if it has not been refreshed
      *  within this duration.
@@ -92,7 +92,7 @@
     time::nanoseconds recordLifetime = 1_h;
   };
 
-  /** \brief constructor
+  /** \brief Constructor.
    *  \param inner a Validator for signed Interest signature validation and Data validation;
    *               this must not be nullptr
    *  \param options stop-and-wait command Interest validation options
diff --git a/ndn-cxx/security/validation-state.hpp b/ndn-cxx/security/validation-state.hpp
index aed0264..15ea8f1 100644
--- a/ndn-cxx/security/validation-state.hpp
+++ b/ndn-cxx/security/validation-state.hpp
@@ -143,7 +143,7 @@
   std::unordered_set<Name> m_seenCertificateNames;
 
   /**
-   * @brief the certificate chain
+   * @brief The certificate chain.
    *
    * Each certificate in the chain signs the next certificate.  The last certificate signs the
    * original packet.
diff --git a/ndn-cxx/security/validator-config/checker.hpp b/ndn-cxx/security/validator-config/checker.hpp
index 3086ee7..fa5c021 100644
--- a/ndn-cxx/security/validator-config/checker.hpp
+++ b/ndn-cxx/security/validator-config/checker.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -78,7 +78,7 @@
   ~Checker() = default;
 
   /**
-   * @brief Check if packet name and KeyLocator satisfy the checker's conditions
+   * @brief Check if packet name and KeyLocator satisfy the checker's conditions.
    *
    * @param pktType tlv::Interest or tlv::Data
    * @param sigType Signature type
@@ -91,7 +91,7 @@
         const Name& pktName, const Name& klName, const ValidationState& state);
 
   /**
-   * @brief create a checker from configuration section
+   * @brief Create a checker from configuration section.
    *
    * @param configSection The section containing the definition of checker.
    * @param configFilename The configuration file name.
@@ -102,7 +102,7 @@
 
 protected:
   /**
-   * @brief Base version of name checking
+   * @brief Base version of name checking.
    * @return always returns accept()
    */
   virtual Result
diff --git a/ndn-cxx/security/validator-config/name-relation.hpp b/ndn-cxx/security/validator-config/name-relation.hpp
index 3f6c6a0..8559770 100644
--- a/ndn-cxx/security/validator-config/name-relation.hpp
+++ b/ndn-cxx/security/validator-config/name-relation.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -40,13 +40,13 @@
 operator<<(std::ostream& os, NameRelation relation);
 
 /**
- * @brief check whether @p name1 and @p name2 satisfies @p relation
+ * @brief Check whether @p name1 and @p name2 satisfies @p relation.
  */
 bool
 checkNameRelation(NameRelation relation, const Name& name1, const Name& name2);
 
 /**
- * @brief convert @p relationString to NameRelation
+ * @brief Convert @p relationString to NameRelation.
  * @throw Error if @p relationString cannot be converted
  */
 NameRelation
diff --git a/ndn-cxx/security/validator-config/rule.hpp b/ndn-cxx/security/validator-config/rule.hpp
index 4d51fe8..e2d3daf 100644
--- a/ndn-cxx/security/validator-config/rule.hpp
+++ b/ndn-cxx/security/validator-config/rule.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -57,7 +57,7 @@
   addChecker(unique_ptr<Checker> checker);
 
   /**
-   * @brief check if the packet name matches rule's filter
+   * @brief Check if the packet name matches rule's filter.
    *
    * If no filters were added, the rule matches everything.
    *
@@ -93,7 +93,7 @@
 
 public:
   /**
-   * @brief create a rule from configuration section
+   * @brief Create a rule from configuration section.
    *
    * @param configSection The section containing the definition of checker.
    * @param configFilename The configuration file name.
diff --git a/ndn-cxx/security/validator.hpp b/ndn-cxx/security/validator.hpp
index 1e453ec..3fc011e 100644
--- a/ndn-cxx/security/validator.hpp
+++ b/ndn-cxx/security/validator.hpp
@@ -102,7 +102,7 @@
   }
 
   /**
-   * @brief Asynchronously validate @p data
+   * @brief Asynchronously validate @p data.
    *
    * @note @p successCb and @p failureCb must not be nullptr
    */
@@ -112,7 +112,7 @@
            const DataValidationFailureCallback& failureCb);
 
   /**
-   * @brief Asynchronously validate @p interest
+   * @brief Asynchronously validate @p interest.
    *
    * @note @p successCb and @p failureCb must not be nullptr
    */
@@ -123,7 +123,7 @@
 
 public: // anchor management
   /**
-   * @brief load static trust anchor.
+   * @brief Load static trust anchor.
    *
    * Static trust anchors are permanently associated with the validator and never expire.
    *
@@ -134,7 +134,7 @@
   loadAnchor(const std::string& groupId, Certificate&& cert);
 
   /**
-   * @brief load dynamic trust anchors.
+   * @brief Load dynamic trust anchors.
    *
    * Dynamic trust anchors are associated with the validator for as long as the underlying
    * trust anchor file (set of files) exist(s).
@@ -149,13 +149,13 @@
              time::nanoseconds refreshPeriod, bool isDir = false);
 
   /**
-   * @brief remove any previously loaded static or dynamic trust anchor
+   * @brief Remove any previously loaded static or dynamic trust anchor.
    */
   void
   resetAnchors();
 
   /**
-   * @brief Cache verified @p cert a period of time (1 hour)
+   * @brief Cache verified @p cert a period of time (1 hour).
    *
    * @todo Add ability to customize time period
    */
@@ -163,14 +163,14 @@
   cacheVerifiedCertificate(Certificate&& cert);
 
   /**
-   * @brief Remove any cached verified certificates
+   * @brief Remove any cached verified certificates.
    */
   void
   resetVerifiedCertificates();
 
 private: // Common validator operations
   /**
-   * @brief Recursive validation of the certificate in the certification chain
+   * @brief Recursive validation of the certificate in the certification chain.
    *
    * @param cert   The certificate to check.
    * @param state  The current validation state.
diff --git a/ndn-cxx/signature-info.hpp b/ndn-cxx/signature-info.hpp
index 87f5531..afb3ff5 100644
--- a/ndn-cxx/signature-info.hpp
+++ b/ndn-cxx/signature-info.hpp
@@ -27,7 +27,8 @@
 
 namespace ndn {
 
-/** @brief Represents a SignatureInfo or InterestSignatureInfo TLV element
+/**
+ * @brief Represents a `%SignatureInfo` or `%InterestSignatureInfo` TLV element.
  */
 class SignatureInfo
 {
@@ -71,7 +72,7 @@
    *  @param encoder EncodingEstimator or EncodingBuffer instance
    *  @param type Which type of SignatureInfo block to encode
    *
-   *  Elements are encoded in the following order: SignatureType, KeyLocator (if present), and
+   *  Elements are encoded in the following order: `SignatureType`, `%KeyLocator` (if present), and
    *  other elements in the order they were set (changing the value of an already present element
    *  will not change that element's encoding order).
    */
@@ -82,7 +83,7 @@
   /** @brief Encode to wire format
    *  @param type Which type of SignatureInfo block to encode
    *
-   *  Elements are encoded in the following order: SignatureType, KeyLocator (if present), and
+   *  Elements are encoded in the following order: `SignatureType`, `%KeyLocator` (if present), and
    *  other elements in the order they were set (changing the value of an already present element
    *  will not change that element's encoding order).
    */
@@ -106,8 +107,8 @@
   }
 
 public: // field access
-  /** @brief Get SignatureType
-   *  @return tlv::SignatureTypeValue, or -1 to indicate an invalid SignatureInfo
+  /** @brief Get the `SignatureType`.
+   *  @return tlv::SignatureTypeValue, or -1 to indicate an invalid SignatureInfo.
    */
   int32_t
   getSignatureType() const noexcept
@@ -115,13 +116,13 @@
     return m_type;
   }
 
-  /** @brief Set SignatureType
-   *  @return A reference to this SignatureInfo, to allow chaining
+  /** @brief Set the `SignatureType`.
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setSignatureType(tlv::SignatureTypeValue type);
 
-  /** @brief Check if KeyLocator is present
+  /** @brief Check if `%KeyLocator` is present.
    */
   bool
   hasKeyLocator() const noexcept
@@ -129,30 +130,32 @@
     return m_keyLocator.has_value();
   }
 
-  /** @brief Get KeyLocator
-   *  @throw Error This SignatureInfo does not contain a KeyLocator
+  /** @brief Get the `%KeyLocator` element.
+   *  @throw Error This SignatureInfo does not contain a `%KeyLocator` element.
    */
   const KeyLocator&
   getKeyLocator() const;
 
-  /** @brief Set KeyLocator
-   *  @return A reference to this SignatureInfo, to allow chaining
+  /** @brief Set or unset the `%KeyLocator` element.
    *
-   *  Passing `nullopt` will remove the KeyLocator.
+   *  Passing `nullopt` will remove the `%KeyLocator` element.
+   *
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setKeyLocator(optional<KeyLocator> keyLocator);
 
-  /** @brief Get ValidityPeriod
+  /** @brief Get the `ValidityPeriod` element.
    *  @throw Error This SignatureInfo does not contain a ValidityPeriod
    */
   security::ValidityPeriod
   getValidityPeriod() const;
 
-  /** @brief Append or replace ValidityPeriod
-   *  @return A reference to this SignatureInfo, to allow chaining
+  /** @brief Append, replace, or remove the `ValidityPeriod` element.
    *
-   *  Passing `nullopt` will remove the ValidityPeriod.
+   *  Passing `nullopt` will remove the `ValidityPeriod` element.
+   *
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setValidityPeriod(optional<security::ValidityPeriod> validityPeriod);
@@ -164,9 +167,10 @@
   getNonce() const;
 
   /** @brief Append or replace SignatureNonce
-   *  @return A reference to this SignatureInfo, to allow chaining
    *
    *  Passing `nullopt` will remove the SignatureNonce.
+   *
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setNonce(optional<span<const uint8_t>> nonce);
@@ -178,9 +182,10 @@
   getTime() const;
 
   /** @brief Append or replace SignatureTime
-   *  @return A reference to this SignatureInfo, to allow chaining
    *
    *  Passing `nullopt` will remove the SignatureTime.
+   *
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setTime(optional<time::system_clock::time_point> time = time::system_clock::now());
@@ -192,9 +197,10 @@
   getSeqNum() const;
 
   /** @brief Append or replace SignatureSeqNum
-   *  @return A reference to this SignatureInfo, to allow chaining
    *
    *  Passing `nullopt` will remove the SignatureSeqNum.
+   *
+   *  @return A reference to this SignatureInfo, to allow chaining.
    */
   SignatureInfo&
   setSeqNum(optional<uint64_t> seqNum);
diff --git a/ndn-cxx/tag.hpp b/ndn-cxx/tag.hpp
index 383d973..ac3f1d3 100644
--- a/ndn-cxx/tag.hpp
+++ b/ndn-cxx/tag.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -25,20 +25,19 @@
 namespace ndn {
 
 /**
- * @brief Base class for packet tags that can hold any arbitrary information
+ * @brief Base class for packet tags that can hold any arbitrary information.
  */
 class Tag
 {
 public:
   virtual
-  ~Tag();
+  ~Tag() = default;
 
+#ifdef DOXYGEN
   /**
-   * @fn static constexpr int getTypeId() noexcept
-   * @return an integer that uniquely identifies this Tag type
+   * @brief Returns an integer that uniquely identifies this Tag type.
    * @sa https://redmine.named-data.net/projects/ndn-cxx/wiki/PacketTagTypes
    */
-#ifdef DOXYGEN
   static constexpr int
   getTypeId() noexcept
   {
@@ -47,12 +46,10 @@
 #endif // DOXYGEN
 };
 
-inline
-Tag::~Tag() = default;
-
-/** @brief provides a tag type for simple types
- *  @tparam T the value type
- *  @tparam TypeId the TypeId
+/**
+ * @brief Provides a tag type for simple types.
+ * @tparam T the value type
+ * @tparam TypeId the TypeId
  */
 template<typename T, int TypeId>
 class SimpleTag : public Tag
@@ -64,7 +61,8 @@
     return TypeId;
   }
 
-  /** \brief explicitly convertible from T
+  /**
+   * \brief Explicitly convertible from \c T.
    */
   constexpr explicit
   SimpleTag(const T& value) noexcept
@@ -72,15 +70,17 @@
   {
   }
 
-  /** \brief implicitly convertible to T
-   *  \return a copy of the enclosed value
+  /**
+   * \brief Implicitly convertible to \c T.
+   * \return A copy of the enclosed value.
    */
   operator T() const
   {
     return m_value;
   }
 
-  /** \return the enclosed value
+  /**
+   * \brief Returns the enclosed value.
    */
   constexpr const T&
   get() const noexcept
diff --git a/ndn-cxx/transport/detail/stream-transport-with-resolver-impl.hpp b/ndn-cxx/transport/detail/stream-transport-with-resolver-impl.hpp
index f8ebe31..ded87f6 100644
--- a/ndn-cxx/transport/detail/stream-transport-with-resolver-impl.hpp
+++ b/ndn-cxx/transport/detail/stream-transport-with-resolver-impl.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -27,8 +27,8 @@
 namespace ndn {
 namespace detail {
 
-/** \brief implementation detail of a Boost.Asio-based stream-oriented transport
- *         with resolver support
+/** \brief Implementation detail of a Boost.Asio-based stream-oriented transport
+ *         with resolver support.
  */
 template<typename BaseTransport, typename Protocol>
 class StreamTransportWithResolverImpl : public StreamTransportImpl<BaseTransport, Protocol>
diff --git a/ndn-cxx/transport/tcp-transport.hpp b/ndn-cxx/transport/tcp-transport.hpp
index 95c28ea..a40ba0f 100644
--- a/ndn-cxx/transport/tcp-transport.hpp
+++ b/ndn-cxx/transport/tcp-transport.hpp
@@ -38,7 +38,7 @@
 
 } // namespace detail
 
-/** \brief a transport using TCP socket
+/** \brief A transport using TCP socket.
  */
 class TcpTransport : public Transport
 {
@@ -63,7 +63,7 @@
   void
   send(const Block& wire) override;
 
-  /** \brief Create transport with parameters defined in URI
+  /** \brief Create transport with parameters defined in URI.
    *  \throw Transport::Error incorrect URI or unsupported protocol is specified
    */
   static shared_ptr<TcpTransport>
diff --git a/ndn-cxx/transport/unix-transport.hpp b/ndn-cxx/transport/unix-transport.hpp
index 2d1ef05..4a31a59 100644
--- a/ndn-cxx/transport/unix-transport.hpp
+++ b/ndn-cxx/transport/unix-transport.hpp
@@ -35,7 +35,7 @@
 
 } // namespace detail
 
-/** \brief a transport using Unix stream socket
+/** \brief A transport using Unix stream socket.
  */
 class UnixTransport : public Transport
 {
@@ -60,7 +60,7 @@
   void
   send(const Block& wire) override;
 
-  /** \brief Create transport with parameters defined in URI
+  /** \brief Create transport with parameters defined in URI.
    *  \throw Transport::Error incorrect URI or unsupported protocol is specified
    */
   static shared_ptr<UnixTransport>
diff --git a/ndn-cxx/util/concepts.hpp b/ndn-cxx/util/concepts.hpp
index 24968fc..7170c9d 100644
--- a/ndn-cxx/util/concepts.hpp
+++ b/ndn-cxx/util/concepts.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021 Regents of the University of California,
+ * Copyright (c) 2014-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -38,7 +38,7 @@
 
 namespace ndn {
 
-/** \brief a concept check for TLV abstraction with .wireEncode method
+/** \brief A concept check for TLV abstraction with a `wireEncode()` method.
  */
 template<class X>
 class WireEncodable
@@ -54,7 +54,7 @@
   X j;
 };
 
-/** \brief a concept check for TLV abstraction with .wireEncode method
+/** \brief A concept check for TLV abstraction with a `wireEncode(EncodingBuffer)` method.
  */
 template<class X>
 class WireEncodableWithEncodingBuffer
@@ -73,8 +73,8 @@
   X j;
 };
 
-/** \brief a concept check for TLV abstraction with .wireDecode method
- *         and constructible from Block
+/** \brief A concept check for TLV abstraction with a `wireDecode(Block)` method
+ *         and constructible from Block.
  */
 template<class X>
 class WireDecodable
@@ -108,7 +108,7 @@
 
 } // namespace detail
 
-/** \brief concept check for an item in a Status Dataset
+/** \brief Concept check for an item in a Status Dataset.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
  */
 template<class X>
@@ -116,7 +116,7 @@
 {
 };
 
-/** \brief concept check for an item in a Notification Stream
+/** \brief Concept check for an item in a Notification Stream.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
  */
 template<class X>
@@ -139,7 +139,7 @@
 } // namespace detail
 } // namespace ndn
 
-/** \brief assert T is a forward iterator
+/** \brief Assert T is a forward iterator.
  *  \sa http://en.cppreference.com/w/cpp/concept/ForwardIterator
  *  \note A forward iterator should be default constructible, but boost::ForwardIterator follows
  *        SGI standard which doesn't require DefaultConstructible, so a separate check is needed.
diff --git a/ndn-cxx/util/dummy-client-face.hpp b/ndn-cxx/util/dummy-client-face.hpp
index 4b86222..22a80d8 100644
--- a/ndn-cxx/util/dummy-client-face.hpp
+++ b/ndn-cxx/util/dummy-client-face.hpp
@@ -34,7 +34,7 @@
 class DummyClientFace : public ndn::Face
 {
 public:
-  /** \brief options for DummyClientFace
+  /** \brief %Options for DummyClientFace.
    */
   class Options
   {
@@ -58,12 +58,12 @@
     }
 
   public:
-    /** \brief if true, packets sent out of DummyClientFace will be appended to a container
+    /** \brief If true, packets sent out of DummyClientFace will be appended to a container.
      */
     bool enablePacketLogging;
 
-    /** \brief if true, prefix registration command will be automatically
-     *         replied with a successful response
+    /** \brief If true, prefix registration command will be automatically
+     *         replied with a successful response.
      */
     bool enableRegistrationReply;
 
@@ -71,7 +71,7 @@
      */
     uint64_t registrationReplyFaceId = 1;
 
-    /** \brief if not empty, face.processEvents() will be overridden by this function
+    /** \brief If not empty, `face.processEvents()` will be overridden by this function.
      */
     std::function<void(time::milliseconds)> processEventsOverride;
   };
@@ -82,49 +82,49 @@
     AlreadyLinkedError();
   };
 
-  /** \brief Create a dummy face with internal IO service
+  /** \brief Create a dummy face with internal IO service.
    */
   explicit
   DummyClientFace(const Options& options = Options());
 
-  /** \brief Create a dummy face with internal IO service and the specified KeyChain
+  /** \brief Create a dummy face with internal IO service and the specified KeyChain.
    */
   explicit
   DummyClientFace(KeyChain& keyChain, const Options& options = Options());
 
-  /** \brief Create a dummy face with the provided IO service
+  /** \brief Create a dummy face with the provided IO service.
    */
   explicit
   DummyClientFace(boost::asio::io_service& ioService, const Options& options = Options());
 
-  /** \brief Create a dummy face with the provided IO service and the specified KeyChain
+  /** \brief Create a dummy face with the provided IO service and the specified KeyChain.
    */
   DummyClientFace(boost::asio::io_service& ioService, KeyChain& keyChain,
                   const Options& options = Options());
 
   ~DummyClientFace() override;
 
-  /** \brief cause the Face to receive an interest
+  /** \brief Cause the Face to receive an Interest packet.
    */
   void
   receive(const Interest& interest);
 
-  /** \brief cause the Face to receive a data
+  /** \brief Cause the Face to receive a Data packet.
    */
   void
   receive(const Data& data);
 
-  /** \brief cause the Face to receive a nack
+  /** \brief Cause the Face to receive a Nack packet.
    */
   void
   receive(const lp::Nack& nack);
 
-  /** \brief link another DummyClientFace through a broadcast media
+  /** \brief Link another DummyClientFace through a broadcast media.
    */
   void
   linkTo(DummyClientFace& other);
 
-  /** \brief unlink the broadcast media if previously linked
+  /** \brief Unlink the broadcast media if previously linked.
    */
   void
   unlink();
@@ -148,7 +148,7 @@
   doProcessEvents(time::milliseconds timeout, bool keepThread) override;
 
 public:
-  /** \brief Interests sent out of this DummyClientFace
+  /** \brief Interests sent out of this DummyClientFace.
    *
    *  Sent Interests are appended to this container if options.enablePacketLogger is true.
    *  User of this class is responsible for cleaning up the container, if necessary.
@@ -156,7 +156,7 @@
    */
   std::vector<Interest> sentInterests;
 
-  /** \brief Data sent out of this DummyClientFace
+  /** \brief Data sent out of this DummyClientFace.
    *
    *  Sent Data are appended to this container if options.enablePacketLogger is true.
    *  User of this class is responsible for cleaning up the container, if necessary.
@@ -164,7 +164,7 @@
    */
   std::vector<Data> sentData;
 
-  /** \brief Nacks sent out of this DummyClientFace
+  /** \brief Nacks sent out of this DummyClientFace.
    *
    *  Sent Nacks are appended to this container if options.enablePacketLogger is true.
    *  User of this class is responsible for cleaning up the container, if necessary.
@@ -172,19 +172,19 @@
    */
   std::vector<lp::Nack> sentNacks;
 
-  /** \brief emits whenever an Interest is sent
+  /** \brief Emits whenever an Interest is sent.
    *
    *  After .expressInterest, .processEvents must be called before this signal would be emitted.
    */
   Signal<DummyClientFace, Interest> onSendInterest;
 
-  /** \brief emits whenever a Data packet is sent
+  /** \brief Emits whenever a Data packet is sent.
    *
    *  After .put, .processEvents must be called before this signal would be emitted.
    */
   Signal<DummyClientFace, Data> onSendData;
 
-  /** \brief emits whenever a Nack is sent
+  /** \brief Emits whenever a Nack is sent.
    *
    *  After .put, .processEvents must be called before this signal would be emitted.
    */
diff --git a/ndn-cxx/util/io.hpp b/ndn-cxx/util/io.hpp
index 576f3f8..52c7814 100644
--- a/ndn-cxx/util/io.hpp
+++ b/ndn-cxx/util/io.hpp
@@ -79,7 +79,7 @@
 
 /**
  * \brief Reads bytes from a stream until EOF.
- * \return a Buffer containing the bytes read from the stream
+ * \return A Buffer containing the bytes read from the stream.
  * \throw Error An error occurred, e.g., malformed input.
  * \throw std::invalid_argument The specified encoding is not supported.
  */
@@ -89,7 +89,7 @@
 /**
  * \brief Reads a TLV element of type `T` from a stream.
  * \tparam T Class type representing the TLV element; must be WireDecodable.
- * \return the parsed TLV element
+ * \return The parsed TLV element.
  * \throw Error An error occurred, e.g., malformed input.
  * \throw std::invalid_argument The specified encoding is not supported.
  */
@@ -112,7 +112,7 @@
  * \brief Reads a TLV element from a stream.
  * \tparam T Type of TLV element; `T` must be WireDecodable and the nested type
  *           `T::Error`, if defined, must be a subclass of ndn::tlv::Error.
- * \return the TLV element, or nullptr if an error occurs
+ * \return The TLV element, or nullptr if an error occurs.
  * \note This function has a peculiar error handling behavior. Consider using loadTlv() instead.
  */
 template<typename T>
@@ -145,7 +145,7 @@
  * \brief Reads a TLV element from a file.
  * \tparam T Type of TLV element; `T` must be WireDecodable and the nested type
  *           `T::Error`, if defined, must be a subclass of ndn::tlv::Error.
- * \return the TLV element, or nullptr if an error occurs
+ * \return The TLV element, or nullptr if an error occurs.
  * \note This function has a peculiar error handling behavior. Consider using loadTlv() instead.
  */
 template<typename T>
diff --git a/ndn-cxx/util/logger.cpp b/ndn-cxx/util/logger.cpp
index f845ff8..4ebdf15 100644
--- a/ndn-cxx/util/logger.cpp
+++ b/ndn-cxx/util/logger.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -75,10 +75,6 @@
   NDN_THROW(std::invalid_argument("unrecognized log level '" + s + "'"));
 }
 
-/**
- * \brief checks if incoming logger name meets criteria
- * \param name name of logger
- */
 static bool
 isValidLoggerName(const std::string& name)
 {
diff --git a/ndn-cxx/util/notification-stream.hpp b/ndn-cxx/util/notification-stream.hpp
index c5a25e8..de37498 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-2021 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 namespace ndn {
 namespace util {
 
-/** \brief provides a publisher of Notification Stream
+/** \brief Provides a publisher of Notification Stream.
  *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
  */
 template<typename Notification>
diff --git a/ndn-cxx/util/notification-subscriber.hpp b/ndn-cxx/util/notification-subscriber.hpp
index fcd0ed9..3b78fdb 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-2021 Regents of the University of California,
+ * Copyright (c) 2014-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -43,7 +43,7 @@
   virtual
   ~NotificationSubscriberBase();
 
-  /** \return InterestLifetime of Interests to retrieve notifications
+  /** \return InterestLifetime of Interests to retrieve notifications.
    *
    *  This must be greater than FreshnessPeriod of Notification Data packets,
    *  to ensure correct operation of this subscriber implementation.
@@ -60,22 +60,22 @@
     return m_isRunning;
   }
 
-  /** \brief start or resume receiving notifications
+  /** \brief Start or resume receiving notifications.
    *  \note onNotification must have at least one listener,
    *        otherwise this operation has no effect.
    */
   void
   start();
 
-  /** \brief stop receiving notifications
+  /** \brief Stop receiving notifications.
    */
   void
   stop();
 
 protected:
-  /** \brief construct a NotificationSubscriber
+  /** \brief Construct a NotificationSubscriber.
    *  \note The subscriber is not started after construction.
-   *        User should add one or more handlers to onNotification, and invoke .start().
+   *        User should add one or more handlers to onNotification, and invoke start().
    */
   NotificationSubscriberBase(Face& face, const Name& prefix,
                              time::milliseconds interestLifetime);
@@ -102,7 +102,7 @@
   void
   afterReceiveData(const Data& data);
 
-  /** \brief decode the Data as a notification, and deliver it to subscribers
+  /** \brief Decode the Data as a notification, and deliver it to subscribers.
    *  \return whether decode was successful
    */
   virtual bool
@@ -118,15 +118,15 @@
   exponentialBackoff(lp::Nack nack);
 
 public:
-  /** \brief fires when a NACK is received
+  /** \brief Fires when a Nack is received.
    */
   signal::Signal<NotificationSubscriberBase, lp::Nack> onNack;
 
-  /** \brief fires when no Notification is received within .getInterestLifetime period
+  /** \brief Fires when no Notification is received within getInterestLifetime() period.
    */
   signal::Signal<NotificationSubscriberBase> onTimeout;
 
-  /** \brief fires when a Data packet in the Notification Stream cannot be decoded as Notification
+  /** \brief Fires when a Data packet in the Notification Stream cannot be decoded as Notification.
    */
   signal::Signal<NotificationSubscriberBase, Data> onDecodeError;
 
@@ -143,7 +143,7 @@
   time::milliseconds m_interestLifetime;
 };
 
-/** \brief provides a subscriber of Notification Stream
+/** \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
  */
@@ -154,7 +154,7 @@
   BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<Notification>));
   BOOST_CONCEPT_ASSERT((WireDecodable<Notification>));
 
-  /** \brief construct a NotificationSubscriber
+  /** \brief Construct a NotificationSubscriber.
    *  \note The subscriber is not started after construction.
    *        User should add one or more handlers to onNotification, and invoke .start().
    */
@@ -165,7 +165,7 @@
   }
 
 public:
-  /** \brief fires when a Notification is received
+  /** \brief Fires when a Notification is received.
    *  \note Removing all handlers will cause the subscriber to stop.
    */
   signal::Signal<NotificationSubscriber, Notification> onNotification;
diff --git a/ndn-cxx/util/regex/regex-matcher.hpp b/ndn-cxx/util/regex/regex-matcher.hpp
index 9008cd3..cb7ae05 100644
--- a/ndn-cxx/util/regex/regex-matcher.hpp
+++ b/ndn-cxx/util/regex/regex-matcher.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -61,8 +61,7 @@
   }
 
   /**
-   * @brief get the matched name components
-   * @returns the matched name components
+   * @brief Return the matched name components.
    */
   const std::vector<name::Component>&
   getMatchResult() const
diff --git a/ndn-cxx/util/signal/connection.hpp b/ndn-cxx/util/signal/connection.hpp
index 5eba960..0952261 100644
--- a/ndn-cxx/util/signal/connection.hpp
+++ b/ndn-cxx/util/signal/connection.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 
 using DisconnectFunction = std::function<void()>;
 
-/** \brief represents a connection to a signal
+/** \brief Represents a connection to a signal.
  *  \note This type is copyable. Any copy can be used to disconnect.
  */
 class Connection
@@ -39,7 +39,7 @@
   constexpr
   Connection() noexcept = default;
 
-  /** \brief disconnects from the signal
+  /** \brief Disconnects from the signal.
    *  \note If the connection is already disconnected, or if the Signal has been destructed,
    *        this operation has no effect.
    *  \warning During signal emission, attempting to disconnect a connection other than
@@ -48,7 +48,7 @@
   void
   disconnect();
 
-  /** \brief check if connected to the signal
+  /** \brief Check if connected to the signal.
    */
   bool
   isConnected() const noexcept
@@ -69,7 +69,7 @@
   // NOTE: the following "hidden friend" operators are available via
   //       argument-dependent lookup only and must be defined inline.
 
-  /** \brief compare for equality
+  /** \brief Compare for equality.
    *
    *  Two connections are equal if they both refer to the same connection that isn't disconnected,
    *  or they are both disconnected.
diff --git a/ndn-cxx/util/signal/signal.hpp b/ndn-cxx/util/signal/signal.hpp
index 4b0f8dc..b60ef83 100644
--- a/ndn-cxx/util/signal/signal.hpp
+++ b/ndn-cxx/util/signal/signal.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -33,7 +33,7 @@
 
 class DummyExtraArg;
 
-/** \brief provides a lightweight signal / event system
+/** \brief Provides a lightweight signal / event system.
  *
  *  To declare a signal:
  *    public:
@@ -52,7 +52,7 @@
 class Signal : noncopyable
 {
 public: // API for anyone
-  /** \brief represents a function that can connect to the signal
+  /** \brief Represents a function that can connect to the signal.
    */
   typedef function<void(const TArgs&...)> Handler;
 
@@ -60,14 +60,14 @@
 
   ~Signal();
 
-  /** \brief connects a handler to the signal
+  /** \brief Connects a handler to the signal.
    *  \note If invoked from a handler, the new handler won't receive the current emitted signal.
    *  \warning The handler is permitted to disconnect itself, but it must ensure its validity.
    */
   Connection
   connect(Handler handler);
 
-  /** \brief connects a single-shot handler to the signal
+  /** \brief Connects a single-shot handler to the signal.
    *
    *  After the handler is executed once, it is automatically disconnected.
    */
@@ -80,7 +80,7 @@
   bool
   isEmpty() const;
 
-  /** \brief emits a signal
+  /** \brief Emits a signal.
    *  \param args arguments passed to all handlers
    *  \warning Emitting the signal from a handler is undefined behavior.
    *  \warning Destructing the Signal object during signal emission is undefined behavior.
@@ -90,7 +90,7 @@
   void
   operator()(const TArgs&... args);
 
-  /** \brief (implementation detail) emits a signal
+  /** \brief (implementation detail) Emits a signal.
    *  \note This overload is used by signal-emit.hpp.
    */
   void
@@ -102,15 +102,15 @@
 private: // internal implementation
   typedef Signal<Owner, TArgs...> Self;
 
-  /** \brief stores a handler function, and a function to disconnect this handler
+  /** \brief Stores a handler function, and a function to disconnect this handler.
    */
   struct Slot
   {
-    /** \brief the handler function who will receive emitted signals
+    /** \brief The handler function who will receive emitted signals.
      */
     Handler handler;
 
-    /** \brief the disconnect function which will disconnect this handler
+    /** \brief The disconnect function which will disconnect this handler.
      *
      *  In practice this is the Signal::disconnect method bound to an iterator
      *  pointing at this slot.
@@ -123,23 +123,23 @@
     shared_ptr<DisconnectFunction> disconnect;
   };
 
-  /** \brief stores slots
+  /** \brief Stores slots.
    *  \note std::list is used because iterators must not be invalidated
    *        when other slots are added or removed
    */
   typedef std::list<Slot> SlotList;
   SlotList m_slots;
 
-  /** \brief is a signal handler executing?
+  /** \brief Is a signal handler executing?
    */
   bool m_isExecuting;
 
-  /** \brief iterator to current executing slot
+  /** \brief Iterator to current executing slot.
    *  \note This field is meaningful when isExecuting==true
    */
   typename SlotList::iterator m_currentSlot;
 
-  /** \brief disconnects the handler in a slot
+  /** \brief Disconnects the handler in a slot.
    */
   void
   disconnect(typename SlotList::iterator it);
diff --git a/ndn-cxx/util/sqlite3-statement.hpp b/ndn-cxx/util/sqlite3-statement.hpp
index b773c10..4e7427a 100644
--- a/ndn-cxx/util/sqlite3-statement.hpp
+++ b/ndn-cxx/util/sqlite3-statement.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,14 +31,14 @@
 namespace util {
 
 /**
- * @brief wrap an SQLite3 prepared statement
+ * @brief Wrap an SQLite3 prepared statement.
  * @warning This class is implementation detail of ndn-cxx library.
  */
 class Sqlite3Statement : noncopyable
 {
 public:
   /**
-   * @brief initialize and prepare Sqlite3 statement
+   * @brief Initialize and prepare Sqlite3 statement.
    * @param database handler to open sqlite3 database
    * @param statement SQL statement
    * @throw std::domain_error SQL statement is bad
@@ -46,12 +46,12 @@
   Sqlite3Statement(sqlite3* database, const std::string& statement);
 
   /**
-   * @brief finalize the statement
+   * @brief Finalize the statement.
    */
   ~Sqlite3Statement();
 
   /**
-   * @brief bind a string to the statement
+   * @brief Bind a string to the statement.
    *
    * @param index The binding position
    * @param value The pointer of the binding string
@@ -63,7 +63,7 @@
   bind(int index, const char* value, size_t size, void(*destructor)(void*));
 
   /**
-   * @brief bind a string to the statement
+   * @brief Bind a string to the statement.
    *
    * @param index The binding position
    * @param value The binding string
@@ -74,7 +74,7 @@
   bind(int index, const std::string& value, void(*destructor)(void*));
 
   /**
-   * @brief bind a byte blob to the statement
+   * @brief Bind a byte blob to the statement.
    *
    * @param index The binding position
    * @param value The pointer of the blob
@@ -86,7 +86,7 @@
   bind(int index, const void* value, size_t size, void(*destructor)(void*));
 
   /**
-   * @brief bind a byte blob to the statement
+   * @brief Bind a byte blob to the statement.
    *
    * @param index The binding position
    * @param block The binding block
@@ -97,7 +97,7 @@
   bind(int index, const Block& block, void(*destructor)(void*));
 
   /**
-   * @brief bind an integer to the statement
+   * @brief Bind an integer to the statement.
    *
    * @param index The binding position
    * @param number The binding integer
@@ -107,43 +107,43 @@
   bind(int index, int number);
 
   /**
-   * @brief get a string from @p column.
+   * @brief Get a string from @p column.
    */
   std::string
   getString(int column);
 
   /**
-   * @brief get a block from @p column.
+   * @brief Get a block from @p column.
    */
   Block
   getBlock(int column);
 
   /**
-   * @brief get an integer from @p column.
+   * @brief Get an integer from @p column.
    */
   int
   getInt(int column);
 
   /**
-   * @brief get a pointer of byte blob from @p column.
+   * @brief Get a pointer of byte blob from @p column.
    */
   const uint8_t*
   getBlob(int column);
 
   /**
-   * @brief get the size of @p column.
+   * @brief Get the size of @p column.
    */
   int
   getSize(int column);
 
   /**
-   * @brief wrapper of sqlite3_step
+   * @brief Wrapper of `sqlite3_step`.
    */
   int
   step();
 
   /**
-   * @brief implicitly converts to sqlite3_stmt* to be used in SQLite C API
+   * @brief Implicitly converts to `sqlite3_stmt*` to be used in SQLite C API.
    */
   operator sqlite3_stmt*();
 
diff --git a/ndn-cxx/util/time.hpp b/ndn-cxx/util/time.hpp
index 0d55431..7792faa 100644
--- a/ndn-cxx/util/time.hpp
+++ b/ndn-cxx/util/time.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -49,7 +49,7 @@
 using microseconds = boost::chrono::microseconds;
 using nanoseconds  = boost::chrono::nanoseconds;
 
-/** \return the absolute value of the duration d
+/** \return The absolute value of the duration \p d.
  *  \note The function does not participate in the overload resolution
  *        unless std::numeric_limits<Rep>::is_signed is true.
  */
diff --git a/tests/unit/dummy-validator.hpp b/tests/unit/dummy-validator.hpp
index be0adb3..63b7556 100644
--- a/tests/unit/dummy-validator.hpp
+++ b/tests/unit/dummy-validator.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2020 Regents of the University of California.
+ * Copyright (c) 2013-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -29,12 +29,13 @@
 namespace ndn {
 namespace tests {
 
-/** \brief A validation policy for unit testing
+/**
+ * \brief A dummy validation policy for unit testing.
  */
 class DummyValidationPolicy : public security::ValidationPolicy
 {
 public:
-  /** \brief constructor
+  /** \brief Constructor.
    *  \param shouldAccept whether to accept or reject all validation requests
    */
   explicit
@@ -43,7 +44,7 @@
     this->setResult(shouldAccept);
   }
 
-  /** \brief change the validation result
+  /** \brief Change the validation result.
    *  \param shouldAccept whether to accept or reject all validation requests
    */
   void
@@ -52,7 +53,7 @@
     m_decide = [shouldAccept] (const Name&) { return shouldAccept; };
   }
 
-  /** \brief set a callback for validation
+  /** \brief Set a callback for validation.
    *  \param cb a callback which receives the Interest/Data name for each validation request;
    *            its return value determines the validation result
    */
diff --git a/tests/unit/mgmt/nfd/controller-fixture.hpp b/tests/unit/mgmt/nfd/controller-fixture.hpp
index 764ff41..ae4ab3c 100644
--- a/tests/unit/mgmt/nfd/controller-fixture.hpp
+++ b/tests/unit/mgmt/nfd/controller-fixture.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-2022 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -48,7 +48,7 @@
     m_keyChain.setDefaultIdentity(m_keyChain.createIdentity("/localhost/ControllerFixture"));
   }
 
-  /** \brief controls whether Controller's validator should accept or reject validation requests
+  /** \brief Controls whether Controller's validator should accept or reject validation requests.
    *
    *  Initially, the validator accepts all requests.
    *  Setting \p false causes validator to reject all requests.
diff --git a/tests/unit/mgmt/nfd/status-dataset.t.cpp b/tests/unit/mgmt/nfd/status-dataset.t.cpp
index b9cc84d..633a45d 100644
--- a/tests/unit/mgmt/nfd/status-dataset.t.cpp
+++ b/tests/unit/mgmt/nfd/status-dataset.t.cpp
@@ -37,7 +37,7 @@
 class ControllerStatusDatasetFixture : public ControllerFixture
 {
 protected:
-  /** \brief send one WireEncodable as Data reply
+  /** \brief Send one WireEncodable as Data reply.
    *  \param prefix dataset prefix without version and segment
    *  \param payload payload block
    *  \note payload must fit in one Data
@@ -53,7 +53,7 @@
     face.receive(*signData(data));
   }
 
-  /** \brief send two WireEncodables as Data reply
+  /** \brief Send two WireEncodables as Data reply.
    *  \param prefix dataset prefix without version and segment
    *  \param payload1 first vector item
    *  \param payload2 second vector item
diff --git a/tests/unit/util/io.t.cpp b/tests/unit/util/io.t.cpp
index 270270c..9fcafd7 100644
--- a/tests/unit/util/io.t.cpp
+++ b/tests/unit/util/io.t.cpp
@@ -114,7 +114,7 @@
   }
 
   /**
-   * \brief create a directory at `filepath`, so that it's neither readable nor writable as a file
+   * \brief Create a directory at `filepath`, so that it's neither readable nor writable as a file.
    */
   void
   mkdir() const
diff --git a/tests/unit/util/notification-subscriber.t.cpp b/tests/unit/util/notification-subscriber.t.cpp
index 3936e9e..896f632 100644
--- a/tests/unit/util/notification-subscriber.t.cpp
+++ b/tests/unit/util/notification-subscriber.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2021 Regents of the University of California,
+ * Copyright (c) 2014-2022 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -49,7 +49,7 @@
   {
   }
 
-  /** \brief deliver one notification to subscriber
+  /** \brief Deliver one notification to subscriber.
    */
   void
   deliverNotification(const std::string& msg)
@@ -69,7 +69,7 @@
     subscriberFace.receive(data);
   }
 
-  /** \brief deliver a Nack to subscriber
+  /** \brief Deliver a Nack to subscriber.
    */
   void
   deliverNack(const Interest& interest, const lp::NackReason& reason)
