diff --git a/tools/nfdc/canonizer.cpp b/tools/nfdc/canonizer.cpp
deleted file mode 100644
index c6f150b..0000000
--- a/tools/nfdc/canonizer.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2022,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "canonizer.hpp"
-
-namespace nfd::tools::nfdc {
-
-std::pair<std::optional<FaceUri>, std::string>
-canonize(ExecuteContext& ctx, const FaceUri& uri)
-{
-  std::optional<FaceUri> result;
-  std::string error;
-  uri.canonize(
-    [&result] (const FaceUri& canonicalUri) { result = canonicalUri; },
-    [&error] (const std::string& errorReason) { error = errorReason; },
-    ctx.face.getIoService(), ctx.getTimeout());
-  ctx.face.processEvents();
-
-  return {result, error};
-}
-
-std::pair<FindFace::Code, std::string>
-canonizeErrorHelper(const FaceUri& uri,
-                    const std::string& error,
-                    const std::string& field)
-{
-  std::string msg = "Error during canonization of ";
-  if (!field.empty()) {
-    msg += field + " ";
-  }
-  msg += "'" + uri.toString() + "': " + error;
-  return {FindFace::Code::CANONIZE_ERROR, msg};
-}
-
-} // namespace nfd::tools::nfdc
diff --git a/tools/nfdc/canonizer.hpp b/tools/nfdc/canonizer.hpp
deleted file mode 100644
index d693a55..0000000
--- a/tools/nfdc/canonizer.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2022,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef NFD_TOOLS_NFDC_CANONIZER_HPP
-#define NFD_TOOLS_NFDC_CANONIZER_HPP
-
-#include "core/common.hpp"
-#include "execute-command.hpp"
-#include "find-face.hpp"
-
-#include <ndn-cxx/net/face-uri.hpp>
-
-namespace nfd::tools::nfdc {
-
-/** \brief canonize FaceUri
- *  \return pair of canonical FaceUri (nullopt if failure) and error string
- */
-std::pair<std::optional<FaceUri>, std::string>
-canonize(ExecuteContext& ctx, const FaceUri& uri);
-
-/** \brief helper to generate exit code and error message for face canonization failures
- *  \param uri FaceUri
- *  \param error error string returned by canonization process
- *  \param field optional field identifier to include with message
- *  \return pair of exit code and error message
- */
-std::pair<FindFace::Code, std::string>
-canonizeErrorHelper(const FaceUri& uri,
-                    const std::string& error,
-                    const std::string& field = "");
-
-} // namespace nfd::tools::nfdc
-
-#endif // NFD_TOOLS_NFDC_CANONIZER_HPP
diff --git a/tools/nfdc/command-definition.cpp b/tools/nfdc/command-definition.cpp
index c98197e..443aff0 100644
--- a/tools/nfdc/command-definition.cpp
+++ b/tools/nfdc/command-definition.cpp
@@ -228,6 +228,18 @@
   NDN_THROW(std::invalid_argument("unrecognized boolean value '" + s + "'"));
 }
 
