diff --git a/src/encoding/oid.hpp b/src/encoding/oid.hpp
index 2f89484..2eea310 100644
--- a/src/encoding/oid.hpp
+++ b/src/encoding/oid.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -82,7 +82,6 @@
   void
   decode(CryptoPP::BufferedTransformation& in);
 
-
 private:
   bool
   equal(const Oid& oid) const;
@@ -91,11 +90,6 @@
   std::vector<int> m_oid;
 };
 
-/**
- * @deprecated Use Oid type instead
- */
-typedef Oid OID;
-
 namespace oid {
 // crypto algorithm
 extern const Oid RSA;
diff --git a/src/face.cpp b/src/face.cpp
index 9f78680..c77d3e0 100644
--- a/src/face.cpp
+++ b/src/face.cpp
@@ -183,35 +183,6 @@
   return reinterpret_cast<const PendingInterestId*>(interestToExpress.get());
 }
 
-const PendingInterestId*
-Face::expressInterest(const Interest& interest,
-                      const OnData& onData,
-                      const OnTimeout& onTimeout)
-{
-  return this->expressInterest(
-    interest,
-    [onData] (const Interest& interest, const Data& data) {
-      if (onData != nullptr) {
-        onData(interest, const_cast<Data&>(data));
-      }
-    },
-    [onTimeout] (const Interest& interest, const lp::Nack& nack) {
-      if (onTimeout != nullptr) {
-        onTimeout(interest);
-      }
-    },
-    onTimeout
-  );
-}
-
-const PendingInterestId*
-Face::expressInterest(const Name& name, const Interest& tmpl,
-                      const OnData& onData, const OnTimeout& onTimeout)
-{
-  return expressInterest(Interest(tmpl).setName(name).setNonce(0),
-                         onData, onTimeout);
-}
-
 void
 Face::removePendingInterest(const PendingInterestId* pendingInterestId)
 {
@@ -330,64 +301,6 @@
   return reinterpret_cast<const InterestFilterId*>(filter.get());
 }
 
-#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
-const RegisteredPrefixId*
-Face::setInterestFilter(const InterestFilter& interestFilter,
-                        const OnInterest& onInterest,
-                        const RegisterPrefixSuccessCallback& onSuccess,
-                        const RegisterPrefixFailureCallback& onFailure,
-                        const security::v1::IdentityCertificate& certificate,
-                        uint64_t flags)
-{
-  security::SigningInfo signingInfo;
-  if (!certificate.getName().empty()) {
-    signingInfo = signingByCertificate(certificate.getName());
-  }
-  return setInterestFilter(interestFilter, onInterest, onSuccess, onFailure, signingInfo, flags);
-}
-
-const RegisteredPrefixId*
-Face::setInterestFilter(const InterestFilter& interestFilter,
-                        const OnInterest& onInterest,
-                        const RegisterPrefixFailureCallback& onFailure,
-                        const security::v1::IdentityCertificate& certificate,
-                        uint64_t flags)
-{
-  security::SigningInfo signingInfo;
-  if (!certificate.getName().empty()) {
-    signingInfo = signingByCertificate(certificate.getName());
-  }
-  return setInterestFilter(interestFilter, onInterest, onFailure, signingInfo, flags);
-}
-
-const RegisteredPrefixId*
-Face::setInterestFilter(const InterestFilter& interestFilter,
-                        const OnInterest& onInterest,
-                        const RegisterPrefixSuccessCallback& onSuccess,
-                        const RegisterPrefixFailureCallback& onFailure,
-                        const Name& identity,
-                        uint64_t flags)
-{
-  security::SigningInfo signingInfo = signingByIdentity(identity);
-  return setInterestFilter(interestFilter, onInterest,
-                           onSuccess, onFailure,
-                           signingInfo, flags);
-}
-
-const RegisteredPrefixId*
-Face::setInterestFilter(const InterestFilter& interestFilter,
-                        const OnInterest& onInterest,
-                        const RegisterPrefixFailureCallback& onFailure,
-                        const Name& identity,
-                        uint64_t flags)
-{
-  security::SigningInfo signingInfo = signingByIdentity(identity);
-  return setInterestFilter(interestFilter, onInterest, onFailure, signingInfo, flags);
-}
-
-#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
 const RegisteredPrefixId*
 Face::registerPrefix(const Name& prefix,
                      const RegisterPrefixSuccessCallback& onSuccess,
@@ -401,33 +314,6 @@
   return m_impl->registerPrefix(prefix, nullptr, onSuccess, onFailure, flags, options);
 }
 
