diff --git a/ndn-cxx/encoding/block-helpers.hpp b/ndn-cxx/encoding/block-helpers.hpp
index 8224a77..3cda2b1 100644
--- a/ndn-cxx/encoding/block-helpers.hpp
+++ b/ndn-cxx/encoding/block-helpers.hpp
@@ -213,19 +213,6 @@
  *  @param length length of value buffer
  *  @deprecated
  */
-[[deprecated("use the overload that takes a span<>")]]
-inline Block
-makeBinaryBlock(uint32_t type, const uint8_t* value, size_t length)
-{
-  return makeBinaryBlock(type, {value, length});
-}
-
-/** @brief Create a TLV block copying the TLV-VALUE from a raw buffer.
- *  @param type TLV-TYPE number
- *  @param value raw buffer as TLV-VALUE
- *  @param length length of value buffer
- *  @deprecated
- */
 inline Block
 makeBinaryBlock(uint32_t type, const char* value, size_t length)
 {
diff --git a/ndn-cxx/encoding/block.cpp b/ndn-cxx/encoding/block.cpp
index 30cab98..bccb706 100644
--- a/ndn-cxx/encoding/block.cpp
+++ b/ndn-cxx/encoding/block.cpp
@@ -130,11 +130,6 @@
 {
 }
 
-Block::Block(const uint8_t* buf, size_t bufSize)
-  : Block(make_span(buf, bufSize))
-{
-}
-
 Block::Block(uint32_t type)
   : m_type(type)
   , m_size(tlv::sizeOfVarNumber(m_type) + tlv::sizeOfVarNumber(0))
@@ -221,12 +216,6 @@
                                      std::prev(b->end(), length), b->end()));
 }
 
-std::tuple<bool, Block>
-Block::fromBuffer(const uint8_t* buf, size_t bufSize)
-{
-  return fromBuffer({buf, bufSize});
-}
-
 Block
 Block::fromStream(std::istream& is)
 {
diff --git a/ndn-cxx/encoding/block.hpp b/ndn-cxx/encoding/block.hpp
index 2b79030..4f9e840 100644
--- a/ndn-cxx/encoding/block.hpp
+++ b/ndn-cxx/encoding/block.hpp
@@ -138,16 +138,6 @@
         Buffer::const_iterator begin, Buffer::const_iterator end,
         Buffer::const_iterator valueBegin, Buffer::const_iterator valueEnd);
 
-  /** @brief Parse Block from a raw buffer
-   *  @param buf pointer to the first octet of a TLV element
-   *  @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 Use Block(span<const uint8_t>)
-   */
-  [[deprecated("use the constructor that takes a span<>")]]
-  Block(const uint8_t* buf, size_t bufSize);
-
   /** @brief Create a zero-length Block with the specified TLV-TYPE
    *  @param type TLV-TYPE
    */
@@ -185,18 +175,6 @@
   NDN_CXX_NODISCARD static std::tuple<bool, Block>
   fromBuffer(span<const uint8_t> buffer);
 
