diff --git a/ndn-cxx/mgmt/dispatcher.cpp b/ndn-cxx/mgmt/dispatcher.cpp
index f242eb1..5594757 100644
--- a/ndn-cxx/mgmt/dispatcher.cpp
+++ b/ndn-cxx/mgmt/dispatcher.cpp
@@ -166,8 +166,8 @@
                            const Interest& interest,
                            const ControlParametersParser& parse,
                            const Authorization& authorize,
-                           const ValidateParameters& validateParams,
-                           const ControlCommandHandler& handler)
+                           ValidateParameters validate,
+                           ControlCommandHandler handler)
 {
   // /<prefix>/<relPrefix>/<parameters>
   size_t parametersLoc = prefix.size() + relPrefix.size();
@@ -181,8 +181,8 @@
     return;
   }
 
-  AcceptContinuation accept = [=] (const auto& req) {
-    processAuthorizedCommand(req, prefix, interest, parameters, validateParams, handler);
+  AcceptContinuation accept = [=, v = std::move(validate), h = std::move(handler)] (const auto&) {
+    processAuthorizedCommand(prefix, interest, parameters, v, h);
   };
   RejectContinuation reject = [=] (RejectReply reply) {
     afterAuthorizationRejected(reply, interest);
@@ -191,14 +191,13 @@
 }
 
 void
-Dispatcher::processAuthorizedCommand(const std::string& requester,
-                                     const Name& prefix,
+Dispatcher::processAuthorizedCommand(const Name& prefix,
                                      const Interest& interest,
                                      const shared_ptr<ControlParameters>& parameters,
-                                     const ValidateParameters& validateParams,
+                                     const ValidateParameters& validate,
                                      const ControlCommandHandler& handler)
 {
-  if (validateParams(*parameters)) {
+  if (validate(*parameters)) {
     handler(prefix, interest, *parameters,
             [=] (const auto& resp) { sendControlResponse(resp, interest); });
   }
@@ -221,26 +220,19 @@
 
 void
 Dispatcher::addStatusDataset(const PartialName& relPrefix,
-                             Authorization auth,
-                             StatusDatasetHandler handler)
+                             Authorization authorize,
+                             StatusDatasetHandler handle)
 {
   checkPrefix(relPrefix);
 
-  AuthorizationAcceptedCallback accept =
-    [this, handler = std::move(handler)] (auto&&, const auto& prefix, const auto& interest, auto&&) {
-      processAuthorizedStatusDatasetInterest(prefix, interest, handler);
-    };
-  AuthorizationRejectedCallback reject =
-    [this] (auto&&... args) {
-      afterAuthorizationRejected(std::forward<decltype(args)>(args)...);
-    };
   // follow the general path if storage is a miss
-  InterestHandler missContinuation =
-    [this, auth = std::move(auth), accept = std::move(accept), reject = std::move(reject)] (auto&&... args) {
-      processStatusDatasetInterest(std::forward<decltype(args)>(args)..., auth, accept, reject);
-    };
+  InterestHandler afterMiss = [this,
+                               authorizer = std::move(authorize),
+                               handler = std::move(handle)] (const auto& prefix, const auto& interest) {
+    processStatusDatasetInterest(prefix, interest, authorizer, std::move(handler));
+  };
 
-  m_handlers[relPrefix] = [this, miss = std::move(missContinuation)] (auto&&... args) {
+  m_handlers[relPrefix] = [this, miss = std::move(afterMiss)] (auto&&... args) {
     queryStorage(std::forward<decltype(args)>(args)..., miss);
   };
 }
@@ -248,9 +240,8 @@
 void
 Dispatcher::processStatusDatasetInterest(const Name& prefix,
                                          const Interest& interest,
-                                         const Authorization& authorization,
-                                         const AuthorizationAcceptedCallback& accepted,
-                                         const AuthorizationRejectedCallback& rejected)
+                                         const Authorization& authorize,
+                                         StatusDatasetHandler handler)
 {
   const Name& interestName = interest.getName();
   bool endsWithVersionOrSegment = interestName.size() >= 1 &&
@@ -259,9 +250,13 @@
     return;
   }
 
-  AcceptContinuation accept = [=] (const auto& req) { accepted(req, prefix, interest, nullptr); };
-  RejectContinuation reject = [=] (RejectReply reply) { rejected(reply, interest); };
-  authorization(prefix, interest, nullptr, accept, reject);
+  AcceptContinuation accept = [=, h = std::move(handler)] (const auto&) {
+    processAuthorizedStatusDatasetInterest(prefix, interest, h);
+  };
+  RejectContinuation reject = [=] (RejectReply reply) {
+    afterAuthorizationRejected(reply, interest);
+  };
+  authorize(prefix, interest, nullptr, accept, reject);
 }
 
 void
diff --git a/ndn-cxx/mgmt/dispatcher.hpp b/ndn-cxx/mgmt/dispatcher.hpp
index 2c4585a..3be18ae 100644
--- a/ndn-cxx/mgmt/dispatcher.hpp
+++ b/ndn-cxx/mgmt/dispatcher.hpp
@@ -93,8 +93,9 @@
  */
 using ValidateParameters = std::function<bool(const ControlParameters& params)>;
 
-/** \brief A function to be called after ControlCommandHandler completes.
- *  \param resp the response to be sent to requester
+/**
+ * \brief A function to be called after a ControlCommandHandler completes.
+ * \param resp The response that should be sent back to the requester.
  */
 using CommandContinuation = std::function<void(const ControlResponse& resp)>;
 
@@ -195,17 +196,17 @@
    * \throw std::out_of_range \p relPrefix overlaps with an existing relPrefix.
    * \throw std::domain_error One or more top-level prefixes have been added.
    *
-   * Procedure for processing a ControlCommand:
+   * Procedure for processing a ControlCommand registered through this function:
    *  1. Extract the NameComponent containing ControlParameters (the component after relPrefix),
    *     and parse ControlParameters into ParametersType; if parsing fails, abort these steps.
    *  2. Perform authorization; if the authorization is rejected, perform the RejectReply action
    *     and abort these steps.
-   *  3. Validate ControlParameters; if validation fails, create a ControlResponse with
+   *  3. Validate the ControlParameters; if validation fails, create a ControlResponse with
    *     StatusCode 400 and go to step 5.
    *  4. Invoke the command handler, wait until CommandContinuation is called.
    *  5. Encode the ControlResponse into one Data packet.
    *  6. Sign the Data packet.
-   *  7. If the Data packet is too large, abort these steps and log an error.
+   *  7. If the Data packet is too large, log an error and abort these steps.
    *  8. Send the signed Data packet.
    */
   template<typename ParametersType,
@@ -227,7 +228,8 @@
                              authorize = std::move(authorize),
                              validate = std::move(validate),
                              handle = std::move(handle)] (const auto& prefix, const auto& interest) {
-      processCommand(prefix, relPrefix, interest, parse, authorize, validate, handle);
+      processCommand(prefix, relPrefix, interest, parse, authorize,
+                     std::move(validate), std::move(handle));
     };
   }
 
