diff --git a/docs/specs/validation-error-code.rst b/docs/specs/validation-error-code.rst
index 4610cd4..dc2c18c 100644
--- a/docs/specs/validation-error-code.rst
+++ b/docs/specs/validation-error-code.rst
@@ -1,7 +1,7 @@
 Validation Error Code
 =====================
 
-The following table defines a list of known codes and their description, which can be returned from the :ndn-cxx:`v2::Validator` interface.
+The following table defines a list of known codes and their description, which can be returned from the :ndn-cxx:`Validator` interface.
 Other error codes can be returned by validator implementations outside ndn-cxx codebase.
 
 +------------+--------------------------+-----------------------------------------------------+
diff --git a/ndn-cxx/impl/face-impl.hpp b/ndn-cxx/impl/face-impl.hpp
index cbfb76b..d5acc86 100644
--- a/ndn-cxx/impl/face-impl.hpp
+++ b/ndn-cxx/impl/face-impl.hpp
@@ -417,7 +417,7 @@
 
   unique_ptr<boost::asio::io_service::work> m_ioServiceWork; // if thread needs to be preserved
 
-  friend class Face;
+  friend Face;
 };
 
 } // namespace ndn
diff --git a/ndn-cxx/mgmt/nfd/controller.cpp b/ndn-cxx/mgmt/nfd/controller.cpp
index 5a3ce12..dbc0014 100644
--- a/ndn-cxx/mgmt/nfd/controller.cpp
+++ b/ndn-cxx/mgmt/nfd/controller.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -36,7 +36,7 @@
 const uint32_t Controller::ERROR_SERVER = 500;
 const uint32_t Controller::ERROR_LBOUND = 400;
 
-Controller::Controller(Face& face, KeyChain& keyChain, security::v2::Validator& validator)
+Controller::Controller(Face& face, KeyChain& keyChain, security::Validator& validator)
   : m_face(face)
   , m_keyChain(keyChain)
   , m_validator(validator)
diff --git a/ndn-cxx/mgmt/nfd/controller.hpp b/ndn-cxx/mgmt/nfd/controller.hpp
index 8e7446b..2071e71 100644
--- a/ndn-cxx/mgmt/nfd/controller.hpp
+++ b/ndn-cxx/mgmt/nfd/controller.hpp
@@ -67,7 +67,7 @@
    *         and uses the passed KeyChain to sign commands
    */
   Controller(Face& face, KeyChain& keyChain,
-             security::v2::Validator& validator = security::getAcceptAllValidator());
+             security::Validator& validator = security::getAcceptAllValidator());
 
   ~Controller();
 
@@ -173,7 +173,7 @@
 protected:
   Face& m_face;
   KeyChain& m_keyChain;
-  security::v2::Validator& m_validator;
+  security::Validator& m_validator;
   security::CommandInterestSigner m_signer;
 
 NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED:
diff --git a/ndn-cxx/security/certificate.cpp b/ndn-cxx/security/certificate.cpp
index b54c56d..1e93583 100644
--- a/ndn-cxx/security/certificate.cpp
+++ b/ndn-cxx/security/certificate.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -153,7 +153,7 @@
   auto additionalDescription = cert.getSignatureInfo().getCustomTlv(tlv::AdditionalDescription);
   if (additionalDescription) {
     os << "Additional Description:\n";
-    for (const auto& item : v2::AdditionalDescription(*additionalDescription)) {
+    for (const auto& item : AdditionalDescription(*additionalDescription)) {
       os << "  " << item.first << ": " << item.second << "\n";
     }
   }
diff --git a/ndn-cxx/security/key-chain.hpp b/ndn-cxx/security/key-chain.hpp
index 8fe3dfe..a550d60 100644
--- a/ndn-cxx/security/key-chain.hpp
+++ b/ndn-cxx/security/key-chain.hpp
@@ -446,7 +446,7 @@
  * This macro should be placed once in the implementation file of the
  * Pib backend class within the namespace where the type is declared.
  *
- * @note This interface is implementation detail and may change without notice.
+ * @note This interface is an implementation detail and may change without notice.
  */
 #define NDN_CXX_KEYCHAIN_REGISTER_PIB_BACKEND(PibType)     \
 static class NdnCxxAuto ## PibType ## PibRegistrationClass    \
@@ -454,7 +454,7 @@
 public:                                                       \
   NdnCxxAuto ## PibType ## PibRegistrationClass()             \
   {                                                           \
-    ::ndn::security::v2::KeyChain::registerPibBackend<PibType>(PibType::getScheme()); \
+    ::ndn::security::KeyChain::registerPibBackend<PibType>(PibType::getScheme()); \
   }                                                           \
 } ndnCxxAuto ## PibType ## PibRegistrationVariable
 
@@ -464,7 +464,7 @@
  * This macro should be placed once in the implementation file of the
  * Tpm backend class within the namespace where the type is declared.
  *
- * @note This interface is implementation detail and may change without notice.
+ * @note This interface is an implementation detail and may change without notice.
  */
 #define NDN_CXX_KEYCHAIN_REGISTER_TPM_BACKEND(TpmType)     \
 static class NdnCxxAuto ## TpmType ## TpmRegistrationClass    \
@@ -472,14 +472,14 @@
 public:                                                       \
   NdnCxxAuto ## TpmType ## TpmRegistrationClass()             \
   {                                                           \
-    ::ndn::security::v2::KeyChain::registerTpmBackend<TpmType>(TpmType::getScheme()); \
+    ::ndn::security::KeyChain::registerTpmBackend<TpmType>(TpmType::getScheme()); \
   }                                                           \
 } ndnCxxAuto ## TpmType ## TpmRegistrationVariable
 
 } // inline namespace v2
 } // namespace security
 
-using security::v2::KeyChain;
+using security::KeyChain;
 
 } // namespace ndn
 
diff --git a/ndn-cxx/security/pib/certificate-container.cpp b/ndn-cxx/security/pib/certificate-container.cpp
index a2a6762..a3ced13 100644
--- a/ndn-cxx/security/pib/certificate-container.cpp
+++ b/ndn-cxx/security/pib/certificate-container.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -41,7 +41,7 @@
 {
 }
 
-v2::Certificate
+Certificate
 CertificateContainer::const_iterator::operator*()
 {
   BOOST_ASSERT(m_container != nullptr);
@@ -91,19 +91,19 @@
 CertificateContainer::const_iterator
 CertificateContainer::begin() const
 {
-  return const_iterator(m_certNames.begin(), *this);
+  return {m_certNames.begin(), *this};
 }
 
 CertificateContainer::const_iterator
 CertificateContainer::end() const
 {
-  return const_iterator();
+  return {};
 }
 
 CertificateContainer::const_iterator
 CertificateContainer::find(const Name& certName) const
 {
-  return const_iterator(m_certNames.find(certName), *this);
+  return {m_certNames.find(certName), *this};
 }
 
 size_t
@@ -113,7 +113,7 @@
 }
 
 void