-  /** @brief Try to parse Block from a raw buffer
-   *  @param buf pointer to the first octet of a TLV element
-   *  @param bufSize size of the raw buffer; may be greater than the actual size of the TLV element
-   *  @return `true` and the parsed Block if parsing succeeds; otherwise `false` and an invalid Block
-   *  @note This overload copies the TLV element octets to an internal buffer.
-   *  @note This function does not throw upon decoding failure.
-   *  @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  NDN_CXX_NODISCARD static std::tuple<bool, Block>
-  fromBuffer(const uint8_t* buf, size_t bufSize);
-
   /** @brief Parse Block from an input stream
    *  @throw tlv::Error TLV-LENGTH is zero or exceeds upper bound
    *  @warning If decoding fails, bytes are still consumed from the input stream.
diff --git a/ndn-cxx/encoding/encoder.cpp b/ndn-cxx/encoding/encoder.cpp
index c2964f4..bd39970 100644
--- a/ndn-cxx/encoding/encoder.cpp
+++ b/ndn-cxx/encoding/encoder.cpp
@@ -200,49 +200,5 @@
   }
 }
 
-size_t
-Encoder::prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
-{
-  size_t totalLength = prependBytes({array, arraySize});
-  totalLength += prependVarNumber(arraySize);
-  totalLength += prependVarNumber(type);
-
-  return totalLength;
-}
-
-size_t
-Encoder::appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
-{
-  size_t totalLength = appendVarNumber(type);
-  totalLength += appendVarNumber(arraySize);
-  totalLength += appendBytes({array, arraySize});
-
-  return totalLength;
-}
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-size_t
-Encoder::prependBlock(const Block& block)
-{
-  if (block.hasWire()) {
-    return prependBytes(block);
-  }
-  else {
-    return prependByteArrayBlock(block.type(), block.value(), block.value_size());
-  }
-}
-
-size_t
-Encoder::appendBlock(const Block& block)
-{
-  if (block.hasWire()) {
-    return appendBytes(block);
-  }
-  else {
-    return appendByteArrayBlock(block.type(), block.value(), block.value_size());
-  }
-}
-
 } // namespace encoding
 } // namespace ndn
diff --git a/ndn-cxx/encoding/encoder.hpp b/ndn-cxx/encoding/encoder.hpp
index 186ee2a..d5f6965 100644
--- a/ndn-cxx/encoding/encoder.hpp
+++ b/ndn-cxx/encoding/encoder.hpp
@@ -50,50 +50,6 @@
   appendBytes(span<const uint8_t> bytes);
 
   /**
-   * @brief Prepend a byte
-   * @deprecated
-   */
-  [[deprecated("use prependBytes()")]]
-  size_t
-  prependByte(uint8_t value)
-  {
-    return prependBytes({value});
-  }
-
-  /**
-   * @brief Append a byte
-   * @deprecated
-   */
-  [[deprecated("use appendBytes()")]]
-  size_t
-  appendByte(uint8_t value)
-  {
-    return appendBytes({value});
-  }
-
-  /**
-   * @brief Prepend a byte array @p array of length @p length
-   * @deprecated
-   */
-  [[deprecated("use prependBytes()")]]
-  size_t
-  prependByteArray(const uint8_t* array, size_t length)
-  {
-    return prependBytes({array, length});
-  }
-
-  /**
-   * @brief Append a byte array @p array of length @p length
-   * @deprecated
-   */
-  [[deprecated("use appendBytes()")]]
-  size_t
-  appendByteArray(const uint8_t* array, size_t length)
-  {
-    return appendBytes({array, length});
-  }
-
-  /**
    * @brief Prepend range of bytes from the range [@p first, @p last)
    */
   template<class Iterator>
@@ -135,38 +91,6 @@
   size_t
   appendNonNegativeInteger(uint64_t integer);
 
-  /**
-   * @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
-   * @deprecated
-   */
-  [[deprecated("use encoding::prependBinaryBlock()")]]
-  size_t
-  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
-
-  /**
-   * @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
-   * @deprecated
-   */
-  [[deprecated]]
-  size_t
-  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
-
-  /**
-   * @brief Prepend TLV block @p block
-   * @deprecated
-   */
-  [[deprecated("use encoding::prependBlock()")]]
-  size_t
-  prependBlock(const Block& block);
-
-  /**
-   * @brief Append TLV block @p block
-   * @deprecated
-   */
-  [[deprecated]]
-  size_t
-  appendBlock(const Block& block);
-
 public: // unique interface to the Encoder
   using value_type = Buffer::value_type;
   using iterator = Buffer::iterator;
@@ -295,26 +219,6 @@
   }
 
   /**
-   * @deprecated
-   */
-  [[deprecated("use data()")]]
-  uint8_t*
-  buf() noexcept
-  {
-    return data();
-  }
-
-  /**
-   * @deprecated
-   */
-  [[deprecated("use data()")]]
-  const uint8_t*
-  buf() const noexcept
-  {
-    return data();
-  }
-
-  /**
    * @brief Returns the size of the encoded buffer
    */
   size_t