-#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-const RegisteredPrefixId*
-Face::registerPrefix(const Name& prefix,
-                     const RegisterPrefixSuccessCallback& onSuccess,
-                     const RegisterPrefixFailureCallback& onFailure,
-                     const security::v1::IdentityCertificate& certificate,
-                     uint64_t flags)
-{
-  security::SigningInfo signingInfo;
-  if (!certificate.getName().empty()) {
-    signingInfo = signingByCertificate(certificate.getName());
-  }
-  return registerPrefix(prefix, onSuccess, onFailure, signingInfo, flags);
-}
-
-const RegisteredPrefixId*
-Face::registerPrefix(const Name& prefix,
-                     const RegisterPrefixSuccessCallback& onSuccess,
-                     const RegisterPrefixFailureCallback& onFailure,
-                     const Name& identity,
-                     uint64_t flags)
-{
-  security::SigningInfo signingInfo = signingByIdentity(identity);
-  return registerPrefix(prefix, onSuccess, onFailure, signingInfo, flags);
-}
-#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
 void
 Face::unsetInterestFilter(const RegisteredPrefixId* registeredPrefixId)
 {
diff --git a/src/face.hpp b/src/face.hpp
index a6cd4da..4e722c6 100644
--- a/src/face.hpp
+++ b/src/face.hpp
@@ -33,12 +33,6 @@
 #include "security/signing-info.hpp"
 #include "security/key-chain.hpp"
 
-#define NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
-#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-#include "security/v1/identity-certificate.hpp"
-#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
 namespace boost {
 namespace asio {
 class io_service;
@@ -73,29 +67,11 @@
 typedef function<void(const Interest&)> TimeoutCallback;
 
 /**
- * @brief Callback invoked when expressed Interest gets satisfied with Data packet
- * @deprecated use DataCallback
- */
-typedef function<void(const Interest&, Data&)> OnData;
-
-/**
- * @brief Callback invoked when expressed Interest times out
- * @deprecated use TimeoutCallback
- */
-typedef function<void(const Interest&)> OnTimeout;
-
-/**
  * @brief Callback invoked when incoming Interest matches the specified InterestFilter
  */
 typedef function<void(const InterestFilter&, const Interest&)> InterestCallback;
 
 /**
- * @brief Callback invoked when incoming Interest matches the specified InterestFilter
- * @deprecated use InterestCallback
- */
-typedef function<void (const InterestFilter&, const Interest&)> OnInterest;
-
-/**
  * @brief Callback invoked when registerPrefix or setInterestFilter command succeeds
  */
 typedef function<void(const Name&)> RegisterPrefixSuccessCallback;
@@ -251,44 +227,6 @@
                   const TimeoutCallback& afterTimeout);
 
   /**
-   * @brief Express Interest
-   *
-   * @param interest  An Interest to be expressed
-   * @param onData    Callback to be called when a matching data packet is received
-   * @param onTimeout (optional) A function object to call if the interest times out or is Nacked
-   *
-   * @return The pending interest ID which can be used with removePendingInterest
-   *
-   * @throw Error when Interest size exceeds maximum limit (MAX_NDN_PACKET_SIZE)
-   *
-   * @deprecated use expressInterest(Interest, DataCallback, NackCallback, TimeoutCallback)
-   */
-  const PendingInterestId*
-  expressInterest(const Interest& interest,
-                  const OnData& onData,
-                  const OnTimeout& onTimeout = nullptr);
-
-  /**
-   * @brief Express Interest using name and Interest template
-   *
-   * @param name      Name of the Interest
-   * @param tmpl      Interest template to fill parameters
-   * @param onData    Callback to be called when a matching data packet is received
-   * @param onTimeout (optional) A function object to call if the interest times out or is Nacked
-   *
-   * @return Opaque pending interest ID which can be used with removePendingInterest
-   *
-   * @throw Error when Interest size exceeds maximum limit (MAX_NDN_PACKET_SIZE)
-   *
-   * @deprecated use expressInterest(Interest, DataCallback, NackCallback, TimeoutCallback)
-   */
-  const PendingInterestId*
-  expressInterest(const Name& name,
-                  const Interest& tmpl,
-                  const OnData& onData,
-                  const OnTimeout& onTimeout = nullptr);
-
-  /**
    * @brief Cancel previously expressed Interest
    *
    * @param pendingInterestId The ID returned from expressInterest.
@@ -381,128 +319,6 @@
   setInterestFilter(const InterestFilter& interestFilter,
                     const InterestCallback& onInterest);
 
-#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
-   *
-   * This version of setInterestFilter combines setInterestFilter and registerPrefix
-   * operations and is intended to be used when only one filter for the same prefix needed
-   * to be set.  When multiple names sharing the same prefix should be dispatched to
-   * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
-   * a series of setInterestFilter calls.
-   *
-   * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
-   * @param onInterest     A callback to be called when a matching interest is received
-   * @param onSuccess      A callback to be called when prefixRegister command succeeds
-   * @param onFailure      A callback to be called when prefixRegister command fails
-   * @param flags          (optional) RIB flags
-   * @param certificate    (optional) A certificate under which the prefix registration
-   *                       command is signed.  When omitted, a default certificate of
-   *                       the default identity is used to sign the registration command
-   *
-   * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
-   *         removeRegisteredPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  setInterestFilter(const InterestFilter& interestFilter,
-                    const OnInterest& onInterest,
-                    const RegisterPrefixSuccessCallback& onSuccess,
-                    const RegisterPrefixFailureCallback& onFailure,
-                    const security::v1::IdentityCertificate& certificate,
-                    uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
-   *
-   * This version of setInterestFilter combines setInterestFilter and registerPrefix
-   * operations and is intended to be used when only one filter for the same prefix needed
-   * to be set.  When multiple names sharing the same prefix should be dispatched to
-   * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
-   * a series of setInterestFilter calls.
-   *
-   * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
-   * @param onInterest     A callback to be called when a matching interest is received
-   * @param onFailure      A callback to be called when prefixRegister command fails
-   * @param flags          (optional) RIB flags
-   * @param certificate    (optional) A certificate under which the prefix registration
-   *                       command is signed.  When omitted, a default certificate of
-   *                       the default identity is used to sign the registration command
-   *
-   * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
-   *         removeRegisteredPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  setInterestFilter(const InterestFilter& interestFilter,
-                    const OnInterest& onInterest,
-                    const RegisterPrefixFailureCallback& onFailure,
-                    const security::v1::IdentityCertificate& certificate,
-                    uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
-   *
-   * This version of setInterestFilter combines setInterestFilter and registerPrefix
-   * operations and is intended to be used when only one filter for the same prefix needed
-   * to be set.  When multiple names sharing the same prefix should be dispatched to
-   * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
-   * a series of setInterestFilter calls.
-   *
-   * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
-   * @param onInterest     A callback to be called when a matching interest is received
-   * @param onSuccess      A callback to be called when prefixRegister command succeeds
-   * @param onFailure      A callback to be called when prefixRegister command fails
-   * @param identity       A signing identity. A prefix registration command is signed
-   *                       under the default certificate of this identity
-   * @param flags          (optional) RIB flags
-   *
-   * @return Opaque registered prefix ID which can be used with removeRegisteredPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  setInterestFilter(const InterestFilter& interestFilter,
-                    const OnInterest& onInterest,
-                    const RegisterPrefixSuccessCallback& onSuccess,
-                    const RegisterPrefixFailureCallback& onFailure,
-                    const Name& identity,
-                    uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
-   * callback and register the filtered prefix with the connected NDN forwarder
-   *
-   * This version of setInterestFilter combines setInterestFilter and registerPrefix
-   * operations and is intended to be used when only one filter for the same prefix needed
-   * to be set.  When multiple names sharing the same prefix should be dispatched to
-   * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
-   * a series of setInterestFilter calls.
-   *
-   * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
-   * @param onInterest     A callback to be called when a matching interest is received
-   * @param onFailure      A callback to be called when prefixRegister command fails
-   * @param identity       A signing identity. A prefix registration command is signed
-   *                       under the default certificate of this identity
-   * @param flags          (optional) RIB flags
-   *
-   * @return Opaque registered prefix ID which can be used with removeRegisteredPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  setInterestFilter(const InterestFilter& interestFilter,
-                    const OnInterest& onInterest,
-                    const RegisterPrefixFailureCallback& onFailure,
-                    const Name& identity,
-                    uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
   /**
    * @brief Register prefix with the connected NDN forwarder
    *
@@ -527,60 +343,6 @@
                  const security::SigningInfo& signingInfo = security::SigningInfo(),
                  uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
 
-#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Register prefix with the connected NDN forwarder
-   *
-   * This method only modifies forwarder's RIB and does not associate any
-   * onInterest callbacks.  Use setInterestFilter method to dispatch incoming Interests to
-   * the right callbacks.
-   *
-   * @param prefix      A prefix to register with the connected NDN forwarder
-   * @param onSuccess   A callback to be called when prefixRegister command succeeds
-   * @param onFailure   A callback to be called when prefixRegister command fails
-   * @param certificate (optional) A certificate under which the prefix registration
-   *                    command is signed.  When omitted, a default certificate of
-   *                    the default identity is used to sign the registration command
-   * @param flags       (optional) RIB flags
-   *
-   * @return The registered prefix ID which can be used with unregisterPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  registerPrefix(const Name& prefix,
-                 const RegisterPrefixSuccessCallback& onSuccess,
-                 const RegisterPrefixFailureCallback& onFailure,
-                 const security::v1::IdentityCertificate& certificate,
-                 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-
-  /**
-   * @deprecated Use override with SigningInfo instead of this function
-   * @brief Register prefix with the connected NDN forwarder and call onInterest when a matching
-   *        interest is received.
-   *
-   * This method only modifies forwarder's RIB and does not associate any
-   * onInterest callbacks.  Use setInterestFilter method to dispatch incoming Interests to
-   * the right callbacks.
-   *
-   * @param prefix    A prefix to register with the connected NDN forwarder
-   * @param onSuccess A callback to be called when prefixRegister command succeeds
-   * @param onFailure A callback to be called when prefixRegister command fails
-   * @param identity  A signing identity. A prefix registration command is signed
-   *                  under the default certificate of this identity
-   * @param flags     (optional) RIB flags
-   *
-   * @return The registered prefix ID which can be used with unregisterPrefix
-   */
-  DEPRECATED(
-  const RegisteredPrefixId*
-  registerPrefix(const Name& prefix,
-                 const RegisterPrefixSuccessCallback& onSuccess,
-                 const RegisterPrefixFailureCallback& onFailure,
-                 const Name& identity,
-                 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
-#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
-
   /**
    * @brief Remove the registered prefix entry with the registeredPrefixId
    *
diff --git a/src/management/nfd-channel-status.hpp b/src/management/nfd-channel-status.hpp
deleted file mode 100644
index 524d9f9..0000000
--- a/src/management/nfd-channel-status.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/channel-status.hpp
- */
-#include "../mgmt/nfd/channel-status.hpp"
diff --git a/src/management/nfd-command-options.hpp b/src/management/nfd-command-options.hpp
deleted file mode 100644
index 7cf8c77..0000000
--- a/src/management/nfd-command-options.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/command-options.hpp
- */
-#include "../mgmt/nfd/command-options.hpp"
diff --git a/src/management/nfd-control-command.hpp b/src/management/nfd-control-command.hpp
deleted file mode 100644
index 393e174..0000000
--- a/src/management/nfd-control-command.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/control-command.hpp
- */
-#include "../mgmt/nfd/control-command.hpp"
diff --git a/src/management/nfd-control-parameters.hpp b/src/management/nfd-control-parameters.hpp
deleted file mode 100644
index a22bc6f..0000000
--- a/src/management/nfd-control-parameters.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/control-parameters.hpp
- */
-#include "../mgmt/nfd/control-parameters.hpp"
diff --git a/src/management/nfd-control-response.hpp b/src/management/nfd-control-response.hpp
deleted file mode 100644
index 74e38f3..0000000
--- a/src/management/nfd-control-response.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/control-response.hpp
- */
-#include "../mgmt/nfd/control-response.hpp"
diff --git a/src/management/nfd-controller.hpp b/src/management/nfd-controller.hpp
deleted file mode 100644
index b127d57..0000000
--- a/src/management/nfd-controller.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/controller.hpp
- */
-#include "../mgmt/nfd/controller.hpp"
diff --git a/src/management/nfd-face-event-notification.hpp b/src/management/nfd-face-event-notification.hpp
deleted file mode 100644
index 3749390..0000000
--- a/src/management/nfd-face-event-notification.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/face-event-notification.hpp
- */
-#include "../mgmt/nfd/face-event-notification.hpp"
diff --git a/src/management/nfd-face-monitor.hpp b/src/management/nfd-face-monitor.hpp
deleted file mode 100644
index f6bc943..0000000
--- a/src/management/nfd-face-monitor.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/face-monitor.hpp
- */
-#include "../mgmt/nfd/face-monitor.hpp"
diff --git a/src/management/nfd-face-query-filter.hpp b/src/management/nfd-face-query-filter.hpp
deleted file mode 100644
index 345af3e..0000000
--- a/src/management/nfd-face-query-filter.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/face-query-filter.hpp
- */
-#include "../mgmt/nfd/face-query-filter.hpp"
diff --git a/src/management/nfd-face-status.hpp b/src/management/nfd-face-status.hpp
deleted file mode 100644
index 13e4919..0000000
--- a/src/management/nfd-face-status.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/face-status.hpp
- */
-#include "../mgmt/nfd/face-status.hpp"
diff --git a/src/management/nfd-face-traits.hpp b/src/management/nfd-face-traits.hpp
deleted file mode 100644
index 914c4d5..0000000
--- a/src/management/nfd-face-traits.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/face-traits.hpp
- */
-#include "../mgmt/nfd/face-traits.hpp"
diff --git a/src/management/nfd-fib-entry.hpp b/src/management/nfd-fib-entry.hpp
deleted file mode 100644
index 5f3a4c3..0000000
--- a/src/management/nfd-fib-entry.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/fib-entry.hpp
- */
-#include "../mgmt/nfd/fib-entry.hpp"
diff --git a/src/management/nfd-forwarder-status.hpp b/src/management/nfd-forwarder-status.hpp
deleted file mode 100644
index ca9a944..0000000
--- a/src/management/nfd-forwarder-status.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/forwarder-status.hpp
- */
-#include "../mgmt/nfd/forwarder-status.hpp"
diff --git a/src/management/nfd-rib-entry.hpp b/src/management/nfd-rib-entry.hpp
deleted file mode 100644
index 2673e6c..0000000
--- a/src/management/nfd-rib-entry.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/rib-entry.hpp
- */
-#include "../mgmt/nfd/rib-entry.hpp"
diff --git a/src/management/nfd-status-dataset.hpp b/src/management/nfd-status-dataset.hpp
deleted file mode 100644
index 0f2d72a..0000000
--- a/src/management/nfd-status-dataset.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/status-dataset.hpp
- */
-#include "../mgmt/nfd/status-dataset.hpp"
diff --git a/src/management/nfd-strategy-choice.hpp b/src/management/nfd-strategy-choice.hpp
deleted file mode 100644
index 1b31c0d..0000000
--- a/src/management/nfd-strategy-choice.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/** \file
- *  \deprecated Use mgmt/nfd/strategy-choice.hpp
- */
-#include "../mgmt/nfd/strategy-choice.hpp"
diff --git a/src/mgmt/nfd/command-options.cpp b/src/mgmt/nfd/command-options.cpp
index 557cce3..1a2bf7c 100644
--- a/src/mgmt/nfd/command-options.cpp
+++ b/src/mgmt/nfd/command-options.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -21,11 +21,6 @@
 
 #include "command-options.hpp"
 
-#ifdef NDN_MANAGEMENT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-#include "../../security/v1/identity-certificate.hpp"
-#include "../../security/signing-helpers.hpp"
-#endif // NDN_MANAGEMENT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-
 namespace ndn {
 namespace nfd {
 
@@ -63,79 +58,5 @@
   return *this;
 }
 
-#ifdef NDN_MANAGEMENT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-
-CommandOptions::SigningParamsKind
-CommandOptions::getSigningParamsKind() const
-{
-  switch (m_signingInfo.getSignerType()) {
-  case security::SigningInfo::SIGNER_TYPE_NULL:
-    return SIGNING_PARAMS_DEFAULT;
-  case security::SigningInfo::SIGNER_TYPE_ID:
-    return SIGNING_PARAMS_IDENTITY;
-  case security::SigningInfo::SIGNER_TYPE_CERT:
-    return SIGNING_PARAMS_CERTIFICATE;
-  default:
-    BOOST_THROW_EXCEPTION(std::out_of_range("SigningInfo::SignerType is not convertible to "
-                                            "CommandOptions::SigningParamsKind"));
-  }
-}
-
-const Name&
-CommandOptions::getSigningIdentity() const
-{
-  BOOST_ASSERT(m_signingInfo.getSignerType() == security::SigningInfo::SIGNER_TYPE_ID);
-  return m_signingInfo.getSignerName();
-}
-
-const Name&
-CommandOptions::getSigningCertificate() const
-{
-  BOOST_ASSERT(m_signingInfo.getSignerType() == security::SigningInfo::SIGNER_TYPE_CERT);
-  return m_signingInfo.getSignerName();
-}
-
-CommandOptions&
-CommandOptions::setSigningDefault()
-{
-  m_signingInfo = security::SigningInfo();
-  return *this;
-}
-
-CommandOptions&
-CommandOptions::setSigningIdentity(const Name& identityName)
-{
-  m_signingInfo = security::signingByIdentity(identityName);
-  return *this;
-}
-
-static security::SigningInfo
-makeSigningInfoFromIdentityCertificate(const Name& certificateName)
-{
-  // A valid IdentityCertificate has at least 4 name components,
-  // as it follows `<...>/KEY/<...>/<key-id>/ID-CERT/<version>` naming model.
-  if (certificateName.size() < 4) {
-    BOOST_THROW_EXCEPTION(std::invalid_argument("Certificate is invalid"));
-  }
-
-  return security::signingByCertificate(certificateName);
-}
-
-CommandOptions&
-CommandOptions::setSigningCertificate(const Name& certificateName)
-{
-  m_signingInfo = makeSigningInfoFromIdentityCertificate(certificateName);
-  return *this;
-}
-
-CommandOptions&
-CommandOptions::setSigningCertificate(const security::v1::IdentityCertificate& certificate)
-{
-  m_signingInfo = makeSigningInfoFromIdentityCertificate(certificate.getName());
-  return *this;
-}
-
-#endif // NDN_MANAGEMENT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-
 } // namespace nfd
 } // namespace ndn
diff --git a/src/mgmt/nfd/command-options.hpp b/src/mgmt/nfd/command-options.hpp
index efde928..a387eb7 100644
--- a/src/mgmt/nfd/command-options.hpp
+++ b/src/mgmt/nfd/command-options.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -24,8 +24,6 @@
 
 #include "../../security/signing-info.hpp"
 
-#define NDN_MGMT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-
 namespace ndn {
 
 namespace security {
@@ -94,87 +92,6 @@
   CommandOptions&
   setSigningInfo(const security::SigningInfo& signingInfo);
 
-#ifdef NDN_MGMT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-public: // signing parameters
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \brief indicates the selection of signing parameters
-   */
-  enum SigningParamsKind {
-    /** \brief picks the default signing identity and certificate
-     */
-    SIGNING_PARAMS_DEFAULT,
-    /** \brief picks the default certificate of a specific identity Name
-     */
-    SIGNING_PARAMS_IDENTITY,
-    /** \brief picks a specific identity certificate
-     */
-    SIGNING_PARAMS_CERTIFICATE
-  };
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \return selection of signing parameters
-   */
-  DEPRECATED(
-  SigningParamsKind
-  getSigningParamsKind() const);
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \return identity Name
-   *  \pre getSigningParamsKind() == SIGNING_PARAMS_IDENTITY
-   */
-  DEPRECATED(
-  const Name&
-  getSigningIdentity() const);
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \return certificate Name
-   *  \pre getSigningParamsKind() == SIGNING_PARAMS_CERTIFICATE
-   */
-  DEPRECATED(
-  const Name&
-  getSigningCertificate() const);
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \brief chooses to use default identity and certificate
-   *  \post getSigningParamsKind() == SIGNING_PARAMS_DEFAULT
-   *  \return self
-   */
-  DEPRECATED(
-  CommandOptions&
-  setSigningDefault());
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \brief chooses to use a specific identity and its default certificate
-   *  \post getSigningParamsKind() == SIGNING_PARAMS_IDENTITY
-   *  \post getIdentityName() == identityName
-   *  \return self
-   */
-  DEPRECATED(
-  CommandOptions&
-  setSigningIdentity(const Name& identityName));
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \brief chooses to use a specific identity certificate
-   *  \param certificateName identity certificate Name
-   *  \throw std::invalid_argument if certificateName is invalid
-   *  \post getSigningParamsKind() == SIGNING_PARAMS_CERTIFICATE
-   *  \post getSigningCertificate() == certificateName
-   *  \return self
-   */
-  DEPRECATED(
-  CommandOptions&
-  setSigningCertificate(const Name& certificateName));
-
-  /** \deprecated use getSigningInfo and setSigningInfo
-   *  \brief chooses to use a specific identity certificate
-   *  \details This is equivalent to .setIdentityCertificate(certificate.getName())
-   */
-  DEPRECATED(
-  CommandOptions&
-  setSigningCertificate(const security::v1::IdentityCertificate& certificate));
-
-#endif // NDN_MGMT_NFD_COMMAND_OPTIONS_KEEP_DEPRECATED_SIGNING_PARAMS
-
 public:
   /** \brief gives the default command timeout: 10000ms
    */
diff --git a/src/mgmt/nfd/control-command.cpp b/src/mgmt/nfd/control-command.cpp
index 00bdfa5..5ecf975 100644
--- a/src/mgmt/nfd/control-command.cpp
+++ b/src/mgmt/nfd/control-command.cpp
@@ -20,7 +20,6 @@
  */
 
 #include "control-command.hpp"
-#include "command-options.hpp" // only used in deprecated functions
 
 namespace ndn {
 namespace nfd {
@@ -202,44 +201,6 @@
   this->validateRequest(parameters);
 }
 
-FaceLocalControlCommand::FaceLocalControlCommand(const std::string& verb)
-  : ControlCommand("faces", verb)
-{
-  m_requestValidator
-    .required(CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE);
-  m_responseValidator = m_requestValidator;
-}
-
-void
-FaceLocalControlCommand::validateRequest(const ControlParameters& parameters) const
-{
-  this->ControlCommand::validateRequest(parameters);
-
-  switch (parameters.getLocalControlFeature()) {
-    case LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID:
-    case LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID:
-      break;
-    default:
-      BOOST_THROW_EXCEPTION(ArgumentError("LocalControlFeature is invalid"));
-  }
-}
-
-void
-FaceLocalControlCommand::validateResponse(const ControlParameters& parameters) const
-{
-  this->validateRequest(parameters);
-}
-
-FaceEnableLocalControlCommand::FaceEnableLocalControlCommand()
-  : FaceLocalControlCommand("enable-local-control")
-{
-}
-
-FaceDisableLocalControlCommand::FaceDisableLocalControlCommand()
-  : FaceLocalControlCommand("disable-local-control")
-{
-}
-
 FibAddNextHopCommand::FibAddNextHopCommand()
   : ControlCommand("fib", "add-nexthop")
 {
diff --git a/src/mgmt/nfd/control-command.hpp b/src/mgmt/nfd/control-command.hpp
index 1db9f13..97b0fa8 100644
--- a/src/mgmt/nfd/control-command.hpp
+++ b/src/mgmt/nfd/control-command.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 /**
  * \ingroup management
  * \brief base class of NFD ControlCommand
- * \sa http://redmine.named-data.net/projects/nfd/wiki/ControlCommand
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/ControlCommand
  */
 class ControlCommand : noncopyable
 {
@@ -137,7 +137,7 @@
 /**
  * \ingroup management
  * \brief represents a faces/create command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Create-a-face
  */
 class FaceCreateCommand : public ControlCommand
 {
@@ -158,7 +158,7 @@
 /**
  * \ingroup management
  * \brief represents a faces/update command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-a-face
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Update-a-face
  */
 class FaceUpdateCommand : public ControlCommand
 {
@@ -183,7 +183,7 @@
 /**
  * \ingroup management
  * \brief represents a faces/destroy command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Destroy-a-face
  */
 class FaceDestroyCommand : public ControlCommand
 {
@@ -200,51 +200,8 @@
 
 /**
  * \ingroup management
- * \brief Base class for faces/[*]-local-control commands
- */
-class FaceLocalControlCommand : public ControlCommand
-{
-public:
-  void
-  validateRequest(const ControlParameters& parameters) const override;
-
-  void
-  validateResponse(const ControlParameters& parameters) const override;
-
-protected:
-  explicit
-  FaceLocalControlCommand(const std::string& verb);
-};
-
-
-/**
- * \ingroup management
- * \brief represents a faces/enable-local-control command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Enable-a-LocalControlHeader-feature
- */
-class FaceEnableLocalControlCommand : public FaceLocalControlCommand
-{
-public:
-  FaceEnableLocalControlCommand();
-};
-
-
-/**
- * \ingroup management
- * \brief represents a faces/disable-local-control command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Disable-a-LocalControlHeader-feature
- */
-class FaceDisableLocalControlCommand : public FaceLocalControlCommand
-{
-public:
-  FaceDisableLocalControlCommand();
-};
-
-
-/**
- * \ingroup management
  * \brief represents a fib/add-nexthop command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Add-a-nexthop
  */
 class FibAddNextHopCommand : public ControlCommand
 {
@@ -262,7 +219,7 @@
 /**
  * \ingroup management
  * \brief represents a fib/remove-nexthop command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#Remove-a-nexthop
  */
 class FibRemoveNextHopCommand : public ControlCommand
 {
@@ -280,7 +237,7 @@
 /**
  * \ingroup management
  * \brief represents a strategy-choice/set command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Set-the-strategy-for-a-namespace
  */
 class StrategyChoiceSetCommand : public ControlCommand
 {
@@ -292,7 +249,7 @@
 /**
  * \ingroup management
  * \brief represents a strategy-choice/set command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Unset-the-strategy-for-a-namespace
  */
 class StrategyChoiceUnsetCommand : public ControlCommand
 {
@@ -310,7 +267,7 @@
 /**
  * \ingroup management
  * \brief represents a rib/register command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Register-a-route
  */
 class RibRegisterCommand : public ControlCommand
 {
@@ -328,7 +285,7 @@
 /**
  * \ingroup management
  * \brief represents a rib/unregister command
- * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#Unregister-a-route
  */
 class RibUnregisterCommand : public ControlCommand
 {
diff --git a/src/mgmt/nfd/control-parameters.cpp b/src/mgmt/nfd/control-parameters.cpp
index a489c3f..bc18f13 100644
--- a/src/mgmt/nfd/control-parameters.cpp
+++ b/src/mgmt/nfd/control-parameters.cpp
@@ -74,10 +74,6 @@
   if (this->hasOrigin()) {
     totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Origin, m_origin);
   }
-  if (this->hasLocalControlFeature()) {
-    totalLength += prependNonNegativeIntegerBlock(encoder,
-                   tlv::nfd::LocalControlFeature, m_localControlFeature);
-  }
   if (this->hasLocalUri()) {
     size_t valLength = encoder.prependByteArray(
                        reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
@@ -160,12 +156,6 @@
     m_localUri.assign(reinterpret_cast<const char*>(val->value()), val->value_size());
   }
 
-  val = m_wire.find(tlv::nfd::LocalControlFeature);
-  m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = val != m_wire.elements_end();
-  if (this->hasLocalControlFeature()) {
-    m_localControlFeature = static_cast<LocalControlFeature>(readNonNegativeInteger(*val));
-  }
-
   val = m_wire.find(tlv::nfd::Origin);
   m_hasFields[CONTROL_PARAMETER_ORIGIN] = val != m_wire.elements_end();
   if (this->hasOrigin()) {
@@ -309,10 +299,6 @@
     os << "LocalUri: " << parameters.getLocalUri() << ", ";
   }
 
-  if (parameters.hasLocalControlFeature()) {
-    os << "LocalControlFeature: " << parameters.getLocalControlFeature() << ", ";
-  }
-
   if (parameters.hasOrigin()) {
     os << "Origin: " << parameters.getOrigin() << ", ";
   }
diff --git a/src/mgmt/nfd/control-parameters.hpp b/src/mgmt/nfd/control-parameters.hpp
index df19488..c4d2167 100644
--- a/src/mgmt/nfd/control-parameters.hpp
+++ b/src/mgmt/nfd/control-parameters.hpp
@@ -38,7 +38,6 @@
   CONTROL_PARAMETER_FACE_ID,
   CONTROL_PARAMETER_URI,
   CONTROL_PARAMETER_LOCAL_URI,
-  CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE,
   CONTROL_PARAMETER_ORIGIN,
   CONTROL_PARAMETER_COST,
   CONTROL_PARAMETER_FLAGS,
@@ -54,7 +53,6 @@
   "FaceId",
   "Uri",
   "LocalUri",
-  "LocalControlFeature",
   "Origin",
   "Cost",
   "Flags",
@@ -66,15 +64,6 @@
 
 /**
  * \ingroup management
- * \deprecated use Flags+Mask fields instead
- */
-enum LocalControlFeature {
-  LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID = 1,
-  LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID = 2
-};
-
-/**
- * \ingroup management
  * \brief represents parameters in a ControlCommand request or response
  * \sa https://redmine.named-data.net/projects/nfd/wiki/ControlCommand#ControlParameters
  * \details This type is copyable because it's an abstraction of a TLV type.
@@ -228,48 +217,6 @@
     return *this;
   }
 
-  /**
-   * \deprecated use Flags+Mask fields instead
-   */
-  bool
-  hasLocalControlFeature() const
-  {
-    return m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE];
-  }
-
-  /**
-   * \deprecated use Flags+Mask fields instead
-   */
-  LocalControlFeature
-  getLocalControlFeature() const
-  {
-    BOOST_ASSERT(this->hasLocalControlFeature());
-    return m_localControlFeature;
-  }
-
-  /**
-   * \deprecated use Flags+Mask fields instead
-   */
-  ControlParameters&
-  setLocalControlFeature(LocalControlFeature localControlFeature)
-  {
-    m_wire.reset();
-    m_localControlFeature = localControlFeature;
-    m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = true;
-    return *this;
-  }
-
-  /**
-   * \deprecated use Flags+Mask fields instead
-   */
-  ControlParameters&
-  unsetLocalControlFeature()
-  {
-    m_wire.reset();
-    m_hasFields[CONTROL_PARAMETER_LOCAL_CONTROL_FEATURE] = false;
-    return *this;
-  }
-
   bool
   hasOrigin() const
   {
@@ -525,7 +472,6 @@
   uint64_t            m_faceId;
   std::string         m_uri;
   std::string         m_localUri;
-  LocalControlFeature m_localControlFeature;
   RouteOrigin         m_origin;
   uint64_t            m_cost;
   uint64_t            m_flags;
diff --git a/src/mgmt/nfd/face-query-filter.hpp b/src/mgmt/nfd/face-query-filter.hpp
index a7831a5..b0e9e5d 100644
--- a/src/mgmt/nfd/face-query-filter.hpp
+++ b/src/mgmt/nfd/face-query-filter.hpp
@@ -31,7 +31,7 @@
 /**
  * \ingroup management
  * \brief represents Face Query Filter
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
  */
 class FaceQueryFilter
 {
diff --git a/src/mgmt/nfd/face-status.hpp b/src/mgmt/nfd/face-status.hpp
index 1051e65..d34973a 100644
--- a/src/mgmt/nfd/face-status.hpp
+++ b/src/mgmt/nfd/face-status.hpp
@@ -92,23 +92,9 @@
     return m_nInData;
   }
 
-  DEPRECATED(
-  uint64_t
-  getNInDatas() const)
-  {
-    return getNInData();
-  }
-
   FaceStatus&
   setNInData(uint64_t nInData);
 
-  DEPRECATED(
-  FaceStatus&
-  setNInDatas(uint64_t nInData))
-  {
-    return setNInData(nInData);
-  }
-
   uint64_t
   getNInNacks() const
   {
@@ -133,23 +119,9 @@
     return m_nOutData;
   }
 
-  DEPRECATED(
-  uint64_t
-  getNOutDatas() const)
-  {
-    return getNOutData();
-  }
-
   FaceStatus&
   setNOutData(uint64_t nOutData);
 
-  DEPRECATED(
-  FaceStatus&
-  setNOutDatas(uint64_t nOutData))
-  {
-    return setNOutData(nOutData);
-  }
-
   uint64_t
   getNOutNacks() const
   {
diff --git a/src/mgmt/nfd/forwarder-status.hpp b/src/mgmt/nfd/forwarder-status.hpp
index 58403f8..d751165 100644
--- a/src/mgmt/nfd/forwarder-status.hpp
+++ b/src/mgmt/nfd/forwarder-status.hpp
@@ -161,23 +161,9 @@
     return m_nInData;
   }
 
-  DEPRECATED(
-  uint64_t
-  getNInDatas() const)
-  {
-    return getNInData();
-  }
-
   ForwarderStatus&
   setNInData(uint64_t nInData);
 
-  DEPRECATED(
-  ForwarderStatus&
-  setNInDatas(uint64_t nInData))
-  {
-    return setNInData(nInData);
-  }
-
   uint64_t
   getNInNacks() const
   {
@@ -202,23 +188,9 @@
     return m_nOutData;
   }
 
-  DEPRECATED(
-  uint64_t
-  getNOutDatas() const)
-  {
-    return getNOutData();
-  }
-
   ForwarderStatus&
   setNOutData(uint64_t nOutData);
 
-  DEPRECATED(
-  ForwarderStatus&
-  setNOutDatas(uint64_t nOutData))
-  {
-    return setNOutData(nOutData);
-  }
-
   uint64_t
   getNOutNacks() const
   {
diff --git a/src/mgmt/nfd/status-dataset.hpp b/src/mgmt/nfd/status-dataset.hpp
index e3cc264..f3d2c5e 100644
--- a/src/mgmt/nfd/status-dataset.hpp
+++ b/src/mgmt/nfd/status-dataset.hpp
@@ -37,7 +37,7 @@
 /**
  * \ingroup management
  * \brief base class of NFD StatusDataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/StatusDataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/StatusDataset
  */
 class StatusDataset : noncopyable
 {
@@ -115,7 +115,7 @@
 /**
  * \ingroup management
  * \brief represents a status/general dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus#General-Status-Dataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/ForwarderStatus#General-Status-Dataset
  */
 class ForwarderGeneralStatusDataset : public StatusDataset
 {
@@ -150,7 +150,7 @@
 /**
  * \ingroup management
  * \brief represents a faces/list dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Face-Dataset
  */
 class FaceDataset : public FaceDatasetBase
 {
@@ -162,7 +162,7 @@
 /**
  * \ingroup management
  * \brief represents a faces/query dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#Query-Operation
  */
 class FaceQueryDataset : public FaceDatasetBase
 {
@@ -201,7 +201,7 @@
 /**
  * \ingroup management
  * \brief represents a fib/list dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/FibMgmt#FIB-Dataset
  */
 class FibDataset : public StatusDataset
 {
@@ -218,7 +218,7 @@
 /**
  * \ingroup management
  * \brief represents a strategy-choice/list dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy-Choice-Dataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/StrategyChoice#Strategy-Choice-Dataset
  */
 class StrategyChoiceDataset : public StatusDataset
 {
@@ -235,7 +235,7 @@
 /**
  * \ingroup management
  * \brief represents a rib/list dataset
- * \sa http://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset
+ * \sa https://redmine.named-data.net/projects/nfd/wiki/RibMgmt#RIB-Dataset
  */
 class RibDataset : public StatusDataset
 {
diff --git a/src/name-component.hpp b/src/name-component.hpp
index 7b43910..315ea0e 100644
--- a/src/name-component.hpp
+++ b/src/name-component.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -206,38 +206,6 @@
   /**
    * @brief Write *this to the output stream, escaping characters according to the NDN URI Scheme
    *
-   * @deprecated Use toUri(std::ostream&) instead
-   *
-   * This also adds "..." to a value with zero or more "."
-   *
-   * @param os The output stream to where write the URI escaped version *this
-   */
-  DEPRECATED(
-  void
-  toEscapedString(std::ostream& os) const)
-  {
-    return toUri(os);
-  }
-
-  /**
-   * @brief Convert *this by escaping characters according to the NDN URI Scheme
-   *
-   * @deprecated Use toUri() instead
-   *
-   * This also adds "..." to a value with zero or more "."
-   *
-   * @return The escaped string
-   */
-  DEPRECATED(
-  std::string
-  toEscapedString() const)
-  {
-    return toUri();
-  }
-
-  /**
-   * @brief Write *this to the output stream, escaping characters according to the NDN URI Scheme
-   *
    * This also adds "..." to a value with zero or more "."
    *
    * @param os The output stream to where write the URI escaped version *this
diff --git a/src/security/cryptopp.hpp b/src/security/cryptopp.hpp
deleted file mode 100644
index 4c9e959..0000000
--- a/src/security/cryptopp.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/**
- * @file security/cryptopp.hpp
- * @deprecated Use security/v1/cryptopp.hpp
- */
-
-#include "security-common.hpp"
-
-#ifdef NDN_CXX_KEEP_SECURITY_V1_ALIASES
-#include "v1/cryptopp.hpp"
-#else
-#error "Deprecated. Use v1/cryptopp.hpp instead."
-#endif // NDN_CXX_KEEP_SECURITY_V1_ALIASES
diff --git a/src/security/identity-certificate.hpp b/src/security/identity-certificate.hpp
deleted file mode 100644
index 42553a6..0000000
--- a/src/security/identity-certificate.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/**
- * @file security/identity-certificate.hpp
- * @deprecated Use security/v1/identity-certificate.hpp
- */
-
-#include "security-common.hpp"
-
-#ifdef NDN_CXX_KEEP_SECURITY_V1_ALIASES
-#include "v1/identity-certificate.hpp"
-#else
-#error "Deprecated. Use `v1/identity-certificate.hpp` instead."
-#endif // NDN_CXX_KEEP_SECURITY_V1_ALIASES
diff --git a/src/security/public-key.hpp b/src/security/public-key.hpp
deleted file mode 100644
index 8e1a09b..0000000
--- a/src/security/public-key.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2013-2016 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.
- */
-
-/**
- * @file security/public-key.hpp
- * @deprecated Use security/v1/public-key.hpp
- */
-
-#include "security-common.hpp"
-
-#ifdef NDN_CXX_KEEP_SECURITY_V1_ALIASES
-#include "v1/public-key.hpp"
-#else
-#error "Deprecated. Use `v1/public-key.hpp` instead."
-#endif // NDN_CXX_KEEP_SECURITY_V1_ALIASES
diff --git a/src/security/security-common.hpp b/src/security/security-common.hpp
index b5a704d..20d8040 100644
--- a/src/security/security-common.hpp
+++ b/src/security/security-common.hpp
@@ -38,15 +38,6 @@
  */
 const size_t MIN_SIZE = 2;
 
-/** \deprecated To avoid a potentially breaking change, this value is kept based on the Command
- *              Interest definition.  This value will be eliminated in favor of `MIN_SIZE=2`.
- */
-const size_t MIN_LENGTH = 4;
-
-/** \deprecated Use `MIN_SIZE`
- */
-const size_t MIN_LENGTH_SIG_ONLY = 2;
-
 } // namespace signed_interest
 
 namespace command_interest {
@@ -63,20 +54,6 @@
 
 } // namespace command_interest
 
-namespace signed_interest {
-
-/**
- * @deprecated Use command_interest::POS_RANDOM_VAL
- */
-using command_interest::POS_RANDOM_VAL;
-
-/**
- * @deprecated Use command_interest::POS_TIMESTAMP
- */
-using command_interest::POS_TIMESTAMP;
-
-} // namespace signed_interest
-
 /**
  * @brief The type of KeyId component in a key name
  */
diff --git a/src/security/v2/key-chain.cpp b/src/security/v2/key-chain.cpp
index 954231c..53f1898 100644
--- a/src/security/v2/key-chain.cpp
+++ b/src/security/v2/key-chain.cpp
@@ -685,7 +685,7 @@
                const Name& keyName, DigestAlgorithm digestAlgorithm) const
 {
   if (keyName == SigningInfo::getDigestSha256Identity())
-    return Block(tlv::SignatureValue, crypto::sha256(buf, size));
+    return Block(tlv::SignatureValue, crypto::computeSha256Digest(buf, size));
 
   return Block(tlv::SignatureValue, m_tpm->sign(buf, size, keyName, digestAlgorithm));
 }
diff --git a/src/signature.hpp b/src/signature.hpp
index 362e172..4644807 100644
--- a/src/signature.hpp
+++ b/src/signature.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -43,13 +43,6 @@
     }
   };
 
-  /// @deprecated use tlv::SignatureTypeValue instead.
-  enum {
-    Sha256 = tlv::DigestSha256,
-    Sha256WithRsa = tlv::SignatureSha256WithRsa,
-    Sha256WithEcdsa = tlv::SignatureSha256WithEcdsa
-  };
-
   Signature() = default;
 
   explicit
diff --git a/src/util/crypto.hpp b/src/util/crypto.hpp
index d5ce89b..860b17d 100644
--- a/src/util/crypto.hpp
+++ b/src/util/crypto.hpp
@@ -41,17 +41,6 @@
 ConstBufferPtr
 computeSha256Digest(const uint8_t* data, size_t dataLength);
 
-/**
- * @brief Compute the sha-256 digest of data.
- *
- * @deprecated Use computeSha256Digest function instead
- */
-inline ConstBufferPtr
-sha256(const uint8_t* data, size_t dataLength)
-{
-  return computeSha256Digest(data, dataLength);
-}
-
 } // namespace crypto
 } // namespace ndn
 
diff --git a/src/util/ethernet.cpp b/src/util/ethernet.cpp
index c880d0c..e9160d9 100644
--- a/src/util/ethernet.cpp
+++ b/src/util/ethernet.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015 Regents of the University of California,
+ * Copyright (c) 2014-2017 Regents of the University of California,
  *                         Arizona Board of Regents,
  *                         Colorado State University,
  *                         University Pierre & Marie Curie, Sorbonne University,
@@ -81,7 +81,7 @@
 
   // - apparently gcc-4.6 does not support the 'hh' type modifier
   // - std::snprintf not found in some environments
-  //   http://redmine.named-data.net/issues/2299 for more information
+  //   https://redmine.named-data.net/issues/2299 for more information
   snprintf(s, sizeof(s), "%02x%c%02x%c%02x%c%02x%c%02x%c%02x",
            at(0), sep, at(1), sep, at(2), sep, at(3), sep, at(4), sep, at(5));
 
diff --git a/src/util/io.hpp b/src/util/io.hpp
index 7da812e..cad5a26 100644
--- a/src/util/io.hpp
+++ b/src/util/io.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -62,8 +62,6 @@
   HEX
 };
 
-constexpr IoEncoding DEPRECATED(BASE_64) = BASE64;
-
 namespace detail {
 
 template<typename T>
diff --git a/src/util/notification-stream.hpp b/src/util/notification-stream.hpp
index d886173..212f7e5 100644
--- a/src/util/notification-stream.hpp
+++ b/src/util/notification-stream.hpp
@@ -38,7 +38,7 @@
 namespace util {
 
 /** \brief provides a publisher of Notification Stream
- *  \sa http://redmine.named-data.net/projects/nfd/wiki/Notification
+ *  \sa https://redmine.named-data.net/projects/nfd/wiki/Notification
  */
 template<typename Notification>
 class NotificationStream : noncopyable
diff --git a/src/util/scheduler.hpp b/src/util/scheduler.hpp
index cad5c09..e3927ac 100644
--- a/src/util/scheduler.hpp
+++ b/src/util/scheduler.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2013-2016 Regents of the University of California.
+ * Copyright (c) 2013-2017 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -127,11 +127,6 @@
 class Scheduler : noncopyable
 {
 public:
-  /**
-   * \deprecated use EventCallback
-   */
-  typedef EventCallback Event;
-
   explicit
   Scheduler(boost::asio::io_service& ioService);
 