-CertificateContainer::add(const v2::Certificate& certificate)
+CertificateContainer::add(const Certificate& certificate)
 {
   if (m_keyName != certificate.getKeyName())
     NDN_THROW(std::invalid_argument("Certificate name `" + certificate.getKeyName().toUri() + "` "
@@ -128,8 +128,7 @@
 void
 CertificateContainer::remove(const Name& certName)
 {
-  if (!v2::Certificate::isValidName(certName) ||
-      v2::extractKeyNameFromCertName(certName) != m_keyName) {
+  if (!Certificate::isValidName(certName) || extractKeyNameFromCertName(certName) != m_keyName) {
     NDN_THROW(std::invalid_argument("Certificate name `" + certName.toUri() + "` "
                                     "is invalid or does not match key name"));
   }
@@ -139,7 +138,7 @@
   m_pib->removeCertificate(certName);
 }
 
-v2::Certificate
+Certificate
 CertificateContainer::get(const Name& certName) const
 {
   auto it = m_certs.find(certName);
@@ -147,8 +146,7 @@
   if (it != m_certs.end())
     return it->second;
 
-  if (!v2::Certificate::isValidName(certName) ||
-      v2::extractKeyNameFromCertName(certName) != m_keyName) {
+  if (!Certificate::isValidName(certName) || extractKeyNameFromCertName(certName) != m_keyName) {
     NDN_THROW(std::invalid_argument("Certificate name `" + certName.toUri() + "` "
                                     "is invalid or does not match key name"));
   }
diff --git a/ndn-cxx/security/pib/certificate-container.hpp b/ndn-cxx/security/pib/certificate-container.hpp
index d9bcbb1..3befdde 100644
--- a/ndn-cxx/security/pib/certificate-container.hpp
+++ b/ndn-cxx/security/pib/certificate-container.hpp
@@ -58,7 +58,7 @@
 
     const_iterator();
 
-    v2::Certificate
+    Certificate
     operator*();
 
     const_iterator&
@@ -83,7 +83,7 @@
     friend class CertificateContainer;
   };
 
-  typedef const_iterator iterator;
+  using iterator = const_iterator;
 
 public:
   const_iterator
@@ -103,7 +103,7 @@
    * @throw std::invalid_argument the name of @p certificate does not match the key name
    */
   void
-  add(const v2::Certificate& certificate);
+  add(const Certificate& certificate);
 
   /**
    * @brief Remove a certificate with @p certName from the container
@@ -117,7 +117,7 @@
    * @throw std::invalid_argument @p certName does not match the key name
    * @throw Pib::Error the certificate does not exist
    */
-  v2::Certificate
+  Certificate
   get(const Name& certName) const;
 
   /**
@@ -140,7 +140,7 @@
     return m_certNames;
   }
 
-  const std::unordered_map<Name, v2::Certificate>&
+  const std::unordered_map<Name, Certificate>&
   getCache() const
   {
     return m_certs;
@@ -150,11 +150,13 @@
   Name m_keyName;
   std::set<Name> m_certNames;
   /// @brief Cache of loaded certificates
-  mutable std::unordered_map<Name, v2::Certificate> m_certs;
+  mutable std::unordered_map<Name, Certificate> m_certs;
 
   shared_ptr<PibImpl> m_pib;
 
-  friend class detail::KeyImpl;
+#ifndef DOXYGEN
+  friend detail::KeyImpl;
+#endif
 };
 
 } // namespace pib
diff --git a/ndn-cxx/security/pib/identity.hpp b/ndn-cxx/security/pib/identity.hpp
index 968fb51..5ab5aa1 100644
--- a/ndn-cxx/security/pib/identity.hpp
+++ b/ndn-cxx/security/pib/identity.hpp
@@ -26,6 +26,11 @@
 
 namespace ndn {
 namespace security {
+
+inline namespace v2 {
+class KeyChain;
+} // inline namespace v2
+
 namespace pib {
 
 namespace detail {
@@ -151,7 +156,7 @@
 private:
   weak_ptr<detail::IdentityImpl> m_impl;
 
-  friend class v2::KeyChain;
+  friend KeyChain;
   friend bool operator!=(const Identity&, const Identity&);
 };
 
diff --git a/ndn-cxx/security/pib/impl/key-impl.cpp b/ndn-cxx/security/pib/impl/key-impl.cpp
index 79c0300..1447a98 100644
--- a/ndn-cxx/security/pib/impl/key-impl.cpp
+++ b/ndn-cxx/security/pib/impl/key-impl.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-2021 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 detail {
 
 KeyImpl::KeyImpl(const Name& keyName, const uint8_t* key, size_t keyLen, shared_ptr<PibImpl> pibImpl)
-  : m_identity(v2::extractIdentityFromKeyName(keyName))
+  : m_identity(extractIdentityFromKeyName(keyName))
   , m_keyName(keyName)
   , m_key(key, keyLen)
   , m_pib(std::move(pibImpl))
@@ -52,7 +52,7 @@
 }
 
 KeyImpl::KeyImpl(const Name& keyName, shared_ptr<PibImpl> pibImpl)
-  : m_identity(v2::extractIdentityFromKeyName(keyName))
+  : m_identity(extractIdentityFromKeyName(keyName))
   , m_keyName(keyName)
   , m_pib(std::move(pibImpl))
   , m_certificates(keyName, m_pib)
@@ -68,7 +68,7 @@
 }
 
 void
-KeyImpl::addCertificate(const v2::Certificate& certificate)
+KeyImpl::addCertificate(const Certificate& certificate)
 {
   BOOST_ASSERT(m_certificates.isConsistent());
   m_certificates.add(certificate);
@@ -85,7 +85,7 @@
   m_certificates.remove(certName);
 }
 
-v2::Certificate
+Certificate
 KeyImpl::getCertificate(const Name& certName) const
 {
   BOOST_ASSERT(m_certificates.isConsistent());
@@ -99,7 +99,7 @@
   return m_certificates;
 }
 
-const v2::Certificate&
+const Certificate&
 KeyImpl::setDefaultCertificate(const Name& certName)
 {
   BOOST_ASSERT(m_certificates.isConsistent());
@@ -110,14 +110,14 @@
   return m_defaultCertificate;
 }
 
-const v2::Certificate&
-KeyImpl::setDefaultCertificate(const v2::Certificate& certificate)
+const Certificate&
+KeyImpl::setDefaultCertificate(const Certificate& certificate)
 {
   addCertificate(certificate);
   return setDefaultCertificate(certificate.getName());
 }
 
-const v2::Certificate&
+const Certificate&
 KeyImpl::getDefaultCertificate() const
 {
   BOOST_ASSERT(m_certificates.isConsistent());
diff --git a/ndn-cxx/security/pib/impl/key-impl.hpp b/ndn-cxx/security/pib/impl/key-impl.hpp
index c95b5c6..64a00d7 100644
--- a/ndn-cxx/security/pib/impl/key-impl.hpp
+++ b/ndn-cxx/security/pib/impl/key-impl.hpp
@@ -115,7 +115,7 @@
    * @throw std::invalid_argument the certificate name does not match the key name.
    */
   void
-  addCertificate(const v2::Certificate& certificate);
+  addCertificate(const Certificate& certificate);
 
   /**
    * @brief Remove a certificate with @p certName.
@@ -129,7 +129,7 @@
    * @throw std::invalid_argument @p certName does not match the key name.
    * @throw Pib::Error the certificate does not exist.
    */
-  v2::Certificate
+  Certificate
   getCertificate(const Name& certName) const;
 
   /**
@@ -144,7 +144,7 @@
    * @throw Pib::Error the certificate does not exist.
    * @return the default certificate
    */
-  const v2::Certificate&
+  const Certificate&
   setDefaultCertificate(const Name& certName);
 
   /**
@@ -156,14 +156,14 @@
    * @throw std::invalid_argument @p certificate does not match the key name.
    * @return the default certificate
    */
-  const v2::Certificate&
-  setDefaultCertificate(const v2::Certificate& certificate);
+  const Certificate&
+  setDefaultCertificate(const Certificate& certificate);
 
   /**
    * @brief Get the default certificate for this key.
    * @throw Pib::Error the default certificate does not exist.
    */
-  const v2::Certificate&
+  const Certificate&
   getDefaultCertificate() const;
 
 private:
@@ -176,7 +176,7 @@
 
   CertificateContainer m_certificates;
   mutable bool m_isDefaultCertificateLoaded;
-  mutable v2::Certificate m_defaultCertificate;
+  mutable Certificate m_defaultCertificate;
 };
 
 } // namespace detail
diff --git a/ndn-cxx/security/pib/impl/pib-memory.cpp b/ndn-cxx/security/pib/impl/pib-memory.cpp
index 0e10861..22e7b48 100644
--- a/ndn-cxx/security/pib/impl/pib-memory.cpp
+++ b/ndn-cxx/security/pib/impl/pib-memory.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -145,7 +145,7 @@
 void
 PibMemory::removeKey(const Name& keyName)
 {
-  Name identity = v2::extractIdentityFromKeyName(keyName);
+  Name identity = extractIdentityFromKeyName(keyName);
 
   m_keys.erase(keyName);
   m_defaultKeys.erase(identity);
@@ -173,7 +173,7 @@
 {
   std::set<Name> ids;
   for (const auto& keyName : m_keys | boost::adaptors::map_keys) {
-    if (identity == v2::extractIdentityFromKeyName(keyName)) {
+    if (identity == extractIdentityFromKeyName(keyName)) {
       ids.insert(keyName);
     }
   }
@@ -208,7 +208,7 @@
 }
 
 void
-PibMemory::addCertificate(const v2::Certificate& certificate)
+PibMemory::addCertificate(const Certificate& certificate)
 {
   Name certName = certificate.getName();
   Name keyName = certificate.getKeyName();
@@ -226,13 +226,13 @@
 PibMemory::removeCertificate(const Name& certName)
 {
   m_certs.erase(certName);
-  auto defaultCert = m_defaultCerts.find(v2::extractKeyNameFromCertName(certName));
+  auto defaultCert = m_defaultCerts.find(extractKeyNameFromCertName(certName));
   if (defaultCert != m_defaultCerts.end() && defaultCert->second == certName) {
     m_defaultCerts.erase(defaultCert);
   }
 }
 
-v2::Certificate
+Certificate
 PibMemory::getCertificate(const Name& certName) const
 {
   if (!hasCertificate(certName)) {
@@ -248,7 +248,7 @@
 {
   std::set<Name> certNames;
   for (const auto& it : m_certs) {
-    if (v2::extractKeyNameFromCertName(it.second.getName()) == keyName) {
+    if (extractKeyNameFromCertName(it.second.getName()) == keyName) {
       certNames.insert(it.first);
     }
   }
@@ -265,7 +265,7 @@
   m_defaultCerts[keyName] = certName;
 }
 
-v2::Certificate
+Certificate
 PibMemory::getDefaultCertificateOfKey(const Name& keyName) const
 {
   auto it = m_defaultCerts.find(keyName);
diff --git a/ndn-cxx/security/pib/impl/pib-memory.hpp b/ndn-cxx/security/pib/impl/pib-memory.hpp
index 110f720..63a3b49 100644
--- a/ndn-cxx/security/pib/impl/pib-memory.hpp
+++ b/ndn-cxx/security/pib/impl/pib-memory.hpp
@@ -103,12 +103,12 @@
   hasCertificate(const Name& certName) const override;
 
   void
-  addCertificate(const v2::Certificate& certificate) override;
+  addCertificate(const Certificate& certificate) override;
 
   void
   removeCertificate(const Name& certName) override;
 
-  v2::Certificate
+  Certificate
   getCertificate(const Name& certName) const override;
 
   std::set<Name>
@@ -117,7 +117,7 @@
   void
   setDefaultCertificateOfKey(const Name& keyName, const Name& certName) override;
 
-  v2::Certificate
+  Certificate
   getDefaultCertificateOfKey(const Name& keyName) const override;
 
 private:
@@ -138,7 +138,7 @@
   std::map<Name, Name> m_defaultCerts;
 
   /// @brief certificate Name => certificate
-  std::map<Name, v2::Certificate> m_certs;
+  std::map<Name, Certificate> m_certs;
 };
 
 } // namespace pib
diff --git a/ndn-cxx/security/pib/impl/pib-sqlite3.cpp b/ndn-cxx/security/pib/impl/pib-sqlite3.cpp
index a05fa16..d32c7aa 100644
--- a/ndn-cxx/security/pib/impl/pib-sqlite3.cpp
+++ b/ndn-cxx/security/pib/impl/pib-sqlite3.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -482,7 +482,7 @@
 }
 
 void
-PibSqlite3::addCertificate(const v2::Certificate& certificate)
+PibSqlite3::addCertificate(const Certificate& certificate)
 {
   // ensure key exists
   const Block& content = certificate.getContent();
@@ -519,7 +519,7 @@
   statement.step();
 }
 
-v2::Certificate
+Certificate
 PibSqlite3::getCertificate(const Name& certName) const
 {
   Sqlite3Statement statement(m_database,
@@ -527,7 +527,7 @@
   statement.bind(1, certName.wireEncode(), SQLITE_TRANSIENT);
 
   if (statement.step() == SQLITE_ROW)
-    return v2::Certificate(statement.getBlock(0));
+    return Certificate(statement.getBlock(0));
   else
     NDN_THROW(Pib::Error("Certificate `" + certName.toUri() + "` does not exit"));
 }
@@ -562,7 +562,7 @@
   statement.step();
 }
 
-v2::Certificate
+Certificate
 PibSqlite3::getDefaultCertificateOfKey(const Name& keyName) const
 {
   Sqlite3Statement statement(m_database,
@@ -572,7 +572,7 @@
   statement.bind(1, keyName.wireEncode(), SQLITE_TRANSIENT);
 
   if (statement.step() == SQLITE_ROW)
-    return v2::Certificate(statement.getBlock(0));
+    return Certificate(statement.getBlock(0));
   else
     NDN_THROW(Pib::Error("No default certificate for key `" + keyName.toUri() + "`"));
 }
diff --git a/ndn-cxx/security/pib/impl/pib-sqlite3.hpp b/ndn-cxx/security/pib/impl/pib-sqlite3.hpp
index a6fd015..d5960c7 100644
--- a/ndn-cxx/security/pib/impl/pib-sqlite3.hpp
+++ b/ndn-cxx/security/pib/impl/pib-sqlite3.hpp
@@ -36,7 +36,7 @@
  * All the contents in Pib are stored in a SQLite3 database file.
  * This backend provides more persistent storage than PibMemory.
  */
-class PibSqlite3 : public PibImpl
+class PibSqlite3 final : public PibImpl
 {
 public:
   /**
@@ -57,7 +57,7 @@
   /**
    * @brief Destruct and cleanup internal state
    */
-  ~PibSqlite3();
+  ~PibSqlite3() final;
 
   static const std::string&
   getScheme();
@@ -119,12 +119,12 @@
   hasCertificate(const Name& certName) const final;
 
   void
-  addCertificate(const v2::Certificate& certificate) final;
+  addCertificate(const Certificate& certificate) final;
 
   void
   removeCertificate(const Name& certName) final;
 
-  v2::Certificate
+  Certificate
   getCertificate(const Name& certName) const final;
 
   std::set<Name>
@@ -133,7 +133,7 @@
   void
   setDefaultCertificateOfKey(const Name& keyName, const Name& certName) final;
 
-  v2::Certificate
+  Certificate
   getDefaultCertificateOfKey(const Name& keyName) const final;
 
 private:
diff --git a/ndn-cxx/security/pib/key-container.cpp b/ndn-cxx/security/pib/key-container.cpp
index ccf3ad0..ceae0a7 100644
--- a/ndn-cxx/security/pib/key-container.cpp
+++ b/ndn-cxx/security/pib/key-container.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -20,8 +20,8 @@
  */
 
 #include "ndn-cxx/security/pib/key-container.hpp"
-#include "ndn-cxx/security/pib/pib-impl.hpp"
 #include "ndn-cxx/security/pib/impl/key-impl.hpp"
+#include "ndn-cxx/security/pib/pib-impl.hpp"
 #include "ndn-cxx/util/concepts.hpp"
 
 namespace ndn {
@@ -91,19 +91,19 @@
 KeyContainer::const_iterator
 KeyContainer::begin() const
 {
-  return const_iterator(m_keyNames.begin(), *this);
+  return {m_keyNames.begin(), *this};
 }
 
 KeyContainer::const_iterator
 KeyContainer::end() const
 {
-  return const_iterator();
+  return {};
 }
 
 KeyContainer::const_iterator
 KeyContainer::find(const Name& keyName) const
 {
-  return const_iterator(m_keyNames.find(keyName), *this);
+  return {m_keyNames.find(keyName), *this};
 }
 
 size_t
@@ -115,7 +115,7 @@
 Key
 KeyContainer::add(const uint8_t* key, size_t keyLen, const Name& keyName)
 {
-  if (m_identity != v2::extractIdentityFromKeyName(keyName)) {
+  if (m_identity != extractIdentityFromKeyName(keyName)) {
     NDN_THROW(std::invalid_argument("Key name `" + keyName.toUri() + "` does not match identity "
                                     "`" + m_identity.toUri() + "`"));
   }
@@ -129,7 +129,7 @@
 void
 KeyContainer::remove(const Name& keyName)
 {
-  if (m_identity != v2::extractIdentityFromKeyName(keyName)) {
+  if (m_identity != extractIdentityFromKeyName(keyName)) {
     NDN_THROW(std::invalid_argument("Key name `" + keyName.toUri() + "` does not match identity "
                                     "`" + m_identity.toUri() + "`"));
   }
@@ -142,7 +142,7 @@
 Key
 KeyContainer::get(const Name& keyName) const
 {
-  if (m_identity != v2::extractIdentityFromKeyName(keyName)) {
+  if (m_identity != extractIdentityFromKeyName(keyName)) {
     NDN_THROW(std::invalid_argument("Key name `" + keyName.toUri() + "` does not match identity "
                                     "`" + m_identity.toUri() + "`"));
   }
diff --git a/ndn-cxx/security/pib/key-container.hpp b/ndn-cxx/security/pib/key-container.hpp
index 616d88a..1db0bae 100644
--- a/ndn-cxx/security/pib/key-container.hpp
+++ b/ndn-cxx/security/pib/key-container.hpp
@@ -84,7 +84,7 @@
     friend class KeyContainer;
   };
 
-  typedef const_iterator iterator;
+  using iterator = const_iterator;
 
 public:
   const_iterator
@@ -158,7 +158,9 @@
 
   shared_ptr<PibImpl> m_pib;
 
-  friend class detail::IdentityImpl;
+#ifndef DOXYGEN
+  friend detail::IdentityImpl;
+#endif
 };
 
 } // namespace pib
diff --git a/ndn-cxx/security/pib/key.cpp b/ndn-cxx/security/pib/key.cpp
index 5eb011d..d6fe78a 100644
--- a/ndn-cxx/security/pib/key.cpp
+++ b/ndn-cxx/security/pib/key.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 Key::Key() = default;
 
 Key::Key(weak_ptr<detail::KeyImpl> impl)
-  : m_impl(impl)
+  : m_impl(std::move(impl))
 {
 }
 
@@ -59,18 +59,18 @@
 }
 
 void
-Key::addCertificate(const v2::Certificate& certificate) const
+Key::addCertificate(const Certificate& certificate) const
 {
-  return lock()->addCertificate(certificate);
+  lock()->addCertificate(certificate);
 }
 
 void
 Key::removeCertificate(const Name& certName) const
 {
-  return lock()->removeCertificate(certName);
+  lock()->removeCertificate(certName);
 }
 
-v2::Certificate
+Certificate
 Key::getCertificate(const Name& certName) const
 {
   return lock()->getCertificate(certName);
@@ -82,19 +82,19 @@
   return lock()->getCertificates();
 }
 
-const v2::Certificate&
+const Certificate&
 Key::setDefaultCertificate(const Name& certName) const
 {
   return lock()->setDefaultCertificate(certName);
 }
 
-const v2::Certificate&
-Key::setDefaultCertificate(const v2::Certificate& certificate) const
+const Certificate&
+Key::setDefaultCertificate(const Certificate& certificate) const
 {
   return lock()->setDefaultCertificate(certificate);
 }
 
-const v2::Certificate&
+const Certificate&
 Key::getDefaultCertificate() const
 {
   return lock()->getDefaultCertificate();
diff --git a/ndn-cxx/security/pib/key.hpp b/ndn-cxx/security/pib/key.hpp
index ead7693..0c4df65 100644
--- a/ndn-cxx/security/pib/key.hpp
+++ b/ndn-cxx/security/pib/key.hpp
@@ -106,7 +106,7 @@
    * @throw std::invalid_argument @p certName does not match key name
    * @throw Pib::Error the certificate does not exist.
    */
-  v2::Certificate
+  Certificate
   getCertificate(const Name& certName) const;
 
   /**
@@ -119,7 +119,7 @@
    * @brief Get the default certificate for this Key.
    * @throw Pib::Error the default certificate does not exist.
    */
-  const v2::Certificate&
+  const Certificate&
   getDefaultCertificate() const;
 
   /**
@@ -137,7 +137,7 @@
    * the certificate.
    */
   void
-  addCertificate(const v2::Certificate& certificate) const;
+  addCertificate(const Certificate& certificate) const;
 
   /**
    * @brief Remove a certificate with @p certName
@@ -152,7 +152,7 @@
    * @throw Pib::Error the certificate does not exist.
    * @return the default certificate
    */
-  const v2::Certificate&
+  const Certificate&
   setDefaultCertificate(const Name& certName) const;
 
   /**
@@ -160,8 +160,8 @@
    * @throw std::invalid_argument @p certificate does not match key name
    * @return the default certificate
    */
-  const v2::Certificate&
-  setDefaultCertificate(const v2::Certificate& certificate) const;
+  const Certificate&
+  setDefaultCertificate(const Certificate& certificate) const;
 
 private:
   /**
@@ -175,7 +175,7 @@
 private:
   weak_ptr<detail::KeyImpl> m_impl;
 
-  friend class v2::KeyChain;
+  friend KeyChain;
   friend bool operator!=(const Key&, const Key&);
 };
 
diff --git a/ndn-cxx/security/pib/pib-impl.hpp b/ndn-cxx/security/pib/pib-impl.hpp
index db3470a..99e4233 100644
--- a/ndn-cxx/security/pib/pib-impl.hpp
+++ b/ndn-cxx/security/pib/pib-impl.hpp
@@ -226,7 +226,7 @@
    * @param certificate The certificate to add.
    */
   virtual void
-  addCertificate(const v2::Certificate& certificate) = 0;
+  addCertificate(const Certificate& certificate) = 0;
 
   /**
    * @brief Remove a certificate with name @p certName.
@@ -245,7 +245,7 @@
    * @return the certificate.
    * @throw Pib::Error the certificate does not exist.
    */
-  virtual v2::Certificate
+  virtual Certificate
   getCertificate(const Name& certName) const = 0;
 
   /**
@@ -272,7 +272,7 @@
    *
    * @throw Pib::Error the default certificate does not exist.
    */
-  virtual v2::Certificate
+  virtual Certificate
   getDefaultCertificateOfKey(const Name& keyName) const = 0;
 };
 
diff --git a/ndn-cxx/security/pib/pib.hpp b/ndn-cxx/security/pib/pib.hpp
index d30146c..5fb38a3 100644
--- a/ndn-cxx/security/pib/pib.hpp
+++ b/ndn-cxx/security/pib/pib.hpp
@@ -43,8 +43,8 @@
  * the Pib class provides access to identities, and allows setting a default identity. Properties of
  * an identity can be accessed after obtaining an Identity object.
  *
- * @note Pib instance is created and managed only by v2::KeyChain.  v2::KeyChain::getPib()
- *       returns a const reference to the managed Pib instance, through which it is possible to
+ * @note Pib instance is created and managed only by KeyChain. KeyChain::getPib() returns
+ *       a const reference to the managed Pib instance, through which it is possible to
  *       retrieve information about identities, keys, and certificates.
  *
  * @throw PibImpl::Error when underlying implementation has non-semantic error.
@@ -174,7 +174,7 @@
 
   shared_ptr<PibImpl> m_impl;
 
-  friend class v2::KeyChain;
+  friend KeyChain;
 };
 
 } // namespace pib
diff --git a/ndn-cxx/security/signing-helpers.cpp b/ndn-cxx/security/signing-helpers.cpp
index 37851fa..a81097f 100644
--- a/ndn-cxx/security/signing-helpers.cpp
+++ b/ndn-cxx/security/signing-helpers.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -55,7 +55,7 @@
 }
 
 SigningInfo
-signingByCertificate(const v2::Certificate& cert)
+signingByCertificate(const Certificate& cert)
 {
   return SigningInfo(SigningInfo::SIGNER_TYPE_CERT, cert.getName());
 }
diff --git a/ndn-cxx/security/signing-helpers.hpp b/ndn-cxx/security/signing-helpers.hpp
index 6be8ec8..55d8ad5 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-2018 Regents of the University of California.
+ * Copyright (c) 2013-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -62,7 +62,7 @@
  * \return a SigningInfo for signing with a certificate
  */
 SigningInfo
-signingByCertificate(const v2::Certificate& cert);
+signingByCertificate(const Certificate& cert);
 
 /**
  * \return a SigningInfo for signing with Sha256
diff --git a/ndn-cxx/security/tpm/back-end.cpp b/ndn-cxx/security/tpm/back-end.cpp
index ec25623..480ab03 100644
--- a/ndn-cxx/security/tpm/back-end.cpp
+++ b/ndn-cxx/security/tpm/back-end.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -59,7 +59,7 @@
   switch (params.getKeyIdType()) {
     case KeyIdType::USER_SPECIFIED: {
       // check that the provided key id isn't already taken
-      Name keyName = v2::constructKeyName(identity, params.getKeyId());
+      Name keyName = constructKeyName(identity, params.getKeyId());
       if (hasKey(keyName)) {
         NDN_THROW(Error("Key `" + keyName.toUri() + "` already exists"));
       }
@@ -116,7 +116,7 @@
 {
   switch (params.getKeyIdType()) {
     case KeyIdType::USER_SPECIFIED: {
-      return v2::constructKeyName(identity, params.getKeyId());
+      return constructKeyName(identity, params.getKeyId());
     }
     case KeyIdType::SHA256: {
       using namespace transform;
@@ -124,13 +124,13 @@
       bufferSource(*keyHandle.derivePublicKey()) >>
         digestFilter(DigestAlgorithm::SHA256) >>
         streamSink(os);
-      return v2::constructKeyName(identity, name::Component(os.buf()));
+      return constructKeyName(identity, name::Component(os.buf()));
     }
     case KeyIdType::RANDOM: {
       Name keyName;
       do {
         auto keyId = name::Component::fromNumber(random::generateSecureWord64());
-        keyName = v2::constructKeyName(identity, keyId);
+        keyName = constructKeyName(identity, keyId);
       } while (hasKey(keyName));
       return keyName;
     }
diff --git a/ndn-cxx/security/tpm/tpm.hpp b/ndn-cxx/security/tpm/tpm.hpp
index 08400c6..d1da79b 100644
--- a/ndn-cxx/security/tpm/tpm.hpp
+++ b/ndn-cxx/security/tpm/tpm.hpp
@@ -57,10 +57,10 @@
  * A TPM consists of a unified front-end interface and a back-end implementation. The front-end
  * cache the handles of private keys which is provided by the back-end implementation.
  *
- * @note Tpm instance is created and managed only by v2::KeyChain.  v2::KeyChain::getTpm()
- *       returns a const reference to the managed Tpm instance, through which it is possible to
- *       check existence of private keys, get public keys for the private keys, sign, and decrypt
- *       the supplied buffers using managed private keys.
+ * @note Tpm instance is created and managed only by KeyChain. KeyChain::getTpm() returns
+ *       a const reference to the managed Tpm instance, through which it is possible to
+ *       check the existence of private keys, get the public key corresponding to a private
+ *       key, sign, and decrypt the supplied buffers using managed private keys.
  */
 class Tpm : noncopyable
 {
@@ -269,7 +269,7 @@
 
   const unique_ptr<BackEnd> m_backEnd;
 
-  friend class v2::KeyChain;
+  friend KeyChain;
 };
 
 } // namespace tpm
diff --git a/ndn-cxx/security/validation-state.hpp b/ndn-cxx/security/validation-state.hpp
index 739468c..83d7f94 100644
--- a/ndn-cxx/security/validation-state.hpp
+++ b/ndn-cxx/security/validation-state.hpp
@@ -150,9 +150,9 @@
    * Each certificate in the chain signs the next certificate.  The last certificate signs the
    * original packet.
    */
-  std::list<v2::Certificate> m_certificateChain;
+  std::list<Certificate> m_certificateChain;
 
-  friend class Validator;
+  friend Validator;
 };
 
 /**
diff --git a/ndn-cxx/security/verification-helpers.cpp b/ndn-cxx/security/verification-helpers.cpp
index 60bc7d1..2f5927e 100644
--- a/ndn-cxx/security/verification-helpers.cpp
+++ b/ndn-cxx/security/verification-helpers.cpp
@@ -214,7 +214,7 @@
 }
 
 bool
-verifySignature(const Data& data, const optional<v2::Certificate>& cert)
+verifySignature(const Data& data, const optional<Certificate>& cert)
 {
   auto parsed = parse(data);
   if (cert) {
@@ -232,7 +232,7 @@
 }
 
 bool
-verifySignature(const Interest& interest, const optional<v2::Certificate>& cert)
+verifySignature(const Interest& interest, const optional<Certificate>& cert)
 {
   auto parsed = parse(interest);
   if (cert) {
diff --git a/ndn-cxx/security/verification-helpers.hpp b/ndn-cxx/security/verification-helpers.hpp
index 8b96221..09b7b57 100644
--- a/ndn-cxx/security/verification-helpers.hpp
+++ b/ndn-cxx/security/verification-helpers.hpp
@@ -128,7 +128,7 @@
  * If @p cert is nullopt, @p data assumed to be self-verifiable (with digest or attributes)
  */
 bool
-verifySignature(const Data& data, const optional<v2::Certificate>& cert);
+verifySignature(const Data& data, const optional<Certificate>& cert);
 
 /**
  * @brief Verify @p interest using @p cert.
@@ -138,7 +138,7 @@
  * If @p cert is nullptr, @p interest assumed to be self-verifiable (with digest or attributes)
  */
 bool
-verifySignature(const Interest& interest, const optional<v2::Certificate>& cert);
+verifySignature(const Interest& interest, const optional<Certificate>& cert);
 
 /**
  * @brief Verify @p data using @p tpm and @p keyName with the @p digestAlgorithm.
diff --git a/ndn-cxx/util/scheduler.hpp b/ndn-cxx/util/scheduler.hpp
index ea8a0b8..547345a 100644
--- a/ndn-cxx/util/scheduler.hpp
+++ b/ndn-cxx/util/scheduler.hpp
@@ -104,7 +104,7 @@
 private:
   weak_ptr<EventInfo> m_info;
 
-  friend class Scheduler;
+  friend Scheduler;
   friend std::ostream& operator<<(std::ostream& os, const EventId& eventId);
 };
 
diff --git a/ndn-cxx/util/segment-fetcher.cpp b/ndn-cxx/util/segment-fetcher.cpp
index 0da0860..f435167 100644
--- a/ndn-cxx/util/segment-fetcher.cpp
+++ b/ndn-cxx/util/segment-fetcher.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-2021 Regents of the University of California,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University.
  *
@@ -59,7 +59,7 @@
 }
 
 SegmentFetcher::SegmentFetcher(Face& face,
-                               security::v2::Validator& validator,
+                               security::Validator& validator,
                                const SegmentFetcher::Options& options)
   : m_options(options)
   , m_face(face)
@@ -76,7 +76,7 @@
 shared_ptr<SegmentFetcher>
 SegmentFetcher::start(Face& face,
                       const Interest& baseInterest,
-                      security::v2::Validator& validator,
+                      security::Validator& validator,
                       const SegmentFetcher::Options& options)
 {
   shared_ptr<SegmentFetcher> fetcher(new SegmentFetcher(face, validator, options));
@@ -324,7 +324,7 @@
 
 void
 SegmentFetcher::afterValidationFailure(const Data& data,
-                                       const security::v2::ValidationError& error,
+                                       const security::ValidationError& error,
                                        const weak_ptr<SegmentFetcher>& weakSelf)
 {
   if (shouldStop(weakSelf))
diff --git a/ndn-cxx/util/segment-fetcher.hpp b/ndn-cxx/util/segment-fetcher.hpp
index ea939be..eadb426 100644
--- a/ndn-cxx/util/segment-fetcher.hpp
+++ b/ndn-cxx/util/segment-fetcher.hpp
@@ -161,7 +161,7 @@
   static shared_ptr<SegmentFetcher>
   start(Face& face,
         const Interest& baseInterest,
-        security::v2::Validator& validator,
+        security::Validator& validator,
         const Options& options = Options());
 
   /**
@@ -175,7 +175,7 @@
 private:
   class PendingSegment;
 
-  SegmentFetcher(Face& face, security::v2::Validator& validator, const Options& options);
+  SegmentFetcher(Face& face, security::Validator& validator, const Options& options);
 
   static bool
   shouldStop(const weak_ptr<SegmentFetcher>& weakSelf);
@@ -200,7 +200,7 @@
 
   void
   afterValidationFailure(const Data& data,
-                         const security::v2::ValidationError& error,
+                         const security::ValidationError& error,
                          const weak_ptr<SegmentFetcher>& weakSelf);
 
   void
@@ -310,7 +310,7 @@
   Options m_options;
   Face& m_face;
   Scheduler m_scheduler;
-  security::v2::Validator& m_validator;
+  security::Validator& m_validator;
   RttEstimator m_rttEstimator;
 
   time::steady_clock::TimePoint m_timeLastSegmentReceived;
diff --git a/tests/unit/security/pib/certificate-container.t.cpp b/tests/unit/security/pib/certificate-container.t.cpp
index b6e9f12..ebb8ca1 100644
--- a/tests/unit/security/pib/certificate-container.t.cpp
+++ b/tests/unit/security/pib/certificate-container.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -75,8 +75,8 @@
   BOOST_CHECK_THROW(container.get(id1Key1Cert3Name), Pib::Error);
 
   // check cert
-  v2::Certificate cert1 = container.get(id1Key1Cert1.getName());
-  v2::Certificate cert2 = container.get(id1Key1Cert2.getName());
+  Certificate cert1 = container.get(id1Key1Cert1.getName());
+  Certificate cert2 = container.get(id1Key1Cert2.getName());
   BOOST_CHECK_EQUAL(cert1, id1Key1Cert1);
   BOOST_CHECK_EQUAL(cert2, id1Key1Cert2);
 
@@ -133,8 +133,8 @@
   certNames.insert(id1Key1Cert1.getName());
   certNames.insert(id1Key1Cert2.getName());
 
-  CertificateContainer::const_iterator it = container.begin();
-  std::set<Name>::const_iterator testIt = certNames.begin();
+  auto it = container.begin();
+  auto testIt = certNames.begin();
   BOOST_CHECK_EQUAL((*it).getName(), *testIt);
   it++;
   testIt++;
diff --git a/tests/unit/security/pib/key-container.t.cpp b/tests/unit/security/pib/key-container.t.cpp
index aab7b1c..1a66573 100644
--- a/tests/unit/security/pib/key-container.t.cpp
+++ b/tests/unit/security/pib/key-container.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -76,7 +76,7 @@
   // get keys
   BOOST_REQUIRE_NO_THROW(container.get(id1Key1Name));
   BOOST_REQUIRE_NO_THROW(container.get(id1Key2Name));
-  Name id1Key3Name = v2::constructKeyName(id1, name::Component("non-existing-id"));
+  Name id1Key3Name = constructKeyName(id1, name::Component("non-existing-id"));
   BOOST_CHECK_THROW(container.get(id1Key3Name), Pib::Error);
 
   // check key
diff --git a/tests/unit/security/pib/key.t.cpp b/tests/unit/security/pib/key.t.cpp
index f5c62fa..544848f 100644
--- a/tests/unit/security/pib/key.t.cpp
+++ b/tests/unit/security/pib/key.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -75,20 +75,20 @@
 
 BOOST_AUTO_TEST_CASE(Helpers)
 {
-  BOOST_CHECK_EQUAL(v2::constructKeyName("/hello", name::Component("world")), "/hello/KEY/world");
+  BOOST_CHECK_EQUAL(constructKeyName("/hello", name::Component("world")), "/hello/KEY/world");
 
-  BOOST_CHECK_EQUAL(v2::isValidKeyName("/hello"), false);
-  BOOST_CHECK_EQUAL(v2::isValidKeyName("/hello/KEY"), false);
-  BOOST_CHECK_EQUAL(v2::isValidKeyName("/hello/KEY/world"), true);
+  BOOST_CHECK_EQUAL(isValidKeyName("/hello"), false);
+  BOOST_CHECK_EQUAL(isValidKeyName("/hello/KEY"), false);
+  BOOST_CHECK_EQUAL(isValidKeyName("/hello/KEY/world"), true);
 
-  BOOST_CHECK_EQUAL(v2::isValidKeyName("/KEY/hello"), true);
-  BOOST_CHECK_EQUAL(v2::isValidKeyName("/hello/world/KEY/!"), true);
+  BOOST_CHECK_EQUAL(isValidKeyName("/KEY/hello"), true);
+  BOOST_CHECK_EQUAL(isValidKeyName("/hello/world/KEY/!"), true);
 
-  BOOST_CHECK_EQUAL(v2::extractIdentityFromKeyName("/KEY/hello"), "/");
-  BOOST_CHECK_EQUAL(v2::extractIdentityFromKeyName("/hello/KEY/world"), "/hello");
-  BOOST_CHECK_EQUAL(v2::extractIdentityFromKeyName("/hello/world/KEY/!"), "/hello/world");
+  BOOST_CHECK_EQUAL(extractIdentityFromKeyName("/KEY/hello"), "/");
+  BOOST_CHECK_EQUAL(extractIdentityFromKeyName("/hello/KEY/world"), "/hello");
+  BOOST_CHECK_EQUAL(extractIdentityFromKeyName("/hello/world/KEY/!"), "/hello/world");
 
-  BOOST_CHECK_THROW(v2::extractIdentityFromKeyName("/hello"), std::invalid_argument);
+  BOOST_CHECK_THROW(extractIdentityFromKeyName("/hello"), std::invalid_argument);
 }
 
 BOOST_AUTO_TEST_SUITE_END() // TestKey
diff --git a/tests/unit/security/tpm/back-end.t.cpp b/tests/unit/security/tpm/back-end.t.cpp
index 8abc745..1d925d4 100644
--- a/tests/unit/security/tpm/back-end.t.cpp
+++ b/tests/unit/security/tpm/back-end.t.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -65,7 +65,7 @@
 
   Name identity("/Test/KeyName");
   name::Component keyId("1");
-  Name keyName = v2::constructKeyName(identity, keyId);
+  Name keyName = constructKeyName(identity, keyId);
 
   // key should not exist
   BOOST_CHECK_EQUAL(tpm.hasKey(keyName), false);
diff --git a/tests/unit/security/validation-policy-config.t.cpp b/tests/unit/security/validation-policy-config.t.cpp
index 7b5fc56..dcd7cb8 100644
--- a/tests/unit/security/validation-policy-config.t.cpp
+++ b/tests/unit/security/validation-policy-config.t.cpp
@@ -37,7 +37,7 @@
 namespace tests {
 
 using namespace ndn::tests;
-using namespace ndn::security::v2::tests;
+using namespace ndn::security::tests;
 
 BOOST_AUTO_TEST_SUITE(Security)
 BOOST_AUTO_TEST_SUITE(TestValidationPolicyConfig)
diff --git a/tests/unit/security/validator-config/filter.t.cpp b/tests/unit/security/validator-config/filter.t.cpp
index 5b77a12..42eeceb 100644
--- a/tests/unit/security/validator-config/filter.t.cpp
+++ b/tests/unit/security/validator-config/filter.t.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-2021 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 tests {
 
 using namespace ndn::tests;
-using namespace ndn::security::v2::tests;
+using namespace ndn::security::tests;
 
 BOOST_AUTO_TEST_SUITE(Security)
 BOOST_AUTO_TEST_SUITE(ValidatorConfig)
diff --git a/tests/unit/security/validator-config/rule.t.cpp b/tests/unit/security/validator-config/rule.t.cpp
index 8b846ff..4871521 100644
--- a/tests/unit/security/validator-config/rule.t.cpp
+++ b/tests/unit/security/validator-config/rule.t.cpp
@@ -34,7 +34,7 @@
 namespace tests {
 
 using namespace ndn::tests;
-using namespace ndn::security::v2::tests;
+using namespace ndn::security::tests;
 
 BOOST_AUTO_TEST_SUITE(Security)
 BOOST_AUTO_TEST_SUITE(ValidatorConfig)
diff --git a/tests/unit/security/verification-helpers.t.cpp b/tests/unit/security/verification-helpers.t.cpp
index d930281..74ffbe0 100644
--- a/tests/unit/security/verification-helpers.t.cpp
+++ b/tests/unit/security/verification-helpers.t.cpp
@@ -546,7 +546,7 @@
 BOOST_AUTO_TEST_CASE_TEMPLATE(VerifySignature, Dataset, SignatureDatasets)
 {
   Dataset dataset;
-  v2::Certificate cert(Block(dataset.cert.data(), dataset.cert.size()));
+  Certificate cert(Block(dataset.cert.data(), dataset.cert.size()));
   Buffer keyRaw = cert.getPublicKey();
   transform::PublicKey key;
   key.loadPkcs8(keyRaw.data(), keyRaw.size());
diff --git a/tools/ndnsec/cert-dump.cpp b/tools/ndnsec/cert-dump.cpp
index d553822..5a388d7 100644
--- a/tools/ndnsec/cert-dump.cpp
+++ b/tools/ndnsec/cert-dump.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -107,7 +107,7 @@
     return 2;
   }
 
-  security::v2::Certificate certificate;
+  security::Certificate certificate;
   if (isFileName) {
     try {
       certificate = loadCertificate(name);
@@ -118,7 +118,7 @@
     }
   }
   else {
-    security::v2::KeyChain keyChain;
+    KeyChain keyChain;
     certificate = getCertificateFromPib(keyChain.getPib(), name,
                                         isIdentityName, isKeyName, nIsNameOptions == 0);
   }
diff --git a/tools/ndnsec/cert-gen.cpp b/tools/ndnsec/cert-gen.cpp
index 9aef677..9c11ca4 100644
--- a/tools/ndnsec/cert-gen.cpp
+++ b/tools/ndnsec/cert-gen.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -86,10 +86,10 @@
     return 0;
   }
 
-  security::v2::AdditionalDescription additionalDescription;
+  security::AdditionalDescription additionalDescription;
 
   for (const auto& info : infos) {
-    auto pos = info.find(" ");
+    auto pos = info.find(' ');
     if (pos == std::string::npos) {
       std::cerr << "ERROR: incorrectly formatted info block [" << info << "]" << std::endl;
       return 2;
@@ -122,9 +122,9 @@
     }
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
-  security::v2::Certificate certRequest;
+  security::Certificate certRequest;
   try {
     certRequest = loadCertificate(requestFile);
   }
@@ -143,7 +143,7 @@
     .append(issuerId)
     .appendVersion();
 
-  security::v2::Certificate cert;
+  security::Certificate cert;
   cert.setName(certName);
   cert.setContent(certRequest.getContent());
   // TODO: add ability to customize
diff --git a/tools/ndnsec/cert-install.cpp b/tools/ndnsec/cert-install.cpp
index 9ee4d87..7a6afa2 100644
--- a/tools/ndnsec/cert-install.cpp
+++ b/tools/ndnsec/cert-install.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -45,7 +45,7 @@
   }
 };
 
-security::v2::Certificate
+static security::Certificate
 getCertificateHttp(const std::string& host, const std::string& port, const std::string& path)
 {
   boost::asio::ip::tcp::iostream requestStream;
@@ -97,7 +97,7 @@
     streamSource(requestStream) >> base64Decode(true) >> streamSink(os);
   }
 
-  return security::v2::Certificate(Block(os.buf()));
+  return security::Certificate(Block(os.buf()));
 }
 
 int
@@ -158,7 +158,7 @@
     return 2;
   }
 
-  security::v2::Certificate cert;
+  security::Certificate cert;
   try {
     if (certFile.find("http://") == 0) {
       std::string host;
@@ -166,12 +166,12 @@
       std::string path;
 
       size_t pos = 7; // offset of "http://"
-      size_t posSlash = certFile.find("/", pos);
+      size_t posSlash = certFile.find('/', pos);
 
       if (posSlash == std::string::npos)
         NDN_THROW(HttpException("Request line is not correctly formatted"));
 
-      size_t posPort = certFile.find(":", pos);
+      size_t posPort = certFile.find(':', pos);
 
       if (posPort != std::string::npos && posPort < posSlash) {
         // port is specified
@@ -196,7 +196,7 @@
     return 1;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   auto id = keyChain.getPib().getIdentity(cert.getIdentity());
   auto key = id.getKey(cert.getKeyName());
diff --git a/tools/ndnsec/delete.cpp b/tools/ndnsec/delete.cpp
index 376e3e3..2159bb3 100644
--- a/tools/ndnsec/delete.cpp
+++ b/tools/ndnsec/delete.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -45,7 +45,7 @@
     ("name,n",        po::value<std::string>(&name),
                       "name of the item to delete. By default, it refers to an identity. "
                       "If -k is specified, it refers to a key. "
-                      "If -c is specified, it refers to a certificate.");
+                      "If -c is specified, it refers to a certificate.")
     ;
 
   po::positional_options_description p;
@@ -77,20 +77,20 @@
     return 2;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   try {
     if (wantDeleteCert) {
       security::Key key = keyChain.getPib()
-        .getIdentity(security::v2::extractIdentityFromCertName(name))
-        .getKey(security::v2::extractKeyNameFromCertName(name));
+        .getIdentity(security::extractIdentityFromCertName(name))
+        .getKey(security::extractKeyNameFromCertName(name));
 
       keyChain.deleteCertificate(key, key.getCertificate(name).getName());
       std::cerr << "OK: certificate deleted: " << name << std::endl;
     }
     else if (wantDeleteKey) {
       security::Identity identity = keyChain.getPib()
-        .getIdentity(security::v2::extractIdentityFromKeyName(name));
+        .getIdentity(security::extractIdentityFromKeyName(name));
 
       keyChain.deleteKey(identity, identity.getKey(name));
       std::cerr << "OK: key deleted: " << name << std::endl;
diff --git a/tools/ndnsec/export.cpp b/tools/ndnsec/export.cpp
index 2b6d528..f0a9395 100644
--- a/tools/ndnsec/export.cpp
+++ b/tools/ndnsec/export.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -105,7 +105,8 @@
     isIdentityName = true;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
+
   auto cert = getCertificateFromPib(keyChain.getPib(), name,
                                     isIdentityName, isKeyName, isCertName);
 
diff --git a/tools/ndnsec/get-default.cpp b/tools/ndnsec/get-default.cpp
index d59cfba..37f7425 100644
--- a/tools/ndnsec/get-default.cpp
+++ b/tools/ndnsec/get-default.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -75,12 +75,12 @@
     return 2;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   if (vm.count("key") > 0) {
     if (wantDefaultCert) {
       auto cert = keyChain.getPib()
-                  .getIdentity(security::v2::extractIdentityFromKeyName(keyName))
+                  .getIdentity(security::extractIdentityFromKeyName(keyName))
                   .getKey(keyName)
                   .getDefaultCertificate();
       std::cout << cert.getName();
diff --git a/tools/ndnsec/import.cpp b/tools/ndnsec/import.cpp
index 9dab73f..7e27bee 100644
--- a/tools/ndnsec/import.cpp
+++ b/tools/ndnsec/import.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -72,7 +72,7 @@
     return 0;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   shared_ptr<security::SafeBag> safeBag;
   if (input == "-")
diff --git a/tools/ndnsec/key-gen.cpp b/tools/ndnsec/key-gen.cpp
index 553f06c..2090f74 100644
--- a/tools/ndnsec/key-gen.cpp
+++ b/tools/ndnsec/key-gen.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -136,7 +136,7 @@
     return 2;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   security::Identity identity;
   security::Key key;
diff --git a/tools/ndnsec/list.cpp b/tools/ndnsec/list.cpp
index fbe1140..457fc2e 100644
--- a/tools/ndnsec/list.cpp
+++ b/tools/ndnsec/list.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -75,7 +75,7 @@
     std::cout << key.getName() << std::endl;
 
     if (m_verboseLevel >= 2) {
-      security::v2::Certificate defaultCert;
+      security::Certificate defaultCert;
       try {
         defaultCert = key.getDefaultCertificate();
       }
@@ -90,7 +90,7 @@
   }
 
   void
-  printCertificate(const security::v2::Certificate& cert, bool isDefault) const
+  printCertificate(const security::Certificate& cert, bool isDefault) const
   {
     if (isDefault)
       std::cout << "       +->* ";
@@ -152,7 +152,7 @@
 
   verboseLevel = std::max(verboseLevel, wantCert ? 2 : wantKey ? 1 : 0);
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   // TODO: add API to check for default identity (may be from the identity itself)
   security::Identity defaultIdentity;
diff --git a/tools/ndnsec/set-default.cpp b/tools/ndnsec/set-default.cpp
index d1647ed..128ae19 100644
--- a/tools/ndnsec/set-default.cpp
+++ b/tools/ndnsec/set-default.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -74,16 +74,16 @@
     return 2;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   if (wantSetDefaultKey) {
-    auto identity = keyChain.getPib().getIdentity(security::v2::extractIdentityFromKeyName(name));
+    auto identity = keyChain.getPib().getIdentity(security::extractIdentityFromKeyName(name));
     auto key = identity.getKey(name);
     keyChain.setDefaultKey(identity, key);
   }
   else if (wantSetDefaultCert) {
-    auto identity = keyChain.getPib().getIdentity(security::v2::extractIdentityFromCertName(name));
-    auto key = identity.getKey(security::v2::extractKeyNameFromCertName(name));
+    auto identity = keyChain.getPib().getIdentity(security::extractIdentityFromCertName(name));
+    auto key = identity.getKey(security::extractKeyNameFromCertName(name));
     auto cert = key.getCertificate(name);
     keyChain.setDefaultCertificate(key, cert);
   }
diff --git a/tools/ndnsec/sign-req.cpp b/tools/ndnsec/sign-req.cpp
index f9f97e9..3548228 100644
--- a/tools/ndnsec/sign-req.cpp
+++ b/tools/ndnsec/sign-req.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -69,7 +69,7 @@
     return 2;
   }
 
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   security::Identity identity;
   security::Key key;
@@ -78,12 +78,12 @@
     key = identity.getDefaultKey();
   }
   else {
-    identity = keyChain.getPib().getIdentity(security::v2::extractIdentityFromKeyName(name));
+    identity = keyChain.getPib().getIdentity(security::extractIdentityFromKeyName(name));
     key = identity.getKey(name);
   }
 
   // Create signing request (similar to self-signed certificate)
-  security::v2::Certificate certificate;
+  security::Certificate certificate;
 
   // set name
   Name certificateName = key.getName();
diff --git a/tools/ndnsec/unlock-tpm.cpp b/tools/ndnsec/unlock-tpm.cpp
index d79db7f..bcf7ca0 100644
--- a/tools/ndnsec/unlock-tpm.cpp
+++ b/tools/ndnsec/unlock-tpm.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -61,7 +61,7 @@
   }
 
 #ifdef NDN_CXX_HAVE_GETPASS
-  security::v2::KeyChain keyChain;
+  KeyChain keyChain;
 
   char* password = ::getpass("Password to unlock the TPM: ");
   if (password == nullptr) {
diff --git a/tools/ndnsec/util.cpp b/tools/ndnsec/util.cpp
index c07b509..0ff7e74 100644
--- a/tools/ndnsec/util.cpp
+++ b/tools/ndnsec/util.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-2021 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -68,7 +68,7 @@
 #endif // NDN_CXX_HAVE_GETPASS
 }
 
-security::v2::Certificate
+security::Certificate
 getCertificateFromPib(const security::pib::Pib& pib, const Name& name,
                       bool isIdentityName, bool isKeyName, bool isCertName)
 {
@@ -78,26 +78,26 @@
            .getDefaultCertificate();
   }
   else if (isKeyName) {
-    return pib.getIdentity(security::v2::extractIdentityFromKeyName(name))
+    return pib.getIdentity(security::extractIdentityFromKeyName(name))
            .getKey(name)
            .getDefaultCertificate();
   }
   else if (isCertName) {
-    return pib.getIdentity(security::v2::extractIdentityFromCertName(name))
-           .getKey(security::v2::extractKeyNameFromCertName(name))
+    return pib.getIdentity(security::extractIdentityFromCertName(name))
+           .getKey(security::extractKeyNameFromCertName(name))
            .getCertificate(name);
   }
   NDN_CXX_UNREACHABLE;
 }
 
-security::v2::Certificate
+security::Certificate
 loadCertificate(const std::string& fileName)
 {
-  shared_ptr<security::v2::Certificate> cert;
+  shared_ptr<security::Certificate> cert;
   if (fileName == "-")
-    cert = io::load<security::v2::Certificate>(std::cin);
+    cert = io::load<security::Certificate>(std::cin);
   else
-    cert = io::load<security::v2::Certificate>(fileName);
+    cert = io::load<security::Certificate>(fileName);
 
   if (cert == nullptr) {
     NDN_THROW(CannotLoadCertificate(fileName));
diff --git a/tools/ndnsec/util.hpp b/tools/ndnsec/util.hpp
index 8aed837..4ce3c04 100644
--- a/tools/ndnsec/util.hpp
+++ b/tools/ndnsec/util.hpp
@@ -45,7 +45,7 @@
  * @throw std::invalid_argument name is invalid.
  * @throw Pib::Error certificate does not exist.
  */
-security::v2::Certificate
+security::Certificate
 getCertificateFromPib(const security::pib::Pib& pib, const Name& name,
                       bool isIdentityName, bool isKeyName, bool isCertName);
 
@@ -58,7 +58,7 @@
   }
 };
 
-security::v2::Certificate
+security::Certificate
 loadCertificate(const std::string& fileName);
 
 bool