diff --git a/ndn-cxx/encoding/estimator.cpp b/ndn-cxx/encoding/estimator.cpp
deleted file mode 100644
index 299e0f5..0000000
--- a/ndn-cxx/encoding/estimator.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013-2022 Regents of the University of California.
- *
- * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
- *
- * ndn-cxx library is free software: you can redistribute it and/or modify it under the
- * terms of the GNU Lesser General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
- *
- * You should have received copies of the GNU General Public License and GNU Lesser
- * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
- */
-
-#include "ndn-cxx/encoding/estimator.hpp"
-
-namespace ndn {
-namespace encoding {
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
-size_t
-Estimator::prependBlock(const Block& block) const
-{
-  if (block.hasWire()) {
-    return block.size();
-  }
-  else {
-    return prependByteArrayBlock(block.type(), block.value(), block.value_size());
-  }
-}
-
-size_t
-Estimator::appendBlock(const Block& block) const
-{
-  return prependBlock(block);
-}
-
-} // namespace encoding
-} // namespace ndn
diff --git a/ndn-cxx/encoding/estimator.hpp b/ndn-cxx/encoding/estimator.hpp
index ff85695..5276a7d 100644
--- a/ndn-cxx/encoding/estimator.hpp
+++ b/ndn-cxx/encoding/estimator.hpp
@@ -56,57 +56,13 @@
   }
 
   /**
-   * @brief Prepend a single byte
-   * @deprecated
-   */
-  [[deprecated("use prependBytes()")]]
-  constexpr size_t
-  prependByte(uint8_t) const noexcept
-  {
-    return 1;
-  }
-
-  /**
-   * @brief Append a single byte
-   * @deprecated
-   */
-  [[deprecated("use appendBytes()")]]
-  constexpr size_t
-  appendByte(uint8_t) const noexcept
-  {
-    return 1;
-  }
-
-  /**
-   * @brief Prepend a byte array @p array of length @p length
-   * @deprecated
-   */
-  [[deprecated("use prependBytes()")]]
-  constexpr size_t
-  prependByteArray(const uint8_t*, size_t length) const noexcept
-  {
-    return length;
-  }
-
-  /**
-   * @brief Append a byte array @p array of length @p length
-   * @deprecated
-   */
-  [[deprecated("use appendBytes()")]]
-  constexpr size_t
-  appendByteArray(const uint8_t*, size_t length) const noexcept
-  {
-    return length;
-  }
-
-  /**
    * @brief Prepend bytes from the range [@p first, @p last)
    */
   template<class Iterator>
   constexpr size_t
   prependRange(Iterator first, Iterator last) const noexcept
   {
-    return std::distance(first, last);
+    return static_cast<size_t>(std::distance(first, last));
   }
 
   /**
@@ -116,7 +72,7 @@
   constexpr size_t
   appendRange(Iterator first, Iterator last) const noexcept
   {
-    return std::distance(first, last);
+    return static_cast<size_t>(std::distance(first, last));
   }
 
   /**
@@ -154,44 +110,6 @@
   {
     return tlv::sizeOfNonNegativeInteger(n);
   }
-
-  /**
-   * @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
-   * @deprecated
-   */
-  [[deprecated("use encoding::prependBinaryBlock()")]]
-  constexpr size_t
-  prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
-  {
-    return tlv::sizeOfVarNumber(type) + tlv::sizeOfVarNumber(arraySize) + arraySize;
-  }
-
-  /**
-   * @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
-   * @deprecated
-   */
-  [[deprecated]]
-  constexpr size_t
-  appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
-  {
-    return tlv::sizeOfVarNumber(type) + tlv::sizeOfVarNumber(arraySize) + arraySize;
-  }
-
-  /**
-   * @brief Prepend TLV block @p block
-   * @deprecated
-   */
-  [[deprecated("use encoding::prependBlock()")]]
-  size_t
-  prependBlock(const Block& block) const;
-
-  /**
-   * @brief Append TLV block @p block
-   * @deprecated
-   */
-  [[deprecated]]
-  size_t
-  appendBlock(const Block& block) const;
 };
 
 } // namespace encoding
