diff --git a/src/mgmt/dispatcher.cpp b/src/mgmt/dispatcher.cpp
index b43334b..78217a9 100644
--- a/src/mgmt/dispatcher.cpp
+++ b/src/mgmt/dispatcher.cpp
@@ -38,8 +38,8 @@
   return [] (const Name& prefix,
              const Interest& interest,
              const ControlParameters* params,
-             AcceptContinuation accept,
-             RejectContinuation reject) {
+             const AcceptContinuation& accept,
+             const RejectContinuation& reject) {
     accept("");
   };
 }
@@ -226,8 +226,8 @@
 
 void
 Dispatcher::addStatusDataset(const PartialName& relPrefix,
-                             Authorization authorization,
-                             StatusDatasetHandler handler)
+                             const Authorization& authorization,
+                             const StatusDatasetHandler& handler)
 {
   if (!m_topLevelPrefixes.empty()) {
     BOOST_THROW_EXCEPTION(std::domain_error("one or more top-level prefix has been added"));
diff --git a/src/mgmt/dispatcher.hpp b/src/mgmt/dispatcher.hpp
index 922722f..7e521c8 100644
--- a/src/mgmt/dispatcher.hpp
+++ b/src/mgmt/dispatcher.hpp
@@ -76,8 +76,8 @@
  */
 typedef std::function<void(const Name& prefix, const Interest& interest,
                            const ControlParameters* params,
-                           AcceptContinuation accept,
-                           RejectContinuation reject)> Authorization;
+                           const AcceptContinuation& accept,
+                           const RejectContinuation& reject)> Authorization;
 
 /** \return an Authorization that accepts all Interests, with empty string as requester
  */
@@ -106,7 +106,7 @@
  */
 typedef std::function<void(const Name& prefix, const Interest& interest,
                            const ControlParameters& params,
-                           CommandContinuation done)> ControlCommandHandler;
+                           const CommandContinuation& done)> ControlCommandHandler;
 
 
 /** \brief a function to handle a StatusDataset request
@@ -217,9 +217,9 @@
   template<typename CP>
   void
   addControlCommand(const PartialName& relPrefix,
-                    Authorization authorization,
-                    ValidateParameters validateParams,
-                    ControlCommandHandler handler);
+                    const Authorization& authorization,
+                    const ValidateParameters& validateParams,
+                    const ControlCommandHandler& handler);
 
 public: // StatusDataset
   /** \brief register a StatusDataset or a prefix under which StatusDatasets can be requested
@@ -254,8 +254,8 @@
    */
   void
   addStatusDataset(const PartialName& relPrefix,
-                   Authorization authorization,
-                   StatusDatasetHandler handler);
+                   const Authorization& authorization,
+                   const StatusDatasetHandler& handler);
 
 public: // NotificationStream
   /** \brief register a NotificationStream
@@ -418,9 +418,9 @@
 template<typename CP>
 void
 Dispatcher::addControlCommand(const PartialName& relPrefix,
-                              Authorization authorization,
-                              ValidateParameters validateParams,
-                              ControlCommandHandler handler)
+                              const Authorization& authorization,
+                              const ValidateParameters& validateParams,
+                              const ControlCommandHandler& handler)
 {
   if (!m_topLevelPrefixes.empty()) {
     throw std::domain_error("one or more top-level prefix has been added");
diff --git a/src/mgmt/status-dataset-context.hpp b/src/mgmt/status-dataset-context.hpp
index 196a296..6a2d02a 100644
--- a/src/mgmt/status-dataset-context.hpp
+++ b/src/mgmt/status-dataset-context.hpp
@@ -35,7 +35,9 @@
 namespace ndn {
 namespace mgmt {
 
-class StatusDatasetContext
+/** \brief provides a context for generating response to a StatusDataset request
+ */
+class StatusDatasetContext : noncopyable
 {
 public:
   /** \return prefix of Data packets, with version component but without segment component
diff --git a/tests/unit-tests/mgmt/dispatcher.t.cpp b/tests/unit-tests/mgmt/dispatcher.t.cpp
index 050b927..940df6d 100644
--- a/tests/unit-tests/mgmt/dispatcher.t.cpp
+++ b/tests/unit-tests/mgmt/dispatcher.t.cpp
@@ -38,7 +38,8 @@
 
 using namespace ndn::tests;
 
-BOOST_AUTO_TEST_SUITE(MgmtDispatcher)
+BOOST_AUTO_TEST_SUITE(Mgmt)
+BOOST_AUTO_TEST_SUITE(TestDispatcher)
 
 class DispatcherFixture : public UnitTestTimeFixture
                         , public security::IdentityManagementFixture
@@ -255,7 +256,7 @@
   dispatcher.addStatusDataset("test/small",
                               makeTestAuthorization(),
                               [] (const Name& prefix, const Interest& interest,
-                                  StatusDatasetContext context) {
+                                  StatusDatasetContext& context) {
                                 context.append(smallBlock);
                                 context.append(smallBlock);
                                 context.append(smallBlock);
@@ -265,7 +266,7 @@
   dispatcher.addStatusDataset("test/large",
                               makeTestAuthorization(),
                               [] (const Name& prefix, const Interest& interest,
-                                  StatusDatasetContext context) {
+                                  StatusDatasetContext& context) {
                                 context.append(largeBlock);
                                 context.append(largeBlock);
                                 context.append(largeBlock);
@@ -275,7 +276,7 @@
   dispatcher.addStatusDataset("test/reject",
                               makeTestAuthorization(),
                               [] (const Name& prefix, const Interest& interest,
-                                  StatusDatasetContext context) {
+                                  StatusDatasetContext& context) {
                                 context.reject();
                               });
 
@@ -380,6 +381,7 @@
 }
 
 BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
 } // namespace mgmt