+static ReportFormat
+parseReportFormat(const std::string& s)
+{
+  if (s == "xml") {
+    return ReportFormat::XML;
+  }
+  if (s == "text") {
+    return ReportFormat::TEXT;
+  }
+  NDN_THROW(std::invalid_argument("unrecognized ReportFormat '" + s + "'"));
+}
+
 static FacePersistency
 parseFacePersistency(const std::string& s)
 {
diff --git a/tools/nfdc/find-face.cpp b/tools/nfdc/face-helpers.cpp
similarity index 83%
rename from tools/nfdc/find-face.cpp
rename to tools/nfdc/face-helpers.cpp
index 054cba9..93b896c 100644
--- a/tools/nfdc/find-face.cpp
+++ b/tools/nfdc/face-helpers.cpp
@@ -23,8 +23,7 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "find-face.hpp"
-#include "canonizer.hpp"
+#include "face-helpers.hpp"
 #include "format-helpers.hpp"
 
 #include <ndn-cxx/util/logger.hpp>
@@ -127,11 +126,11 @@
 void
 FindFace::query()
 {
-  auto datasetCb = [this] (const std::vector<ndn::nfd::FaceStatus>& result) {
+  auto datasetCb = [this] (const auto& result) {
     m_res = Code::OK;
     m_results = result;
   };
-  auto failureCb = [this] (uint32_t code, const std::string& reason) {
+  auto failureCb = [this] (uint32_t code, const auto& reason) {
     m_res = Code::ERROR;
     m_errorReason = "Error " + to_string(code) + " when querying face: " + reason;
   };
@@ -178,4 +177,31 @@
   }
 }
 
+std::pair<std::optional<FaceUri>, std::string>
+canonize(ExecuteContext& ctx, const FaceUri& uri)
+{
+  std::optional<FaceUri> result;
+  std::string error;
+  uri.canonize(
+    [&result] (const auto& canonicalUri) { result = canonicalUri; },
+    [&error] (const auto& errorReason) { error = errorReason; },
+    ctx.face.getIoService(), ctx.getTimeout());
+  ctx.face.processEvents();
+
+  return {result, error};
+}
+
+std::pair<FindFace::Code, std::string>
+canonizeErrorHelper(const FaceUri& uri,
+                    const std::string& error,
+                    const std::string& field)
+{
+  std::string msg = "Error during canonization of ";
+  if (!field.empty()) {
+    msg += field + " ";
+  }
+  msg += "'" + uri.toString() + "': " + error;
+  return {FindFace::Code::CANONIZE_ERROR, msg};
+}
+
 } // namespace nfd::tools::nfdc
diff --git a/tools/nfdc/find-face.hpp b/tools/nfdc/face-helpers.hpp
similarity index 82%
rename from tools/nfdc/find-face.hpp
rename to tools/nfdc/face-helpers.hpp
index 02de011..5c4ea18 100644
--- a/tools/nfdc/find-face.hpp
+++ b/tools/nfdc/face-helpers.hpp
@@ -23,8 +23,8 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef NFD_TOOLS_NFDC_FIND_FACE_HPP
-#define NFD_TOOLS_NFDC_FIND_FACE_HPP
+#ifndef NFD_TOOLS_NFDC_FACE_HELPERS_HPP
+#define NFD_TOOLS_NFDC_FACE_HELPERS_HPP
 
 #include "execute-command.hpp"
 
@@ -33,7 +33,8 @@
 using ndn::nfd::FaceQueryFilter;
 using ndn::nfd::FaceStatus;
 
-/** \brief procedure to find a face
+/**
+ * \brief Procedure to find a face
  */
 class FindFace : noncopyable
 {
@@ -137,6 +138,25 @@
   std::string m_errorReason;
 };
 
+/**
+ * \brief Canonize a FaceUri
+ * \return canonical FaceUri (nullopt on failure) and error string
+ */
+std::pair<std::optional<FaceUri>, std::string>
+canonize(ExecuteContext& ctx, const FaceUri& uri);
+
+/**
+ * \brief Helper to generate exit code and error message for face canonization failures
+ * \param uri The FaceUri
+ * \param error The error string returned by the canonization process
+ * \param field An optional field identifier to include with the message
+ * \return exit code and error message
+ */
+std::pair<FindFace::Code, std::string>
+canonizeErrorHelper(const FaceUri& uri,
+                    const std::string& error,
+                    const std::string& field = "");
+
 } // namespace nfd::tools::nfdc
 
-#endif // NFD_TOOLS_NFDC_FIND_FACE_HPP
+#endif // NFD_TOOLS_NFDC_FACE_HELPERS_HPP
diff --git a/tools/nfdc/face-module.cpp b/tools/nfdc/face-module.cpp
index 4d9d3a2..446a281 100644
--- a/tools/nfdc/face-module.cpp
+++ b/tools/nfdc/face-module.cpp
@@ -24,8 +24,7 @@
  */
 
 #include "face-module.hpp"