diff --git a/ndn-cxx/security/safe-bag.cpp b/ndn-cxx/security/safe-bag.cpp
index b538d02..d9928a5 100644
--- a/ndn-cxx/security/safe-bag.cpp
+++ b/ndn-cxx/security/safe-bag.cpp
@@ -45,14 +45,6 @@
 {
 }
 
-SafeBag::SafeBag(const Data& certificate,
-                 const uint8_t* encryptedKey,
-                 size_t encryptedKeyLen)
-  : m_certificate(certificate)
-  , m_encryptedKey(encryptedKey, encryptedKeyLen)
-{
-}
-
 template<encoding::Tag TAG>
 size_t
 SafeBag::wireEncode(EncodingImpl<TAG>& encoder) const
diff --git a/ndn-cxx/security/safe-bag.hpp b/ndn-cxx/security/safe-bag.hpp
index 05312de..3e580a3 100644
--- a/ndn-cxx/security/safe-bag.hpp
+++ b/ndn-cxx/security/safe-bag.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).
  *
@@ -44,7 +44,7 @@
   SafeBag();
 
   /**
-   * @brief Create a new SafeBag object from the block
+   * @brief Create a new SafeBag object from a TLV block
    */
   explicit
   SafeBag(const Block& wire);
@@ -58,20 +58,6 @@
   SafeBag(const Data& certificate, span<const uint8_t> encryptedKey);
 
   /**
-   * @brief Create a new SafeBag object with the given certificate and private key
-   * @deprecated Use SafeBag(const Data&, span<const uint8_t>)
-   *
-   * @param certificate A reference to the certificate data packet
-   * @param encryptedKey A pointer to the private key in PKCS #8 format
-   * @param encryptedKeyLen The length of @p encryptedKey
-   */
-  [[deprecated("use the constructor taking a span<>")]]
-  SafeBag(const Data& certificate,
-          const uint8_t* encryptedKey,
-          size_t encryptedKeyLen);
-
-public:
-  /**
    * @brief Fast encoding or block size estimation
    */
   template<encoding::Tag TAG>
@@ -79,7 +65,7 @@
   wireEncode(EncodingImpl<TAG>& encoder) const;
 
   /**
-   * @brief Encode to a wire format
+   * @brief Encode to wire format
    */
   const Block&
   wireEncode() const;
@@ -90,7 +76,7 @@
   void
   wireDecode(const Block& wire);
 
-public:
+public: // accessors
   /**
    * @brief Get the certificate data packet from safe bag
    */
