diff --git a/ndn-cxx/data.cpp b/ndn-cxx/data.cpp
index a54458c..35031ac 100644
--- a/ndn-cxx/data.cpp
+++ b/ndn-cxx/data.cpp
@@ -211,7 +211,7 @@
       NDN_THROW(Error("Cannot compute full name because Data has no wire encoding (not signed)"));
     }
     m_fullName = m_name;
-    m_fullName.appendImplicitSha256Digest(util::Sha256::computeDigest(m_wire.wire(), m_wire.size()));
+    m_fullName.appendImplicitSha256Digest(util::Sha256::computeDigest({m_wire.wire(), m_wire.size()}));
   }
 
   return m_fullName;
diff --git a/ndn-cxx/encoding/block.cpp b/ndn-cxx/encoding/block.cpp
index 56a1477..4b2992a 100644
--- a/ndn-cxx/encoding/block.cpp
+++ b/ndn-cxx/encoding/block.cpp
@@ -111,7 +111,7 @@
   }
 }
 
-Block::Block(const Block& block, Buffer::const_iterator begin, Buffer::const_iterator end,
+Block::Block(const Block& block, Block::const_iterator begin, Block::const_iterator end,
              bool verifyLength)
   : Block(block.m_buffer, begin, end, verifyLength)
 {
@@ -274,7 +274,7 @@
   m_begin = m_end = m_valueBegin = m_valueEnd = {};
 }
 
-Buffer::const_iterator
+Block::const_iterator
 Block::begin() const
 {
   if (!hasWire())
@@ -283,7 +283,7 @@
   return m_begin;
 }
 
-Buffer::const_iterator
+Block::const_iterator
 Block::end() const
 {
   if (!hasWire())
@@ -475,6 +475,13 @@
   m_elements.push_back(element);
 }
 
+void
+Block::push_back(Block&& element)
+{
+  resetWire();
+  m_elements.push_back(std::move(element));
+}
+
 Block::element_iterator
 Block::insert(Block::element_const_iterator pos, const Block& element)
 {
@@ -515,7 +522,7 @@
   }
   else if (block.value_size() > 0) {
     os << block.type() << '[' << block.value_size() << "]=";
-    printHex(os, block.value(), block.value_size(), true);
+    printHex(os, {block.value(), block.value_size()}, true);
   }
   else {
     os << block.type() << "[empty]";
diff --git a/ndn-cxx/encoding/block.hpp b/ndn-cxx/encoding/block.hpp
index 9da1946..34b9619 100644
--- a/ndn-cxx/encoding/block.hpp
+++ b/ndn-cxx/encoding/block.hpp
@@ -44,6 +44,8 @@
 class Block
 {
 public:
+  using value_type             = Buffer::value_type;
+  using const_iterator         = Buffer::const_iterator;
   using element_container      = std::vector<Block>;
   using element_iterator       = element_container::iterator;
   using element_const_iterator = element_container::const_iterator;
@@ -121,7 +123,7 @@
    *  @throw std::invalid_argument [@p begin,@p end) range is not within @p block
    *  @throw tlv::Error Type-Length parsing fails, or TLV-LENGTH does not match size of TLV-VALUE
    */
-  Block(const Block& block, Buffer::const_iterator begin, Buffer::const_iterator end,
+  Block(const Block& block, Block::const_iterator begin, Block::const_iterator end,
         bool verifyLength = true);
 
   /** @brief Create a Block from a wire Buffer without parsing
@@ -141,7 +143,7 @@
    *  @param bufSize size of the raw buffer; may be greater than the actual size of the TLV element
    *  @throw tlv::Error Type-Length parsing fails, or size of TLV-VALUE exceeds @p bufSize
    *  @note This constructor copies the TLV element octets to an internal buffer.
-   *  @deprecated
+   *  @deprecated Use Block(span<const uint8_t>)
    */
   [[deprecated("use the constructor that takes a span<>")]]
   Block(const uint8_t* buf, size_t bufSize);
@@ -246,13 +248,13 @@
   /** @brief Get begin iterator of encoded wire
    *  @pre `hasWire() == true`
    */
-  Buffer::const_iterator
+  const_iterator
   begin() const;
 
   /** @brief Get end iterator of encoded wire
    *  @pre `hasWire() == true`
    */
-  Buffer::const_iterator
+  const_iterator
   end() const;
 
   /** @brief Return a raw pointer to the beginning of the encoded wire
@@ -303,7 +305,7 @@
   /** @brief Get begin iterator of TLV-VALUE
    *  @pre `hasValue() == true`
    */
-  Buffer::const_iterator
+  const_iterator
   value_begin() const
   {
     return m_valueBegin;
@@ -312,7 +314,7 @@
   /** @brief Get end iterator of TLV-VALUE
    *  @pre `hasValue() == true`
    */
-  Buffer::const_iterator
+  const_iterator
   value_end() const
   {
     return m_valueEnd;
@@ -382,11 +384,18 @@
   element_iterator
   erase(element_const_iterator first, element_const_iterator last);
 
-  /** @brief Append a sub-element
+  /**
+   * @brief Append a sub-element.
    */
   void
   push_back(const Block& element);
 
+  /**
+   * @brief Append a sub-element.
+   */
+  void
+  push_back(Block&& element);
+
   /** @brief Insert a sub-element
    *  @param pos position of the new sub-element
    *  @param element new sub-element to insert
diff --git a/ndn-cxx/impl/name-component-types.hpp b/ndn-cxx/impl/name-component-types.hpp
index 0ca8bdf..81b8b8e 100644
--- a/ndn-cxx/impl/name-component-types.hpp
+++ b/ndn-cxx/impl/name-component-types.hpp
@@ -109,11 +109,12 @@
   }
 
 protected:
-  /** \brief Calculate the successor of \p comp, extending TLV-LENGTH if value overflows.
-   *  \return whether TLV-LENGTH was extended, and the successor
+  /**
+   * \brief Calculate the successor of \p comp, extending TLV-LENGTH if value overflows.
+   * \return whether TLV-LENGTH was extended, and the successor
    */
-  std::tuple<bool, Block>
-  getSuccessorImpl(const Component& comp) const
+  static std::tuple<bool, Block>
+  getSuccessorImpl(const Component& comp)
   {
     EncodingBuffer encoder(comp.size() + 9, 9);
     // leave room for additional byte when TLV-VALUE overflows, and for TLV-LENGTH size increase
@@ -137,10 +138,11 @@
     return {isOverflow, encoder.block()};
   }
 
-  /** \brief Write TLV-VALUE as `<escaped-value>` of NDN URI syntax.
+  /**
+   * \brief Write TLV-VALUE as `<escaped-value>` of NDN URI syntax.
    */
-  void
-  writeUriEscapedValue(std::ostream& os, const Component& comp) const
+  static void
+  writeUriEscapedValue(std::ostream& os, const Component& comp)
   {
     bool isAllPeriods = std::all_of(comp.value_begin(), comp.value_end(),
                                     [] (uint8_t x) { return x == '.'; });
@@ -241,14 +243,14 @@
     catch (const StringHelperError&) {
       NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid hex encoding)"));
     }
-    return Component(m_type, std::move(value));
+    return {m_type, std::move(value)};
   }
 
   void
   writeUri(std::ostream& os, const Component& comp) const final
   {
     os << m_uriPrefix << '=';
-    printHex(os, comp.value(), comp.value_size(), false);
+    printHex(os, {comp.value(), comp.value_size()}, false);
   }
 
 private:
diff --git a/ndn-cxx/key-locator.cpp b/ndn-cxx/key-locator.cpp
index 0d35dc9..61659b5 100644
--- a/ndn-cxx/key-locator.cpp
+++ b/ndn-cxx/key-locator.cpp
@@ -201,7 +201,7 @@
     },
     [&] (const Block& digest) {
       os << "KeyDigest=";
-      printHex(os, digest.value(), std::min(digest.value_size(), MAX_KEY_DIGEST_OCTETS_TO_SHOW));
+      printHex(os, {digest.value(), std::min(digest.value_size(), MAX_KEY_DIGEST_OCTETS_TO_SHOW)});
       if (digest.value_size() > MAX_KEY_DIGEST_OCTETS_TO_SHOW) {
         os << "...";
       }
diff --git a/ndn-cxx/name-component.cpp b/ndn-cxx/name-component.cpp
index 61c3afe..6fb973d 100644
--- a/ndn-cxx/name-component.cpp
+++ b/ndn-cxx/name-component.cpp
@@ -169,9 +169,9 @@
     if (value.size() < 3) {
       NDN_THROW(Component::Error("Illegal URI (name component cannot be . or ..)"));
     }
-    return Component(type, reinterpret_cast<const uint8_t*>(value.data()), value.size() - 3);
+    return Component(type, {reinterpret_cast<const uint8_t*>(value.data()), value.size() - 3});
   }
-  return Component(type, reinterpret_cast<const uint8_t*>(value.data()), value.size());
+  return Component(type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
 }
 
 Component
@@ -513,7 +513,7 @@
 
   uint32_t type = this->type() + 1;
   auto value = detail::getComponentTypeTable().get(type).getMinValue();
-  return Component(type, value.data(), value.size());
+  return {type, value};
 }
 
 template<encoding::Tag TAG>
diff --git a/ndn-cxx/name-component.hpp b/ndn-cxx/name-component.hpp
index dde0ae8..47ad17d 100644
--- a/ndn-cxx/name-component.hpp
+++ b/ndn-cxx/name-component.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,12 +152,12 @@
   }
 
   /**
-   * @brief Construct a NameComponent of TLV-TYPE @p type, copying TLV-VALUE from @p buffer.
+   * @brief Construct a NameComponent of TLV-TYPE @p type, copying the TLV-VALUE from @p value.
    */
-  Component(uint32_t type, span<const uint8_t> buffer);
+  Component(uint32_t type, span<const uint8_t> value);
 
   /**
-   * @brief Construct a GenericNameComponent, copying TLV-VALUE from @p buffer.
+   * @brief Construct a GenericNameComponent, copying the TLV-VALUE from @p buffer.
    */
   explicit
   Component(span<const uint8_t> buffer)
@@ -168,7 +168,9 @@
   /**
    * @brief Construct a NameComponent of TLV-TYPE @p type, copying @p count bytes at @p value as
    *        TLV-VALUE.
+   * @deprecated Use Component(uint32_t, span<const uint8_t>)
    */
+  [[deprecated("use the constructor that takes a span<>")]]
   Component(uint32_t type, const uint8_t* value, size_t count)
     : Component(type, {value, count})
   {
@@ -176,7 +178,9 @@
 
   /**
    * @brief Construct a GenericNameComponent, copying @p count bytes at @p value as TLV-VALUE.
+   * @deprecated Use Component(span<const uint8_t>)
    */
+  [[deprecated("use the constructor that takes a span<>")]]
   Component(const uint8_t* value, size_t count)
     : Component(tlv::GenericNameComponent, {value, count})
   {
diff --git a/ndn-cxx/name.cpp b/ndn-cxx/name.cpp
index 43f9725..ec64e14 100644
--- a/ndn-cxx/name.cpp
+++ b/ndn-cxx/name.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.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -170,15 +170,15 @@
 const name::Component&
 Name::at(ssize_t i) const
 {
+  auto ssize = static_cast<ssize_t>(size());
+  if (i < -ssize || i >= ssize) {
+    NDN_THROW(Error("Component at offset " + to_string(i) + " does not exist (out of bounds)"));
+  }
+
   if (i < 0) {
-    i += static_cast<ssize_t>(size());
+    i += ssize;
   }
-
-  if (i < 0 || static_cast<size_t>(i) >= size()) {
-    NDN_THROW(Error("Requested component does not exist (out of bounds)"));
-  }
-
-  return reinterpret_cast<const Component&>(m_wire.elements()[i]);
+  return static_cast<const Component&>(m_wire.elements()[static_cast<size_t>(i)]);
 }
 
 PartialName
@@ -261,8 +261,7 @@
 Name&
 Name::appendParametersSha256DigestPlaceholder()
 {
-  static const Component placeholder(tlv::ParametersSha256DigestComponent,
-                                     SHA256_OF_EMPTY_STRING, sizeof(SHA256_OF_EMPTY_STRING));
+  static const Component placeholder(tlv::ParametersSha256DigestComponent, SHA256_OF_EMPTY_STRING);
   return append(placeholder);
 }
 
diff --git a/ndn-cxx/name.hpp b/ndn-cxx/name.hpp
index 49a86f9..3265f7d 100644
--- a/ndn-cxx/name.hpp
+++ b/ndn-cxx/name.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).
  *
@@ -168,7 +168,7 @@
     if (i < 0) {
       i += static_cast<ssize_t>(size());
     }
-    return reinterpret_cast<const Component&>(m_wire.elements()[i]);
+    return static_cast<const Component&>(m_wire.elements()[static_cast<size_t>(i)]);
   }
 
   /** @brief Equivalent to `get(i)`.
@@ -292,23 +292,38 @@
     return *this;
   }
 
-  /** @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 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)
+  {
+    return append(Component(type, value));
+  }
+
+  /**
+   * @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<>")]]
+  Name&
   append(uint32_t type, const uint8_t* value, size_t count)
   {
-    return append(Component(type, value, count));
+    return append(Component(type, make_span(value, count)));
   }
 
-  /** @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(uint32_t, span<const uint8_t>) or append(const Component&)
    */
+  [[deprecated]]
   Name&
   append(const uint8_t* value, size_t count)
   {
-    return append(Component(value, count));
+    return append(Component(make_span(value, count)));
   }
 
   /** @brief Append a NameComponent of TLV-TYPE @p type, copying TLV-VALUE from a range.
diff --git a/ndn-cxx/util/sha256.cpp b/ndn-cxx/util/sha256.cpp
index 3de1b85..d24e8d1 100644
--- a/ndn-cxx/util/sha256.cpp
+++ b/ndn-cxx/util/sha256.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.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -88,40 +88,39 @@
 Sha256&
 Sha256::operator<<(Sha256& src)
 {
-  auto buf = src.computeDigest();
-  update(buf->data(), buf->size());
+  update(*src.computeDigest());
   return *this;
 }
 
 Sha256&
 Sha256::operator<<(const std::string& str)
 {
-  update(reinterpret_cast<const uint8_t*>(str.data()), str.size());
+  update({reinterpret_cast<const uint8_t*>(str.data()), str.size()});
   return *this;
 }
 
 Sha256&
 Sha256::operator<<(const Block& block)
 {
-  update(block.wire(), block.size());
+  update({block.wire(), block.size()});
   return *this;
 }
 
 Sha256&
 Sha256::operator<<(uint64_t value)
 {
-  update(reinterpret_cast<const uint8_t*>(&value), sizeof(uint64_t));
+  update({reinterpret_cast<const uint8_t*>(&value), sizeof(uint64_t)});
   return *this;
 }
 
 void
-Sha256::update(const uint8_t* buffer, size_t size)
+Sha256::update(span<const uint8_t> buffer)
 {
   if (m_isFinalized)
     NDN_THROW(Error("Digest has been already finalized"));
 
   BOOST_ASSERT(m_input != nullptr);
-  m_input->write({buffer, size});
+  m_input->write(buffer);
   m_isEmpty = false;
 }
 
@@ -133,10 +132,10 @@
 }
 
 ConstBufferPtr
-Sha256::computeDigest(const uint8_t* buffer, size_t size)
+Sha256::computeDigest(span<const uint8_t> buffer)
 {
   Sha256 sha256;
-  sha256.update(buffer, size);
+  sha256.update(buffer);
   return sha256.computeDigest();
 }
 
diff --git a/ndn-cxx/util/sha256.hpp b/ndn-cxx/util/sha256.hpp
index 5a42add..745e706 100644
--- a/ndn-cxx/util/sha256.hpp
+++ b/ndn-cxx/util/sha256.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).
  *
@@ -140,13 +140,18 @@
   operator<<(uint64_t value);
 
   /**
-   * @brief Add a raw buffer to the digest calculation.
-   * @param buffer the input buffer
-   * @param size the size of the input buffer
+   * @brief Add a byte buffer to the digest calculation.
    * @throw Error the digest has already been finalized
    */
   void
-  update(const uint8_t* buffer, size_t size);
+  update(span<const uint8_t> buffer);
+
+  [[deprecated("use the overload that takes a span<>")]]
+  void
+  update(const uint8_t* buffer, size_t size)
+  {
+    update({buffer, size});
+  }
 
   /**
    * @brief Convert digest to std::string.
@@ -157,12 +162,17 @@
 
   /**
    * @brief Stateless SHA-256 digest calculation.
-   * @param buffer the input buffer
-   * @param size the size of the input buffer
    * @return SHA-256 digest of the input buffer
    */
   static ConstBufferPtr
-  computeDigest(const uint8_t* buffer, size_t size);
+  computeDigest(span<const uint8_t> buffer);
+
+  [[deprecated("use the overload that takes a span<>")]]
+  static ConstBufferPtr
+  computeDigest(const uint8_t* buffer, size_t size)
+  {
+    return computeDigest({buffer, size});
+  }
 
 private:
   unique_ptr<security::transform::StepSource> m_input;
diff --git a/ndn-cxx/util/string-helper.hpp b/ndn-cxx/util/string-helper.hpp
index 29e7d67..1b08836 100644
--- a/ndn-cxx/util/string-helper.hpp
+++ b/ndn-cxx/util/string-helper.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).
  *
@@ -51,12 +51,16 @@
  * @param os Output stream
  * @param buffer Range of bytes to print in hexadecimal format
  * @param wantUpperCase if true (the default) print uppercase hex chars
+ *
+ * Each octet of input is always converted to two hex characters (e.g., "00" for octet==0).
+ * The output string is a continuous sequence of hex characters without any whitespace separators.
  */
 void
 printHex(std::ostream& os, span<const uint8_t> buffer, bool wantUpperCase = true);
 
 /**
  * @brief Output the hex representation of the bytes in @p buffer to the output stream @p os
+ * @deprecated
  *
  * @param os Output stream
  * @param buffer Pointer to an array of bytes
@@ -71,9 +75,9 @@
  * @endcode
  *
  * Each octet is always represented as two hex characters ("00" for octet==0).
- *
  * The output string is a continuous sequence of hex characters without any whitespace separators.
  */
+[[deprecated("use the overload that takes a span<>")]]
 inline void
 printHex(std::ostream& os, const uint8_t* buffer, size_t length, bool wantUpperCase = true)
 {
@@ -117,12 +121,16 @@
  *
  * @param buffer Range of bytes to convert to hexadecimal format
  * @param wantUpperCase if true (the default) use uppercase hex chars
+ *
+ * Each octet of input is always converted to two hex characters (e.g., "00" for octet==0).
+ * The output string is a continuous sequence of hex characters without any whitespace separators.
  */
 NDN_CXX_NODISCARD std::string
 toHex(span<const uint8_t> buffer, bool wantUpperCase = true);
 
 /**
  * @brief Return a string containing the hex representation of the bytes in @p buffer
+ * @deprecated
  *
  * @param buffer Pointer to an array of bytes
  * @param length Size of the array
@@ -136,9 +144,9 @@
  * @endcode
  *
  * Each octet is always represented as two hex characters ("00" for octet==0).
- *
  * The output string is a continuous sequence of hex characters without any whitespace separators.
  */
+[[deprecated("use the overload that takes a span<>")]]
 NDN_CXX_NODISCARD inline std::string
 toHex(const uint8_t* buffer, size_t length, bool wantUpperCase = true)
 {
diff --git a/tests/integration/face.cpp b/tests/integration/face.cpp
index 878b0cc..9357094 100644
--- a/tests/integration/face.cpp
+++ b/tests/integration/face.cpp
@@ -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).
  *
@@ -241,9 +241,9 @@
   int nRegSuccess = 0;
   std::set<Name> receivedInterests;
   this->face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
-    [&] (const InterestFilter&, const Interest& interest) { receivedInterests.insert(interest.getName()); },
-    [&] (const Name&) { ++nRegSuccess; },
-    [] (const Name&, const auto& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
+    [&] (auto&&, const auto& interest) { receivedInterests.insert(interest.getName()); },
+    [&] (auto&&) { ++nRegSuccess; },
+    [] (auto&&, const auto& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
 
   this->sched.schedule(700_ms, [] {
     std::string output = executeCommand("nfdc route list | grep /Hello/World");
@@ -258,8 +258,7 @@
   this->face.processEvents();
   BOOST_CHECK_EQUAL(nRegSuccess, 1);
   std::set<Name> expectedInterests{"/Hello/World/a/b", "/Hello/World/a/b/c"};
-  BOOST_CHECK_EQUAL_COLLECTIONS(receivedInterests.begin(), receivedInterests.end(),
-                                expectedInterests.begin(), expectedInterests.end());
+  BOOST_TEST(receivedInterests == expectedInterests, boost::test_tools::per_element());
 }
 
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(RegexFilterNoRegister, TransportType, Transports, FaceFixture<TransportType>)
diff --git a/tests/unit/data.t.cpp b/tests/unit/data.t.cpp
index 153c471..0a4c9b7 100644
--- a/tests/unit/data.t.cpp
+++ b/tests/unit/data.t.cpp
@@ -204,9 +204,7 @@
   }
   d.setSignatureValue(sig.buf());
 
-  Block dataBlock(d.wireEncode());
-  BOOST_CHECK_EQUAL_COLLECTIONS(DATA1, DATA1 + sizeof(DATA1),
-                                dataBlock.begin(), dataBlock.end());
+  BOOST_TEST(d.wireEncode() == DATA1, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_SUITE_END() // Encode
@@ -537,8 +535,12 @@
   BOOST_CHECK_EQUAL(d.hasContent(), true);
   BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
   BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
+
   // raw buffer overload (deprecated)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   BOOST_CHECK_THROW(d.setContent(nullptr, 1), std::invalid_argument);
+#pragma GCC diagnostic pop
 
   // ConstBufferPtr overload
   d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
diff --git a/tests/unit/encoding/block.t.cpp b/tests/unit/encoding/block.t.cpp
index a39df87..e7c8bac 100644
--- a/tests/unit/encoding/block.t.cpp
+++ b/tests/unit/encoding/block.t.cpp
@@ -111,7 +111,6 @@
   };
 
   Block b1(buf);
-
   Block b2(b1, b1.begin(), b1.end());
   auto buf2 = b2.getBuffer();
 
@@ -120,9 +119,8 @@
   b1.encode();
 
   b2.parse();
-
-  BOOST_CHECK_EQUAL_COLLECTIONS(b2.begin(), b2.end(), buf, buf + sizeof(buf));
-  BOOST_CHECK_EQUAL(buf2, b2.getBuffer());
+  BOOST_TEST(b2 == buf, boost::test_tools::per_element());
+  BOOST_TEST(buf2 == b2.getBuffer()); // check pointers
 }
 
 BOOST_AUTO_TEST_CASE(FromBlockCopyOnWriteModifyCopy)
@@ -133,7 +131,6 @@
 
   Block b1(buf);
   auto buf1 = b1.getBuffer();
-
   Block b2(b1, b1.begin(), b1.end());
 
   b2.parse();
@@ -141,8 +138,8 @@
   b2.encode();
 
   b1.parse();
-  BOOST_CHECK_EQUAL_COLLECTIONS(b1.begin(), b1.end(), buf, buf + sizeof(buf));
-  BOOST_CHECK_EQUAL(buf1, b1.getBuffer());
+  BOOST_TEST(b1 == buf, boost::test_tools::per_element());
+  BOOST_TEST(buf1 == b1.getBuffer()); // check pointers
 }
 
 BOOST_AUTO_TEST_CASE(FromType)
diff --git a/tests/unit/ims/in-memory-storage.t.cpp b/tests/unit/ims/in-memory-storage.t.cpp
index 54ceeb0..3d9ff1e 100644
--- a/tests/unit/ims/in-memory-storage.t.cpp
+++ b/tests/unit/ims/in-memory-storage.t.cpp
@@ -270,7 +270,7 @@
 {
   shared_ptr<Data> data = makeData("/digest/compute");
 
-  ConstBufferPtr digest1 = util::Sha256::computeDigest(data->wireEncode().wire(), data->wireEncode().size());
+  auto digest1 = util::Sha256::computeDigest({data->wireEncode().wire(), data->wireEncode().size()});
   BOOST_CHECK_EQUAL(digest1->size(), 32);
 
   InMemoryStorageEntry entry;
@@ -368,7 +368,7 @@
   shared_ptr<Data> data7 = makeData("/c/c/1");
   ims.insert(*data7);
 
-  ConstBufferPtr digest1 = util::Sha256::computeDigest(data->wireEncode().wire(), data->wireEncode().size());
+  auto digest1 = util::Sha256::computeDigest({data->wireEncode().wire(), data->wireEncode().size()});
 
   Name name("/a");
   ims.erase(name);
diff --git a/tests/unit/interest.t.cpp b/tests/unit/interest.t.cpp
index 903d9bb..495d036 100644
--- a/tests/unit/interest.t.cpp
+++ b/tests/unit/interest.t.cpp
@@ -86,7 +86,7 @@
   BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
 
   Block wire1 = i1.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire1.begin(), wire1.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
 
   Interest i2(wire1);
   BOOST_CHECK_EQUAL(i2.getName(), "/local/ndn/prefix");
@@ -129,7 +129,7 @@
   BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
 
   Block wire1 = i1.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire1.begin(), wire1.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
 
   Interest i2(wire1);
   BOOST_CHECK_EQUAL(i2.getName(),
@@ -186,7 +186,7 @@
   BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
 
   Block wire1 = i1.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire1.begin(), wire1.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(wire1 == WIRE, boost::test_tools::per_element());
 
   Interest i2(wire1);
   BOOST_CHECK_EQUAL(i2.getName(),
@@ -248,8 +248,7 @@
   BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
   BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
   BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
-  BOOST_CHECK_EQUAL_COLLECTIONS(i1.getSignatureValue().begin(), i1.getSignatureValue().end(),
-                                sv.begin(), sv.end());
+  BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
   BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
   BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
 
@@ -259,8 +258,7 @@
   i1.setCanBePrefix(false);
   BOOST_CHECK_EQUAL(i1.hasWire(), false);
 
-  Block wire1 = i1.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire1.begin(), wire1.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
 
   Interest i2("/local/ndn/prefix");
   i2.setMustBeFresh(true);
@@ -270,8 +268,7 @@
   i2.setSignatureValue(make_shared<Buffer>(sv.value(), sv.value_size()));
   BOOST_CHECK_EQUAL(i2.isParametersDigestValid(), true);
 
-  Block wire2 = i2.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire2.begin(), wire2.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(i2.wireEncode() == WIRE, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(SignedApplicationElements)
@@ -325,8 +322,7 @@
   BOOST_CHECK_EQUAL(i1.getNonce(), 0x4c1ecb4a);
   BOOST_CHECK_EQUAL(i1.getSignatureInfo()->getSignatureType(), tlv::DigestSha256);
   BOOST_CHECK(i1.getSignatureInfo()->getNonce() == nonce);
-  BOOST_CHECK_EQUAL_COLLECTIONS(i1.getSignatureValue().begin(), i1.getSignatureValue().end(),
-                                sv.begin(), sv.end());
+  BOOST_TEST(i1.getSignatureValue() == sv, boost::test_tools::per_element());
   BOOST_CHECK_EQUAL(i1.getApplicationParameters(), "2404C0C1C2C3"_block);
   BOOST_CHECK_EQUAL(i1.isParametersDigestValid(), true);
 
@@ -336,8 +332,7 @@
   i1.setCanBePrefix(false);
   BOOST_CHECK_EQUAL(i1.hasWire(), false);
 
-  Block wire1 = i1.wireEncode();
-  BOOST_CHECK_EQUAL_COLLECTIONS(wire1.begin(), wire1.end(), WIRE, WIRE + sizeof(WIRE));
+  BOOST_TEST(i1.wireEncode() == WIRE, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(MissingApplicationParameters)
@@ -888,8 +883,12 @@
   BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2401C1"_block);
   i.setApplicationParameters(span<uint8_t>{});
   BOOST_CHECK_EQUAL(i.getApplicationParameters(), "2400"_block);
+
   // raw buffer+size overload (deprecated)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   BOOST_CHECK_THROW(i.setApplicationParameters(nullptr, 42), std::invalid_argument);
+#pragma GCC diagnostic pop
 
   // ConstBufferPtr overload
   i.setApplicationParameters(make_shared<Buffer>(PARAMETERS2, sizeof(PARAMETERS2)));
diff --git a/tests/unit/meta-info.t.cpp b/tests/unit/meta-info.t.cpp
index 87add29..56ad239 100644
--- a/tests/unit/meta-info.t.cpp
+++ b/tests/unit/meta-info.t.cpp
@@ -109,7 +109,7 @@
   // // These octets are obtained by the snippet below.
   // // This check is intended to detect unexpected encoding change in the future.
   // const Block& wire = info1.wireEncode();
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   const uint8_t METAINFO[] = {0x14, 0x77, 0x18, 0x01, 0xc4, 0x19, 0x02, 0x0e, 0x10, 0x1a, 0x0c,
diff --git a/tests/unit/metadata-object.t.cpp b/tests/unit/metadata-object.t.cpp
index 9606db7..3fd5d09 100644
--- a/tests/unit/metadata-object.t.cpp
+++ b/tests/unit/metadata-object.t.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.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -151,7 +151,7 @@
 
   // invalid keyword name component
   name = name.getPrefix(-3)
-         .append(tlv::KeywordNameComponent, reinterpret_cast<const uint8_t*>("foo"), std::strlen("foo"))
+         .append(tlv::KeywordNameComponent, {'f', 'o', 'o'})
          .appendVersion()
          .appendSegment(0);
   BOOST_CHECK_EQUAL(MetadataObject::isValidName(name), false);
diff --git a/tests/unit/mgmt/nfd/channel-status.t.cpp b/tests/unit/mgmt/nfd/channel-status.t.cpp
index 9b1a4fa..dc29def 100644
--- a/tests/unit/mgmt/nfd/channel-status.t.cpp
+++ b/tests/unit/mgmt/nfd/channel-status.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/channel-status.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -40,7 +41,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/mgmt/nfd/face-event-notification.t.cpp b/tests/unit/mgmt/nfd/face-event-notification.t.cpp
index 3354a1b..f1dfc38 100644
--- a/tests/unit/mgmt/nfd/face-event-notification.t.cpp
+++ b/tests/unit/mgmt/nfd/face-event-notification.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/face-event-notification.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -75,7 +76,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
@@ -120,7 +121,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
@@ -165,7 +166,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
@@ -210,7 +211,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/mgmt/nfd/face-query-filter.t.cpp b/tests/unit/mgmt/nfd/face-query-filter.t.cpp
index 3b32ac8..e46d6c1 100644
--- a/tests/unit/mgmt/nfd/face-query-filter.t.cpp
+++ b/tests/unit/mgmt/nfd/face-query-filter.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/face-query-filter.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -55,7 +56,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //  printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/mgmt/nfd/face-status.t.cpp b/tests/unit/mgmt/nfd/face-status.t.cpp
index a4ad4ac..405bf2c 100644
--- a/tests/unit/mgmt/nfd/face-status.t.cpp
+++ b/tests/unit/mgmt/nfd/face-status.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/face-status.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -64,7 +65,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/mgmt/nfd/forwarder-status.t.cpp b/tests/unit/mgmt/nfd/forwarder-status.t.cpp
index f899ce9..b4eb339 100644
--- a/tests/unit/mgmt/nfd/forwarder-status.t.cpp
+++ b/tests/unit/mgmt/nfd/forwarder-status.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/forwarder-status.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -61,7 +62,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/mgmt/nfd/strategy-choice.t.cpp b/tests/unit/mgmt/nfd/strategy-choice.t.cpp
index 1d8329b..94c30e8 100644
--- a/tests/unit/mgmt/nfd/strategy-choice.t.cpp
+++ b/tests/unit/mgmt/nfd/strategy-choice.t.cpp
@@ -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).
  *
@@ -22,6 +22,7 @@
 #include "ndn-cxx/mgmt/nfd/strategy-choice.hpp"
 
 #include "tests/boost-test.hpp"
+
 #include <boost/lexical_cast.hpp>
 
 namespace ndn {
@@ -41,7 +42,7 @@
 
   // These octets are obtained by the snippet below.
   // This check is intended to detect unexpected encoding change in the future.
-  // for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
+  // for (auto it = wire.begin(); it != wire.end(); ++it) {
   //   printf("0x%02x, ", *it);
   // }
   static const uint8_t expected[] = {
diff --git a/tests/unit/name.t.cpp b/tests/unit/name.t.cpp
index 4e8d104..165c3fc 100644
--- a/tests/unit/name.t.cpp
+++ b/tests/unit/name.t.cpp
@@ -236,13 +236,13 @@
   name.append(Component("Emid"));
   BOOST_CHECK_EQUAL(name.wireEncode(), "0706 0804456D6964"_block);
 
-  name.append(25042, reinterpret_cast<const uint8_t*>("P3"), 2);
+  name.append(25042, {'P', '3'});
   BOOST_CHECK_EQUAL(name.wireEncode(), "070C 0804456D6964 FD61D2025033"_block);
 
-  name.append(reinterpret_cast<const uint8_t*>("."), 1);
+  name.append(Component(make_span<uint8_t>({'.'})));
   BOOST_CHECK_EQUAL(name.wireEncode(), "070F 0804456D6964 FD61D2025033 08012E"_block);
 
-  std::vector<uint8_t> v1{0x28, 0xF0, 0xA3, 0x6B};
+  const std::vector<uint8_t> v1{0x28, 0xF0, 0xA3, 0x6B};
   name.append(16, v1.begin(), v1.end());
   BOOST_CHECK_EQUAL(name.wireEncode(), "0715 0804456D6964 FD61D2025033 08012E 100428F0A36B"_block);
 
diff --git a/tests/unit/security/verification-helpers.t.cpp b/tests/unit/security/verification-helpers.t.cpp
index e3ecc86..d15f8f2 100644
--- a/tests/unit/security/verification-helpers.t.cpp
+++ b/tests/unit/security/verification-helpers.t.cpp
@@ -51,7 +51,7 @@
 //   auto print = [] (const std::string& name, const uint8_t* buf, size_t size) {
 //     std::cout << "  const Block " + name + "{{\n    ";
 
-//     std::string hex = toHex(buf, size);
+//     std::string hex = toHex({buf, size});
 
 //     for (size_t i = 0; i < hex.size(); i++) {
 //       if (i > 0 && i % 32 == 0)
diff --git a/tests/unit/util/exception.t.cpp b/tests/unit/util/exception.t.cpp
index 33884dc..49ac2ab 100644
--- a/tests/unit/util/exception.t.cpp
+++ b/tests/unit/util/exception.t.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).
  *
@@ -28,7 +28,7 @@
 
 namespace ndn {
 namespace exception {
-namespace test {
+namespace tests {
 
 BOOST_AUTO_TEST_SUITE(Util)
 BOOST_AUTO_TEST_SUITE(TestException)
@@ -106,6 +106,6 @@
 BOOST_AUTO_TEST_SUITE_END() // TestException
 BOOST_AUTO_TEST_SUITE_END() // Util
 
-} // namespace test
+} // namespace tests
 } // namespace exception
 } // namespace ndn
diff --git a/tests/unit/util/sha256.t.cpp b/tests/unit/util/sha256.t.cpp
index 3340204..ae4fea3 100644
--- a/tests/unit/util/sha256.t.cpp
+++ b/tests/unit/util/sha256.t.cpp
@@ -29,27 +29,27 @@
 
 namespace ndn {
 namespace util {
-namespace test {
+namespace tests {
 
 BOOST_AUTO_TEST_SUITE(Util)
 BOOST_AUTO_TEST_SUITE(TestSha256)
 
 BOOST_AUTO_TEST_CASE(Basic)
 {
-  const uint8_t input[] = {0x01, 0x02, 0x03, 0x04};
+  const uint8_t buf[] = {0x01, 0x02, 0x03, 0x04};
+  auto input = make_span(buf);
   auto expected = fromHex("9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a");
 
   Sha256 statefulSha256;
   BOOST_CHECK_EQUAL(statefulSha256.empty(), true);
 
-  statefulSha256.update(input, 1);
-  statefulSha256.update(input + 1, 1);
-  statefulSha256.update(input + 2, 1);
-  statefulSha256.update(input + 3, 1);
+  statefulSha256.update(input.subspan(0, 1));
+  statefulSha256.update(input.subspan(1, 1));
+  statefulSha256.update(input.subspan(2, 1));
+  statefulSha256.update(input.subspan(3, 1));
   ConstBufferPtr digest = statefulSha256.computeDigest();
   BOOST_CHECK_EQUAL(digest->size(), Sha256::DIGEST_SIZE);
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(ConstructFromStream)
@@ -63,8 +63,7 @@
   BOOST_CHECK_EQUAL(sha.toString(), "315F5BDB76D078C43B8AC0064E4A0164612B1FCE77C869345BFC94C75894EDD3");
 
   ConstBufferPtr digest = sha.computeDigest();
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(Compare)
@@ -72,14 +71,13 @@
   const uint8_t origin[] = {0x01, 0x02, 0x03, 0x04};
 
   Sha256 digest1;
-  digest1.update(origin, sizeof(origin));
+  digest1.update(origin);
   digest1.computeDigest();
 
   Sha256 digest2;
-  digest2.update(origin, 1);
-  digest2.update(origin + 1, 1);
-  digest2.update(origin + 2, 1);
-  digest2.update(origin + 3, 1);
+  auto in = make_span(origin);
+  digest2.update(in.first(2));
+  digest2.update(in.last(2));
   digest2.computeDigest();
 
   BOOST_CHECK_EQUAL(digest1 == digest2, true);
@@ -98,8 +96,7 @@
   ConstBufferPtr digest = statefulSha256.computeDigest();
 
   BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(InsertionOperatorString)
@@ -112,8 +109,7 @@
   ConstBufferPtr digest = statefulSha256.computeDigest();
 
   BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(InsertionOperatorBlock)
@@ -138,8 +134,7 @@
   ConstBufferPtr digest = statefulSha256.computeDigest();
 
   BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(InsertionOperatorUint64t)
@@ -154,8 +149,7 @@
   ConstBufferPtr digest = statefulSha256.computeDigest();
 
   BOOST_CHECK_EQUAL(statefulSha256.empty(), false);
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(Reset)
@@ -182,12 +176,10 @@
 
 BOOST_AUTO_TEST_CASE(StaticComputeDigest)
 {
-  const uint8_t input[] = {0x01, 0x02, 0x03, 0x04};
   auto expected = fromHex("9f64a747e1b97f131fabb6b447296c9b6f0201e79fb3c5356e6c77e89b6a806a");
 
-  ConstBufferPtr digest = Sha256::computeDigest(input, sizeof(input));
-  BOOST_CHECK_EQUAL_COLLECTIONS(expected->data(), expected->data() + expected->size(),
-                                digest->data(), digest->data() + digest->size());
+  ConstBufferPtr digest = Sha256::computeDigest({0x01, 0x02, 0x03, 0x04});
+  BOOST_TEST(*digest == *expected, boost::test_tools::per_element());
 }
 
 BOOST_AUTO_TEST_CASE(Print)
@@ -209,6 +201,6 @@
 BOOST_AUTO_TEST_SUITE_END() // TestSha256
 BOOST_AUTO_TEST_SUITE_END() // Util
 
-} // namespace test
+} // namespace tests
 } // namespace util
 } // namespace ndn
diff --git a/tests/unit/util/string-helper.t.cpp b/tests/unit/util/string-helper.t.cpp
index 8747301..a129c1a 100644
--- a/tests/unit/util/string-helper.t.cpp
+++ b/tests/unit/util/string-helper.t.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).
  *
@@ -35,7 +35,7 @@
 
 namespace ndn {
 namespace util {
-namespace test {
+namespace tests {
 
 using boost::test_tools::output_test_stream;
 
@@ -85,12 +85,12 @@
 
 BOOST_AUTO_TEST_CASE(ToHex)
 {
-  std::string test = "Hello, world!";
-  BOOST_CHECK_EQUAL(toHex(reinterpret_cast<const uint8_t*>(test.data()), test.size()),
+  const std::string test = "Hello, world!";
+  BOOST_CHECK_EQUAL(toHex({reinterpret_cast<const uint8_t*>(test.data()), test.size()}),
                     "48656C6C6F2C20776F726C6421");
-  BOOST_CHECK_EQUAL(toHex(reinterpret_cast<const uint8_t*>(test.data()), test.size(), false),
+  BOOST_CHECK_EQUAL(toHex({reinterpret_cast<const uint8_t*>(test.data()), test.size()}, false),
                     "48656c6c6f2c20776f726c6421");
-  BOOST_CHECK_EQUAL(toHex(nullptr, 0), "");
+  BOOST_CHECK_EQUAL(toHex({}), "");
 
   Buffer buffer(test.data(), test.size());
   BOOST_CHECK_EQUAL(toHex(buffer, false),  "48656c6c6f2c20776f726c6421");
@@ -99,13 +99,13 @@
 
 BOOST_AUTO_TEST_CASE(FromHex)
 {
-  BOOST_CHECK(*fromHex("") == Buffer{});
-  BOOST_CHECK(*fromHex("48656c6c6f2c20776f726c6421") ==
-              (std::vector<uint8_t>{0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20,
-                                    0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21}));
-  BOOST_CHECK(*fromHex("012a3Bc4defAB5CdEF") ==
-              (std::vector<uint8_t>{0x01, 0x2a, 0x3b, 0xc4, 0xde,
-                                    0xfa, 0xb5, 0xcd, 0xef}));
+  BOOST_TEST(fromHex("")->empty());
+  const uint8_t expected1[] = {
+    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21
+  };
+  BOOST_TEST(*fromHex("48656c6c6f2c20776f726c6421") == expected1, boost::test_tools::per_element());
+  const uint8_t expected2[] = {0x01, 0x2a, 0x3b, 0xc4, 0xde, 0xfa, 0xb5, 0xcd, 0xef};
+  BOOST_TEST(*fromHex("012a3Bc4defAB5CdEF") == expected2, boost::test_tools::per_element());
 
   BOOST_CHECK_THROW(fromHex("1"), StringHelperError);
   BOOST_CHECK_THROW(fromHex("zz"), StringHelperError);
@@ -209,6 +209,6 @@
 BOOST_AUTO_TEST_SUITE_END() // TestStringHelper
 BOOST_AUTO_TEST_SUITE_END() // Util
 
-} // namespace test
+} // namespace tests
 } // namespace util
 } // namespace ndn