@@ -296,13 +298,6 @@
 private:
   using InterestHandler = std::function<void(const Name& prefix, const Interest&)>;
 
-  using AuthorizationAcceptedCallback = std::function<void(const std::string& requester,
-                                                           const Name& prefix,
-                                                           const Interest&,
-                                                           const shared_ptr<ControlParameters>&)>;
-
-  using AuthorizationRejectedCallback = std::function<void(RejectReply, const Interest&)>;
-
   /**
    * @brief The parser for extracting control parameters from a name component.
    * @return A shared pointer to the extracted ControlParameters.
@@ -374,7 +369,7 @@
    * @param parse function to extract the control parameters from the command
    * @param authorize function to determine whether the command is authorized
    * @param validate function to validate the command parameters
-   * @param handler function to execute the command after authorization and validation
+   * @param handler function to execute the command after it is authorized and validated
    */
   void
   processCommand(const Name& prefix,
@@ -382,22 +377,20 @@
                  const Interest& interest,
                  const ControlParametersParser& parse,
                  const Authorization& authorize,
-                 const ValidateParameters& validate,
-                 const ControlCommandHandler& handler);
+                 ValidateParameters validate,
+                 ControlCommandHandler handler);
 
   /**
    * @brief Process an authorized control command.
    *
-   * @param requester the requester
    * @param prefix the top-level prefix
    * @param interest the incoming Interest
    * @param parameters control parameters of this command
    * @param validate function to validate the command parameters
-   * @param handler function to execute the command after authorization and validation
+   * @param handler function to execute the command after its parameters are validated
    */
   void