-#include "canonizer.hpp"
-#include "find-face.hpp"
+#include "face-helpers.hpp"
 
 #include <boost/lexical_cast/try_lexical_convert.hpp>
 
@@ -368,7 +367,7 @@
                         const CommandOptions& options)
 {
   controller.fetch<ndn::nfd::FaceDataset>(
-    [this, onSuccess] (const std::vector<FaceStatus>& result) {
+    [this, onSuccess] (const auto& result) {
       m_status = result;
       onSuccess();
     },
diff --git a/tools/nfdc/rib-module.cpp b/tools/nfdc/rib-module.cpp
index d0489cf..bf3b662 100644
--- a/tools/nfdc/rib-module.cpp
+++ b/tools/nfdc/rib-module.cpp
@@ -24,9 +24,8 @@
  */
 
 #include "rib-module.hpp"
-#include "canonizer.hpp"
 #include "face-module.hpp"
-#include "find-face.hpp"
+#include "face-helpers.hpp"
 #include "format-helpers.hpp"
 
 namespace nfd::tools::nfdc {
@@ -97,7 +96,7 @@
     nexthops = findFace.getFaceIds();
   }
 
-  listRoutesImpl(ctx, [&] (const RibEntry& entry, const Route& route) {
+  listRoutesImpl(ctx, [&] (const RibEntry&, const Route& route) {
     return (nexthops.empty() || nexthops.count(route.getFaceId()) > 0) &&
            (!origin || route.getOrigin() == *origin);
   });
@@ -108,7 +107,7 @@
 {
   auto prefix = ctx.args.get<Name>("prefix");
 
-  listRoutesImpl(ctx, [&] (const RibEntry& entry, const Route& route) {
+  listRoutesImpl(ctx, [&] (const RibEntry& entry, const Route&) {
     return entry.getName() == prefix;
   });
 }
@@ -117,7 +116,7 @@
 RibModule::listRoutesImpl(ExecuteContext& ctx, const RoutePredicate& filter)
 {
   ctx.controller.fetch<ndn::nfd::RibDataset>(
-    [&] (const std::vector<RibEntry>& dataset) {
+    [&] (const auto& dataset) {
       bool hasRoute = false;
       for (const RibEntry& entry : dataset) {
         for (const Route& route : entry.getRoutes()) {
@@ -307,7 +306,7 @@
                        const CommandOptions& options)
 {
   controller.fetch<ndn::nfd::RibDataset>(
-    [this, onSuccess] (const std::vector<RibEntry>& result) {
+    [this, onSuccess] (const auto& result) {
       m_status = result;
       onSuccess();
     },
diff --git a/tools/nfdc/status-report.cpp b/tools/nfdc/status-report.cpp
index ff0ea1c..3611e0f 100644
--- a/tools/nfdc/status-report.cpp
+++ b/tools/nfdc/status-report.cpp
@@ -28,18 +28,6 @@
 
 namespace nfd::tools::nfdc {
 
-ReportFormat
-parseReportFormat(const std::string& s)
-{
-  if (s == "xml") {
-    return ReportFormat::XML;
-  }
-  if (s == "text") {
-    return ReportFormat::TEXT;
-  }
-  NDN_THROW(std::invalid_argument("unrecognized ReportFormat '" + s + "'"));
-}
-
 std::ostream&
 operator<<(std::ostream& os, ReportFormat fmt)
 {
diff --git a/tools/nfdc/status-report.hpp b/tools/nfdc/status-report.hpp
index 20c364d..67ff429 100644
--- a/tools/nfdc/status-report.hpp
+++ b/tools/nfdc/status-report.hpp
@@ -40,12 +40,9 @@
 
 enum class ReportFormat {
   XML = 1,
-  TEXT = 2
+  TEXT = 2,
 };
 
-ReportFormat
-parseReportFormat(const std::string& s);
-
 std::ostream&
 operator<<(std::ostream& os, ReportFormat fmt);
 