diff --git a/ndn-cxx/security/tpm/tpm.hpp b/ndn-cxx/security/tpm/tpm.hpp
index 61848ce..5fe254a 100644
--- a/ndn-cxx/security/tpm/tpm.hpp
+++ b/ndn-cxx/security/tpm/tpm.hpp
@@ -104,18 +104,6 @@
   sign(const InputBuffers& bufs, const Name& keyName, DigestAlgorithm digestAlgorithm) const;
 
   /**
-   * @brief Sign blob using the key with name @p keyName and using the digest @p digestAlgorithm.
-   * @deprecated
-   * @return The signature, or nullptr if the key does not exist.
-   */
-  [[deprecated("use the overload that takes InputBuffers")]]
-  ConstBufferPtr
-  sign(const uint8_t* buf, size_t size, const Name& keyName, DigestAlgorithm digestAlgorithm) const
-  {
-    return sign({{buf, size}}, keyName, digestAlgorithm);
-  }
-
-  /**
    * @brief Verify discontiguous ranges using the key with name @p keyName and using the digest
    *        @p digestAlgorithm.
    *
@@ -128,21 +116,6 @@
          DigestAlgorithm digestAlgorithm) const;
 
   /**
-   * @brief Verify blob using the key with name @p keyName and using the digest @p digestAlgorithm.
-   * @deprecated
-   * @retval true the signature is valid
-   * @retval false the signature is not valid
-   * @retval indeterminate the key does not exist
-   */
-  [[deprecated("use the overload that takes InputBuffers and span")]]
-  boost::logic::tribool
-  verify(const uint8_t* buf, size_t bufLen, const uint8_t* sig, size_t sigLen,
-         const Name& keyName, DigestAlgorithm digestAlgorithm) const
-  {
-    return verify({{buf, bufLen}}, {sig, sigLen}, keyName, digestAlgorithm);
-  }
-
-  /**
    * @brief Decrypt blob using the key with name @p keyName.
    *
    * @return The decrypted data, or nullptr if the key does not exist.
@@ -150,18 +123,6 @@
   ConstBufferPtr
   decrypt(span<const uint8_t> buf, const Name& keyName) const;
 
-  /**
-   * @brief Decrypt blob using the key with name @p keyName.
-   * @deprecated
-   * @return The decrypted data, or nullptr if the key does not exist.
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  ConstBufferPtr
-  decrypt(const uint8_t* buf, size_t size, const Name& keyName) const
-  {
-    return decrypt({buf, size}, keyName);
-  }
-
 public: // Management
   /**
    * @brief Check if the TPM is in terminal mode.
diff --git a/ndn-cxx/security/transform/block-cipher.hpp b/ndn-cxx/security/transform/block-cipher.hpp
index 18ca402..ecde4e7 100644
--- a/ndn-cxx/security/transform/block-cipher.hpp
+++ b/ndn-cxx/security/transform/block-cipher.hpp
@@ -97,15 +97,6 @@
 blockCipher(BlockCipherAlgorithm algo, CipherOperator op,
             span<const uint8_t> key, span<const uint8_t> iv);
 
-[[deprecated("use the overload that takes span<>")]]
-inline unique_ptr<Transform>
-blockCipher(BlockCipherAlgorithm algo, CipherOperator op,
-            const uint8_t* key, size_t keyLen,
-            const uint8_t* iv, size_t ivLen)
-{
-  return blockCipher(algo, op, {key, keyLen}, {iv, ivLen});
-}
-
 } // namespace transform
 } // namespace security
 } // namespace ndn
diff --git a/ndn-cxx/security/transform/buffer-source.cpp b/ndn-cxx/security/transform/buffer-source.cpp
index ea2b3d2..e050f7f 100644
--- a/ndn-cxx/security/transform/buffer-source.cpp
+++ b/ndn-cxx/security/transform/buffer-source.cpp
@@ -30,11 +30,6 @@
 {
 }
 
-BufferSource::BufferSource(const uint8_t* buf, size_t size)
-  : BufferSource(make_span(buf, size))
-{
-}
-
 BufferSource::BufferSource(const std::string& string)
   : m_bufs({{reinterpret_cast<const uint8_t*>(string.data()), string.size()}})
 {
diff --git a/ndn-cxx/security/transform/buffer-source.hpp b/ndn-cxx/security/transform/buffer-source.hpp
index 43069a0..9a9cd64 100644
--- a/ndn-cxx/security/transform/buffer-source.hpp
+++ b/ndn-cxx/security/transform/buffer-source.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).
  *
@@ -45,15 +45,6 @@
   BufferSource(span<const uint8_t> buffer);
 
   /**
-   * @brief Take a buffer @p buf with size @p size as input.
-   * @deprecated Use BufferSource(span<const uint8_t>)
-   *
-   * Caller must not destroy the buffer before the transformation is completed.
-   */
-  [[deprecated("use the constructor taking a span<>")]]
-  BufferSource(const uint8_t* buf, size_t size);
-
-  /**
    * @brief Take @p string as input.
    *
    * Caller must not destroy the string before the transformation is completed.
diff --git a/ndn-cxx/security/transform/private-key.hpp b/ndn-cxx/security/transform/private-key.hpp
index a435bea..3890a10 100644
--- a/ndn-cxx/security/transform/private-key.hpp
+++ b/ndn-cxx/security/transform/private-key.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).
  *
@@ -93,36 +93,12 @@
   loadRaw(KeyType type, span<const uint8_t> buf);
 
   /**
-   * @brief Load a raw private key from a buffer @p buf
-   * @deprecated
-   *
-   * @note Currently supports only HMAC keys.
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadRaw(KeyType type, const uint8_t* buf, size_t size)
-  {
-    loadRaw(type, {buf, size});
-  }
-
-  /**
    * @brief Load the private key in PKCS#1 format from a buffer @p buf
    */
   void
   loadPkcs1(span<const uint8_t> buf);
 
   /**
-   * @brief Load the private key in PKCS#1 format from a buffer @p buf
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs1(const uint8_t* buf, size_t size)
-  {
-    loadPkcs1({buf, size});
-  }
-
-  /**
    * @brief Load the private key in PKCS#1 format from a stream @p is
    */
   void
