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
 {