-  processAuthorizedCommand(const std::string& requester,
-                           const Name& prefix,
+  processAuthorizedCommand(const Name& prefix,
                            const Interest& interest,
                            const shared_ptr<ControlParameters>& parameters,
                            const ValidateParameters& validate,
@@ -411,23 +404,21 @@
    *
    * @param prefix the top-level prefix
    * @param interest the incoming Interest
-   * @param authorize function to process verification
-   * @param accepted callback for successful authorization
-   * @param rejected callback for failed authorization
+   * @param authorize function to determine whether the request is authorized
+   * @param handler function to continue processing the request after it is authorized
    */
   void
   processStatusDatasetInterest(const Name& prefix,
                                const Interest& interest,
                                const Authorization& authorize,
-                               const AuthorizationAcceptedCallback& accepted,
-                               const AuthorizationRejectedCallback& rejected);
+                               StatusDatasetHandler handler);
 
   /**
    * @brief Process an authorized StatusDataset request.
    *
    * @param prefix the top-level prefix
    * @param interest the incoming Interest
-   * @param handler function to process this request
+   * @param handler function to process the dataset request
    */
   void
   processAuthorizedStatusDatasetInterest(const Name& prefix,
diff --git a/tests/unit/mgmt/dispatcher.t.cpp b/tests/unit/mgmt/dispatcher.t.cpp
index 9087179..ec6f90f 100644
--- a/tests/unit/mgmt/dispatcher.t.cpp
+++ b/tests/unit/mgmt/dispatcher.t.cpp
@@ -32,18 +32,10 @@
 
 class DispatcherFixture : public IoKeyChainFixture
 {
-public:
-  DispatcherFixture()
-    : face(m_io, m_keyChain, {true, true})
-    , dispatcher(face, m_keyChain, security::SigningInfo())
-    , storage(dispatcher.m_storage)
-  {
-  }
-
-public:
-  DummyClientFace face;
-  mgmt::Dispatcher dispatcher;
-  InMemoryStorageFifo& storage;
+protected:
+  DummyClientFace face{m_io, m_keyChain, {true, true}};
+  Dispatcher dispatcher{face, m_keyChain};
+  InMemoryStorageFifo& storage{dispatcher.m_storage};
 };
 
 class VoidParameters : public mgmt::ControlParameters
@@ -266,16 +258,14 @@
   * ut::description("test for bug #4059"))
 {
   AcceptContinuation authorizationAccept;
-  auto authorization =
-    [&authorizationAccept] (const Name&, const Interest&, const ControlParameters*,
-                            AcceptContinuation accept, RejectContinuation) {
-      authorizationAccept = std::move(accept);
-    };
+  auto authorization = [&authorizationAccept] (const Name&, const Interest&, const ControlParameters*,
+                                               AcceptContinuation accept, RejectContinuation) {
+    authorizationAccept = std::move(accept);
+  };
 
-  auto validateParameters =
-    [] (const ControlParameters& params) {
-      return dynamic_cast<const StatefulParameters&>(params).check();
-    };
+  auto validateParameters = [] (const ControlParameters& params) {
+    return dynamic_cast<const StatefulParameters&>(params).check();
+  };
 
   size_t nCallbackCalled = 0;
   dispatcher.addControlCommand<StatefulParameters>("test", authorization, validateParameters,