@@ -135,17 +111,6 @@
   loadPkcs1Base64(span<const uint8_t> buf);
 
   /**
-   * @brief Load the private key in base64-encoded PKCS#1 format from a buffer @p buf
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs1Base64(const uint8_t* buf, size_t size)
-  {
-    loadPkcs1Base64({buf, size});
-  }
-
-  /**
    * @brief Load the private key in base64-encoded PKCS#1 format from a stream @p is
    */
   void
@@ -168,20 +133,6 @@
   loadPkcs8(span<const uint8_t> buf, PasswordCallback pwCallback = nullptr);
 
   /**
-   * @brief Load the private key in encrypted PKCS#8 format from a buffer @p buf with
-   *        passphrase obtained from @p pwCallback
-   * @deprecated
-   *
-   * The default password callback is provided by OpenSSL
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs8(const uint8_t* buf, size_t size, PasswordCallback pwCallback = nullptr)
-  {
-    loadPkcs8({buf, size}, std::move(pwCallback));
-  }
-
-  /**
    * @brief Load the private key in encrypted PKCS#8 format from a stream @p is with passphrase @p pw
    * @pre strlen(pw) == pwLen
    */
@@ -215,20 +166,6 @@
   loadPkcs8Base64(span<const uint8_t> buf, PasswordCallback pwCallback = nullptr);
 
   /**
-   * @brief Load the private key in encrypted PKCS#8 format from a buffer @p buf with
-   *        passphrase obtained from @p pwCallback
-   * @deprecated
-   *
-   * The default password callback is provided by OpenSSL
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs8Base64(const uint8_t* buf, size_t size, PasswordCallback pwCallback = nullptr)
-  {
-    loadPkcs8Base64({buf, size}, std::move(pwCallback));
-  }
-
-  /**
    * @brief Load the private key in base64-encoded encrypted PKCS#8 format from a stream @p is
    *        with passphrase @p pw
    * @pre strlen(pw) == pwLen
@@ -301,19 +238,6 @@
   ConstBufferPtr
   decrypt(span<const uint8_t> cipherText) const;
 
-  /**
-   * @return Plain text of @p cipherText decrypted using this private key.
-   * @deprecated
-   *
-   * Only RSA encryption is supported for now.
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  ConstBufferPtr
-  decrypt(const uint8_t* cipherText, size_t cipherLen) const
-  {
-    return decrypt({cipherText, cipherLen});
-  }
-
 private:
   friend class SignerFilter;
   friend class VerifierFilter;
@@ -326,7 +250,6 @@
   void*
   getEvpPkey() const;
 
-private:
   ConstBufferPtr
   toPkcs1() const;
 
diff --git a/ndn-cxx/security/transform/public-key.hpp b/ndn-cxx/security/transform/public-key.hpp
index bbe7895..fb7b457 100644
--- a/ndn-cxx/security/transform/public-key.hpp
+++ b/ndn-cxx/security/transform/public-key.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).
  *
@@ -64,17 +64,6 @@
   loadPkcs8(span<const uint8_t> buf);
 
   /**
-   * @brief Load the public key in PKCS#8 format from a buffer @p buf
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs8(const uint8_t* buf, size_t size)
-  {
-    loadPkcs8({buf, size});
-  }
-
-  /**
    * @brief Load the public key in PKCS#8 format from a stream @p is
    */
   void
@@ -87,17 +76,6 @@
   loadPkcs8Base64(span<const uint8_t> buf);
 
   /**
-   * @brief Load the public key in base64-encoded PKCS#8 format from a buffer @p buf
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  void
-  loadPkcs8Base64(const uint8_t* buf, size_t size)
-  {
-    loadPkcs8Base64({buf, size});
-  }
-
-  /**
    * @brief Load the public key in base64-encoded PKCS#8 format from a stream @p is
    */
   void
@@ -118,24 +96,11 @@
   /**
    * @return Cipher text of @p plainText encrypted using this public key.
    *
-   * Only RSA encryption is supported for now.
+   * Only RSA encryption is supported.
    */
   ConstBufferPtr
   encrypt(span<const uint8_t> plainText) const;
 
-  /**
-   * @return Cipher text of @p plainText encrypted using this public key.
-   * @deprecated
-   *
-   * Only RSA encryption is supported for now.
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  ConstBufferPtr
-  encrypt(const uint8_t* plainText, size_t plainLen) const
-  {
-    return encrypt({plainText, plainLen});
-  }
-
 private:
   friend class VerifierFilter;
 
@@ -147,7 +112,6 @@
   void*
   getEvpPkey() const;
 
-private:
   ConstBufferPtr
   toPkcs8() const;
 
diff --git a/ndn-cxx/security/transform/step-source.hpp b/ndn-cxx/security/transform/step-source.hpp
index 84ab022..10fe86a 100644
--- a/ndn-cxx/security/transform/step-source.hpp
+++ b/ndn-cxx/security/transform/step-source.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,16 +57,6 @@
   write(span<const uint8_t> buf);
 
   /**
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  size_t
-  write(const uint8_t* buf, size_t size)
-  {
-    return write({buf, size});
-  }
-
-  /**
    * @brief Close the input interface and directly notify the next module the end of input.
    */
   void
diff --git a/ndn-cxx/security/transform/transform-base.hpp b/ndn-cxx/security/transform/transform-base.hpp
index 659b293..f1f9806 100644
--- a/ndn-cxx/security/transform/transform-base.hpp
+++ b/ndn-cxx/security/transform/transform-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).
  *
@@ -92,16 +92,6 @@
   write(span<const uint8_t> buf);
 
   /**
-   * @deprecated
-   */
-  [[deprecated("use the overload that takes a span<>")]]
-  size_t
-  write(const uint8_t* buf, size_t size)
-  {
-    return write({buf, size});
-  }
-
-  /**
    * @brief Close the input interface of a module.
    *
    * This method will notify this module that there is no more input and that the module
@@ -168,7 +158,6 @@
 protected:
   Upstream() = default;
 
-protected:
   /**
    * @brief Connect to the next transformation module
    */
diff --git a/ndn-cxx/security/verification-helpers.hpp b/ndn-cxx/security/verification-helpers.hpp
index 7d5f042..36cb721 100644
--- a/ndn-cxx/security/verification-helpers.hpp
+++ b/ndn-cxx/security/verification-helpers.hpp
@@ -56,18 +56,6 @@
 
 /**
  * @brief Verify @p blobs using @p key against @p sig.
- * @deprecated
- */
-[[deprecated("use the overload that takes a span<>")]]
-inline bool
-verifySignature(const InputBuffers& blobs, const uint8_t* sig, size_t sigLen,
-                const transform::PublicKey& key)
-{
-  return verifySignature(blobs, {sig, sigLen}, key);
-}
-
-/**
- * @brief Verify @p blobs using @p key against @p sig.
  * @note @p key must be a public key in PKCS #8 format.
  */
 NDN_CXX_NODISCARD bool
diff --git a/ndn-cxx/util/random.hpp b/ndn-cxx/util/random.hpp
index f7e5027..be32ea1 100644
--- a/ndn-cxx/util/random.hpp
+++ b/ndn-cxx/util/random.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,16 +54,6 @@
 void
 generateSecureBytes(span<uint8_t> buffer);
 
-/**
- * @deprecated Use generateSecureBytes(span<uint8_t>)
- */
-[[deprecated("use the overload that takes a span<>")]]
-inline void
-generateSecureBytes(uint8_t* bytes, size_t size)
-{
-  generateSecureBytes({bytes, size});
-}
-
 using RandomNumberEngine = std::mt19937;
 
 /**
diff --git a/ndn-cxx/util/sha256.hpp b/ndn-cxx/util/sha256.hpp
index e86d5ce..d776d30 100644
--- a/ndn-cxx/util/sha256.hpp
+++ b/ndn-cxx/util/sha256.hpp
@@ -146,13 +146,6 @@
   void
   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.
    * @note This method invokes computeDigest(), finalizing the digest.
@@ -167,13 +160,6 @@
   static ConstBufferPtr
   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;
   unique_ptr<OBufferStream> m_output;
diff --git a/tests/unit/encoding/encoder.t.cpp b/tests/unit/encoding/encoder.t.cpp
index 57a1f3d..0402f14 100644
--- a/tests/unit/encoding/encoder.t.cpp
+++ b/tests/unit/encoding/encoder.t.cpp
@@ -87,6 +87,8 @@
 {
   Encoder e;
 
+  // VarNumber
+
   BOOST_CHECK_EQUAL(e.prependVarNumber(1), 1);
   BOOST_CHECK_EQUAL(e.appendVarNumber(1), 1);
 
@@ -102,7 +104,7 @@
   BOOST_CHECK_EQUAL(e.prependVarNumber(4294967296LL), 9);
   BOOST_CHECK_EQUAL(e.appendVarNumber(4294967296LL), 9);
 
-  //
+  // NonNegativeInteger
 
   BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(1), 1);
   BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(1), 1);
@@ -127,19 +129,6 @@
 
   BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(4294967296LL), 8);
   BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(4294967296LL), 8);
-
-  //
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-  Block block1({0x01, 0x03, 0x00, 0x00, 0x00});
-  BOOST_CHECK_EQUAL(e.prependBlock(block1), 5);
-  BOOST_CHECK_EQUAL(e.appendBlock(block1), 5);
-
-  Block block2(100, block1);
-  BOOST_CHECK_EQUAL(e.prependBlock(block2), 7);
-  BOOST_CHECK_EQUAL(e.appendBlock(block2), 7);
-#pragma GCC diagnostic pop
 }
 
 BOOST_AUTO_TEST_CASE(Reserve)
diff --git a/tests/unit/encoding/estimator.t.cpp b/tests/unit/encoding/estimator.t.cpp
index d4ecbaf..cb86424 100644
--- a/tests/unit/encoding/estimator.t.cpp
+++ b/tests/unit/encoding/estimator.t.cpp
@@ -56,6 +56,8 @@
 {
   Estimator e;
 
+  // VarNumber
+
   BOOST_CHECK_EQUAL(e.prependVarNumber(1), 1);
   BOOST_CHECK_EQUAL(e.appendVarNumber(1), 1);
 
@@ -71,7 +73,7 @@
   BOOST_CHECK_EQUAL(e.prependVarNumber(4294967296LL), 9);
   BOOST_CHECK_EQUAL(e.appendVarNumber(4294967296LL), 9);
 
-  //
+  // NonNegativeInteger
 
   BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(1), 1);
   BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(1), 1);
@@ -96,19 +98,6 @@
 
   BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(4294967296LL), 8);
   BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(4294967296LL), 8);
-
-  //
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-  Block block1({0x01, 0x03, 0x00, 0x00, 0x00});
-  BOOST_CHECK_EQUAL(e.prependBlock(block1), 5);
-  BOOST_CHECK_EQUAL(e.appendBlock(block1), 5);
-
-  Block block2(100, block1);
-  BOOST_CHECK_EQUAL(e.prependBlock(block2), 7);
-  BOOST_CHECK_EQUAL(e.appendBlock(block2), 7);
-#pragma GCC diagnostic pop
 }
 
 BOOST_AUTO_TEST_SUITE_END() // TestEstimator
diff --git a/wscript b/wscript
index e7146d8..6ef587a 100644
--- a/wscript
+++ b/wscript
@@ -5,8 +5,6 @@
 
 VERSION = '0.8.0'
 APPNAME = 'ndn-cxx'
-PACKAGE_BUGREPORT = 'https://redmine.named-data.net/projects/ndn-cxx'
-PACKAGE_URL = 'http://named-data.net/doc/ndn-cxx/'
 GIT_TAG_PREFIX = 'ndn-cxx-'
 
 def options(opt):
