diff --git a/tests/daemon/mgmt/cs-manager.t.cpp b/tests/daemon/mgmt/cs-manager.t.cpp
index d56b3d6..b4fe051 100644
--- a/tests/daemon/mgmt/cs-manager.t.cpp
+++ b/tests/daemon/mgmt/cs-manager.t.cpp
@@ -71,8 +71,7 @@
   body.setCapacity(22129);
   body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, false, false);
   body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, true, false);
-  BOOST_CHECK_EQUAL(checkResponse(0, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // send filled cs/config command
@@ -87,8 +86,7 @@
   body.setCapacity(18609);
   body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_ADMIT, true, false);
   body.setFlagBit(CsFlagBit::BIT_CS_ENABLE_SERVE, false, false);
-  BOOST_CHECK_EQUAL(checkResponse(1, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(1, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // CS shall have updated config
@@ -119,28 +117,24 @@
   const Name cmdPrefix = Name("/localhost/nfd").append(ndn::nfd::CsEraseCommand::getName());
 
   // requested Name matches no Data
-  auto req = makeControlCommandRequest(cmdPrefix,
-    ControlParameters().setName("/A").setCount(1));
+  auto req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/A").setCount(1));
   receiveInterest(req);
 
   // response should include zero as actual Count
   ControlParameters body;
   body.setName("/A");
   body.setCount(0);
-  BOOST_CHECK_EQUAL(checkResponse(0, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // requested Count is less than erase limit
-  req = makeControlCommandRequest(cmdPrefix,
-    ControlParameters().setName("/B").setCount(3));
+  req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/B").setCount(3));
   receiveInterest(req);
 
   // response should include actual Count and omit Capacity
   body.setName("/B");
   body.setCount(3);
-  BOOST_CHECK_EQUAL(checkResponse(1, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(1, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // requested Count equals erase limit
@@ -151,8 +145,7 @@
   // response should include actual Count and omit Capacity
   body.setName("/E");
   body.setCount(CsManager::ERASE_LIMIT - 1);
-  BOOST_CHECK_EQUAL(checkResponse(2, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(2, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // requested Count exceeds erase limit, but there are no more Data
@@ -163,8 +156,7 @@
   // response should include actual Count and omit Capacity
   body.setName("/F");
   body.setCount(CsManager::ERASE_LIMIT);
-  BOOST_CHECK_EQUAL(checkResponse(3, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(3, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // requested Count exceeds erase limit, and there are more Data
@@ -176,21 +168,18 @@
   body.setName("/G");
   body.setCount(CsManager::ERASE_LIMIT);
   body.setCapacity(CsManager::ERASE_LIMIT);
-  BOOST_CHECK_EQUAL(checkResponse(4, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(4, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // request omit Count, which implies "no limit" aka exceeds erase limit
-  req = makeControlCommandRequest(cmdPrefix,
-    ControlParameters().setName("/H"));
+  req = makeControlCommandRequest(cmdPrefix, ControlParameters().setName("/H"));
   receiveInterest(req);
 
   // response should include both actual Count and Capacity since there are more Data
   body.setName("/H");
   body.setCount(CsManager::ERASE_LIMIT);
   body.setCapacity(CsManager::ERASE_LIMIT);
-  BOOST_CHECK_EQUAL(checkResponse(5, req.getName(),
-                                  ControlResponse(200, "OK").setBody(body.wireEncode())),
+  BOOST_CHECK_EQUAL(checkResponse(5, req.getName(), makeResponse(200, "OK", body)),
                     CheckResponseResult::OK);
 
   // one Data each under /A, /G, /H remain, all other Data are erased
diff --git a/tests/daemon/mgmt/face-manager-create-face.t.cpp b/tests/daemon/mgmt/face-manager-create-face.t.cpp
index 31c4bf1..45e70d2 100644
--- a/tests/daemon/mgmt/face-manager-create-face.t.cpp
+++ b/tests/daemon/mgmt/face-manager-create-face.t.cpp
@@ -117,7 +117,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true);
   }
 };
@@ -130,7 +129,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, false);
   }
 };
@@ -143,7 +141,6 @@
   {
     return ControlParameters()
       .setUri("udp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, true);
   }
 };
@@ -156,7 +153,6 @@
   {
     return ControlParameters()
       .setUri("udp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, false);
   }
 };
@@ -169,7 +165,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true);
   }
 };
@@ -182,7 +177,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, false);
   }
 };
@@ -195,7 +189,6 @@
   {
     return ControlParameters()
       .setUri("udp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, true);
   }
 };
@@ -208,7 +201,6 @@
   {
     return ControlParameters()
       .setUri("udp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, false);
   }
 };
@@ -221,7 +213,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setBaseCongestionMarkingInterval(50_ms)
       .setDefaultCongestionThreshold(1000)
       .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true);
@@ -236,7 +227,34 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
+      .setBaseCongestionMarkingInterval(50_ms)
+      .setDefaultCongestionThreshold(1000)
+      .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false);
+  }
+};
+
+class UdpFaceCongestionMarkingEnabled
+{
+public:
+  static ControlParameters
+  getParameters()
+  {
+    return ControlParameters()
+      .setUri("udp4://127.0.0.1:26363")
+      .setBaseCongestionMarkingInterval(50_ms)
+      .setDefaultCongestionThreshold(1000)
+      .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, true);
+  }
+};
+
+class UdpFaceCongestionMarkingDisabled
+{
+public:
+  static ControlParameters
+  getParameters()
+  {
+    return ControlParameters()
+      .setUri("udp4://127.0.0.1:26363")
       .setBaseCongestionMarkingInterval(50_ms)
       .setDefaultCongestionThreshold(1000)
       .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false);
@@ -251,7 +269,6 @@
   {
     return ControlParameters()
       .setUri("tcp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setMtu(1000);
   }
 };
@@ -264,12 +281,11 @@
   {
     return ControlParameters()
       .setUri("udp4://127.0.0.1:26363")
-      .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT)
       .setMtu(1000);
   }
 };
 
-class FaceUriMalformed
+class RemoteUriMalformed
 {
 public:
   static ControlParameters
@@ -280,7 +296,7 @@
   }
 };
 
-class FaceUriNonCanonical
+class RemoteUriNonCanonical
 {
 public:
   static ControlParameters
@@ -291,7 +307,43 @@
   }
 };
 
-class FaceUriUnsupportedScheme
+class LocalUriMalformed
+{
+public:
+  static ControlParameters
+  getParameters()
+  {
+    return ControlParameters()
+      .setUri("udp4://127.0.0.1:26363")
+      .setLocalUri("udp4://127.0.0.1:not-a-port");
+  }
+};
+
+class LocalUriNonCanonical
+{
+public:
+  static ControlParameters
+  getParameters()
+  {
+    return ControlParameters()
+      .setUri("udp4://127.0.0.1:26363")
+      .setLocalUri("udp://localhost");
+  }
+};
+
+class LocalUriUnsupported
+{
+public:
+  static ControlParameters
+  getParameters()
+  {
+    return ControlParameters()
+      .setUri("udp4://127.0.0.1:26363")
+      .setLocalUri("udp4://127.0.0.1:36363");
+  }
+};
+
+class UnsupportedProtocol
 {
 public:
   static ControlParameters
@@ -302,7 +354,7 @@
   }
 };
 
-// Pairs of CreateCommand and success/failure status
+// Pairs of FaceCreateCommand request and success/failure response
 using TestCases = boost::mp11::mp_list<
   boost::mp11::mp_list<TcpFaceOnDemand, CommandFailure<406>>,
   boost::mp11::mp_list<TcpFacePersistent, CommandSuccess>,
@@ -320,19 +372,24 @@
   boost::mp11::mp_list<UdpFaceLpReliabilityDisabled, CommandSuccess>,
   boost::mp11::mp_list<TcpFaceCongestionMarkingEnabled, CommandSuccess>,
   boost::mp11::mp_list<TcpFaceCongestionMarkingDisabled, CommandSuccess>,
+  boost::mp11::mp_list<UdpFaceCongestionMarkingEnabled, CommandSuccess>,
+  boost::mp11::mp_list<UdpFaceCongestionMarkingDisabled, CommandSuccess>,
   boost::mp11::mp_list<TcpFaceMtuOverride, CommandFailure<406>>,
   boost::mp11::mp_list<UdpFaceMtuOverride, CommandSuccess>,
-  boost::mp11::mp_list<FaceUriMalformed, CommandFailure<400>>,
-  boost::mp11::mp_list<FaceUriNonCanonical, CommandFailure<400>>,
-  boost::mp11::mp_list<FaceUriUnsupportedScheme, CommandFailure<406>>
+  boost::mp11::mp_list<RemoteUriMalformed, CommandFailure<400>>,
+  boost::mp11::mp_list<RemoteUriNonCanonical, CommandFailure<400>>,
+  boost::mp11::mp_list<LocalUriMalformed, CommandFailure<400>>,
+  boost::mp11::mp_list<LocalUriNonCanonical, CommandFailure<400>>,
+  boost::mp11::mp_list<LocalUriUnsupported, CommandFailure<406>>,
+  boost::mp11::mp_list<UnsupportedProtocol, CommandFailure<406>>
 >;
 
 BOOST_FIXTURE_TEST_CASE_TEMPLATE(NewFace, T, TestCases, FaceManagerCommandFixture)
 {
-  using FaceType = boost::mp11::mp_first<T>;
+  using CreateRequest = boost::mp11::mp_first<T>;
   using CreateResult = boost::mp11::mp_second<T>;
 
-  Interest req = makeControlCommandRequest(this->CREATE_REQUEST, FaceType::getParameters());
+  Interest req = makeControlCommandRequest(this->CREATE_REQUEST, CreateRequest::getParameters());
 
   bool hasCallbackFired = false;
   this->node1.face.onSendData.connect([this, req, &hasCallbackFired] (const Data& response) {
@@ -342,15 +399,18 @@
 
     ControlResponse actual(response.getContent().blockFromValue());
     ControlResponse expected(CreateResult::getExpected());
-    BOOST_TEST_MESSAGE(actual.getText());
-    BOOST_CHECK_EQUAL(expected.getCode(), actual.getCode());
+    BOOST_TEST(expected.getCode() == actual.getCode(), actual.getText());
 
     if (actual.getBody().hasWire()) {
-      ControlParameters expectedParams(FaceType::getParameters());
+      ControlParameters expectedParams(CreateRequest::getParameters());
+      ndn::nfd::FaceCreateCommand::applyDefaultsToRequest(expectedParams);
       ControlParameters actualParams(actual.getBody());
 
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK_EQUAL(expectedParams.getFacePersistency(), actualParams.getFacePersistency());
+      BOOST_TEST(actualParams.hasFaceId());
+      BOOST_TEST(expectedParams.getUri() == actualParams.getUri());
+      BOOST_TEST(actualParams.hasLocalUri());
+      BOOST_TEST(actualParams.hasFlags());
+      BOOST_TEST(expectedParams.getFacePersistency() == actualParams.getFacePersistency());
 
       if (actual.getCode() == 200) {
         if (expectedParams.hasFlags()) {
@@ -363,15 +423,16 @@
                               actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
           }
           else {
-            BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+            // congestion marking is enabled by default
+            BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
           }
         }
         else {
-          // local fields and LpReliability are disabled by default, congestion marking is enabled
-          // by default on TCP, UDP, and Unix stream
-          BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
-          BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
-          BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
+          // local fields and reliability are disabled by default
+          // congestion marking is enabled by default on TCP, UDP, and Unix stream
+          BOOST_TEST(!actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
+          BOOST_TEST(!actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
+          BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
         }
 
         if (expectedParams.hasBaseCongestionMarkingInterval()) {
@@ -394,14 +455,11 @@
           BOOST_CHECK_EQUAL(expectedParams.getMtu(), actualParams.getMtu());
         }
       }
-      else {
-        BOOST_CHECK_EQUAL(expectedParams.getUri(), actualParams.getUri());
-      }
     }
 
     if (actual.getCode() != 200) {
       FaceUri uri;
-      if (uri.parse(FaceType::getParameters().getUri())) {
+      if (uri.parse(CreateRequest::getParameters().getUri())) {
         // ensure face not created
         const auto& faceTable = this->node1.faceTable;
         BOOST_CHECK(std::none_of(faceTable.begin(), faceTable.end(), [uri] (Face& face) {
@@ -419,7 +477,7 @@
   this->node1.face.receive(req);
   this->advanceClocks(1_ms, 10);
 
-  BOOST_CHECK(hasCallbackFired);
+  BOOST_TEST(hasCallbackFired);
 }
 
 BOOST_FIXTURE_TEST_CASE(ExistingFace, FaceManagerCommandFixture)
@@ -435,7 +493,7 @@
 
   // find the created face
   auto foundFace = this->node1.findFaceByUri(FaceType::getParameters().getUri());
-  BOOST_REQUIRE(foundFace != nullptr);
+  BOOST_TEST_REQUIRE(foundFace != nullptr);
 
   {
     // re-create face
@@ -467,7 +525,7 @@
     this->node1.face.receive(req);
     this->advanceClocks(1_ms, 10);
 
-    BOOST_CHECK(hasCallbackFired);
+    BOOST_TEST(hasCallbackFired);
   }
 }
 
diff --git a/tests/daemon/mgmt/face-manager-update-face.t.cpp b/tests/daemon/mgmt/face-manager-update-face.t.cpp
index 7ccc9f2..202e360 100644
--- a/tests/daemon/mgmt/face-manager-update-face.t.cpp
+++ b/tests/daemon/mgmt/face-manager-update-face.t.cpp
@@ -88,28 +88,25 @@
     FaceManagerCommandNode& target = isForOnDemandFace ? this->node2 : this->node1;
 
     bool hasCallbackFired = false;
-    signal::ScopedConnection connection = target.face.onSendData.connect(
-      [&, req, isForOnDemandFace, this] (const Data& response) {
-        if (!req.getName().isPrefixOf(response.getName())) {
-          return;
-        }
+    signal::ScopedConnection conn = target.face.onSendData.connect([&] (const Data& response) {
+      if (!req.getName().isPrefixOf(response.getName())) {
+        return;
+      }
 
-        ControlResponse create(response.getContent().blockFromValue());
-        BOOST_REQUIRE_EQUAL(create.getCode(), 200);
-        BOOST_REQUIRE(create.getBody().hasWire());
+      ControlResponse create(response.getContent().blockFromValue());
+      BOOST_TEST_REQUIRE(create.getCode() == 200);
+      ControlParameters faceParams(create.getBody());
+      BOOST_TEST_REQUIRE(faceParams.hasFaceId());
+      this->faceId = faceParams.getFaceId();
 
-        ControlParameters faceParams(create.getBody());
-        BOOST_REQUIRE(faceParams.hasFaceId());
-        this->faceId = faceParams.getFaceId();
+      hasCallbackFired = true;
 
-        hasCallbackFired = true;
-
-        if (isForOnDemandFace) {
-          auto face = target.faceTable.get(static_cast<FaceId>(this->faceId));
-          // to force creation of on-demand face
-          face->sendInterest(*makeInterest("/hello/world"));
-        }
-      });
+      if (isForOnDemandFace) {
+        auto face = target.faceTable.get(this->faceId);
+        // to force creation of on-demand face
+        face->sendInterest(*makeInterest("/hello/world"));
+      }
+    });
 
     target.face.receive(req);
     advanceClocks(1_ms, 10);
@@ -119,12 +116,11 @@
       advanceClocks(1_ms, 10); // let node1 accept Interest and create on-demand face
     }
 
-    BOOST_REQUIRE(hasCallbackFired);
+    BOOST_TEST_REQUIRE(hasCallbackFired);
   }
 
   void
-  updateFace(const ControlParameters& requestParams,
-             bool isSelfUpdating,
+  updateFace(const ControlParameters& requestParams, bool isSelfUpdating,
              const std::function<void(const ControlResponse& resp)>& checkResp)
   {
     Interest req = makeControlCommandRequest(UPDATE_REQUEST, requestParams);
@@ -134,21 +130,20 @@
     }
 
     bool hasCallbackFired = false;
-    signal::ScopedConnection connection = this->node1.face.onSendData.connect(
-      [req, &hasCallbackFired, &checkResp] (const Data& response) {
-        if (!req.getName().isPrefixOf(response.getName())) {
-          return;
-        }
+    signal::ScopedConnection conn = node1.face.onSendData.connect([&] (const Data& response) {
+      if (!req.getName().isPrefixOf(response.getName())) {
+        return;
+      }
 
-        ControlResponse actual(response.getContent().blockFromValue());
-        checkResp(actual);
+      ControlResponse actual(response.getContent().blockFromValue());
+      checkResp(actual);
 
-        hasCallbackFired = true;
-      });
+      hasCallbackFired = true;
+    });
 
     this->node1.face.receive(req);
     advanceClocks(1_ms, 10);
-    BOOST_REQUIRE(hasCallbackFired);
+    BOOST_TEST_REQUIRE(hasCallbackFired);
   }
 
 private:
@@ -164,22 +159,21 @@
     Interest req = makeControlCommandRequest(DESTROY_REQUEST, params);
 
     bool hasCallbackFired = false;
-    signal::ScopedConnection connection = this->node1.face.onSendData.connect(
-      [this, req, &hasCallbackFired] (const Data& response) {
-        if (!req.getName().isPrefixOf(response.getName())) {
-          return;
-        }
+    signal::ScopedConnection conn = node1.face.onSendData.connect([&] (const Data& response) {
+      if (!req.getName().isPrefixOf(response.getName())) {
+        return;
+      }
 
-        ControlResponse destroy(response.getContent().blockFromValue());
-        BOOST_CHECK_EQUAL(destroy.getCode(), 200);
+      ControlResponse destroy(response.getContent().blockFromValue());
+      BOOST_CHECK_EQUAL(destroy.getCode(), 200);
 
-        faceId = 0;
-        hasCallbackFired = true;
-      });
+      faceId = 0;
+      hasCallbackFired = true;
+    });
 
     this->node1.face.receive(req);
     advanceClocks(1_ms, 10);
-    BOOST_REQUIRE(hasCallbackFired);
+    BOOST_TEST_REQUIRE(hasCallbackFired);
   }
 
 protected:
@@ -194,9 +188,8 @@
   requestParams.setFaceId(65535);
 
   updateFace(requestParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(404, "Specified face does not exist");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 404);
+    BOOST_TEST(actual.getText() == "Specified face does not exist");
   });
 }
 
@@ -219,15 +212,11 @@
     .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
 
   updateFace(parameters, false, [] (const ControlResponse& actual) {
-      BOOST_TEST_MESSAGE(actual.getText());
-      BOOST_CHECK_EQUAL(actual.getCode(), ResultType::getExpected().getCode());
+    BOOST_TEST(actual.getCode() == ResultType::getExpected().getCode(), actual.getText());
 
-      // the response for either 200 or 409 will have a content body
-      BOOST_REQUIRE(actual.getBody().hasWire());
-
-      ControlParameters resp;
-      resp.wireDecode(actual.getBody());
-      BOOST_CHECK_EQUAL(resp.getFacePersistency(), ndn::nfd::FACE_PERSISTENCY_PERMANENT);
+    // the response for either 200 or 409 will have a content body
+    ControlParameters resp(actual.getBody());
+    BOOST_CHECK_EQUAL(resp.getFacePersistency(), ndn::nfd::FACE_PERSISTENCY_PERMANENT);
   });
 }
 
@@ -244,37 +233,24 @@
   mtuTooLow.setMtu(63);
 
   updateFace(validParams, false, [] (const ControlResponse& actual) {
-    BOOST_CHECK_EQUAL(actual.getCode(), 200);
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_REQUIRE(actualParams.hasMtu());
-      // Check for changed MTU
-      BOOST_CHECK_EQUAL(actualParams.getMtu(), 4000);
-    }
-    else {
-      BOOST_ERROR("Valid: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST_REQUIRE(actualParams.hasMtu());
+    // Check for changed MTU
+    BOOST_CHECK_EQUAL(actualParams.getMtu(), 4000);
   });
 
   updateFace(mtuTooLow, false, [] (const ControlResponse& actual) {
-    BOOST_CHECK_EQUAL(actual.getCode(), 409);
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 409);
+    BOOST_TEST(actual.getText() == "Invalid properties specified");
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(!actualParams.hasFaceId());
-      BOOST_REQUIRE(actualParams.hasMtu());
-      // Check for returned invalid parameter
-      BOOST_CHECK_EQUAL(actualParams.getMtu(), 63);
-    }
-    else {
-      BOOST_ERROR("Too low: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(!actualParams.hasFaceId());
+    BOOST_TEST_REQUIRE(actualParams.hasMtu());
+    // Check for returned invalid parameter
+    BOOST_CHECK_EQUAL(actualParams.getMtu(), 63);
   });
 }
 
@@ -287,231 +263,62 @@
   updateParams.setMtu(4000);
 
   updateFace(updateParams, false, [] (const ControlResponse& actual) {
-    BOOST_CHECK_EQUAL(actual.getCode(), 409);
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 409);
+    BOOST_TEST(actual.getText() == "Invalid properties specified");
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(!actualParams.hasFaceId());
-      BOOST_REQUIRE(actualParams.hasMtu());
-      // Check for returned invalid parameter
-      BOOST_CHECK_EQUAL(actualParams.getMtu(), 4000);
-    }
-    else {
-      BOOST_ERROR("Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(!actualParams.hasFaceId());
+    BOOST_TEST_REQUIRE(actualParams.hasMtu());
+    // Check for returned invalid parameter
+    BOOST_CHECK_EQUAL(actualParams.getMtu(), 4000);
   });
 }
 
-class TcpLocalFieldsEnable
+template<bool EnableLocalFields>
+struct TcpLocalFields
 {
-public:
-  static std::string
-  getUri()
-  {
-    return "tcp4://127.0.0.1:26363";
-  }
-
-  static constexpr ndn::nfd::FacePersistency
-  getPersistency()
-  {
-    return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
-  }
-
-  static constexpr bool
-  getInitLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabled()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabledMask()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  shouldHaveWire()
-  {
-    return false;
-  }
+  static inline const std::string uri = "tcp4://127.0.0.1:26363";
+  static constexpr bool localFieldsInit = !EnableLocalFields;
+  static constexpr bool localFieldsEnabled = EnableLocalFields;
+  static constexpr bool mask = true;
+  static constexpr bool shouldHaveBody = false;
 };
 
-class TcpLocalFieldsDisable
+// UDP faces are non-local by definition.
+struct UdpLocalFieldsEnable
 {
-public:
-  static std::string
-  getUri()
-  {
-    return "tcp4://127.0.0.1:26363";
-  }
-
-  static constexpr ndn::nfd::FacePersistency
-  getPersistency()
-  {
-    return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
-  }
-
-  static constexpr bool
-  getInitLocalFieldsEnabled()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabledMask()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  shouldHaveWire()
-  {
-    return false;
-  }
+  static inline const std::string uri = "udp4://127.0.0.1:26363";
+  static constexpr bool localFieldsInit = false;
+  static constexpr bool localFieldsEnabled = true;
+  static constexpr bool mask = true;
+  static constexpr bool shouldHaveBody = true;
 };
 
-// UDP faces are non-local by definition
-class UdpLocalFieldsEnable
+// UDP faces are non-local by definition.
+// In this test case, attempt to disable local fields on face with local fields already disabled.
+struct UdpLocalFieldsDisable
 {
-public:
-  static std::string
-  getUri()
-  {
-    return "udp4://127.0.0.1:26363";
-  }
-
-  static constexpr ndn::nfd::FacePersistency
-  getPersistency()
-  {
-    return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
-  }
-
-  static constexpr bool
-  getInitLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabled()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabledMask()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  shouldHaveWire()
-  {
-    return true;
-  }
-};
-
-// UDP faces are non-local by definition
-// In this test case, attempt to disable local fields on face with local fields already disabled
-class UdpLocalFieldsDisable
-{
-public:
-  static std::string
-  getUri()
-  {
-    return "udp4://127.0.0.1:26363";
-  }
-
-  static constexpr ndn::nfd::FacePersistency
-  getPersistency()
-  {
-    return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
-  }
-
-  static constexpr bool
-  getInitLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabledMask()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  shouldHaveWire()
-  {
-    return false;
-  }
+  static inline const std::string uri = "udp4://127.0.0.1:26363";
+  static constexpr bool localFieldsInit = false;
+  static constexpr bool localFieldsEnabled = false;
+  static constexpr bool mask = true;
+  static constexpr bool shouldHaveBody = false;
 };
 
 // In this test case, set Flags to enable local fields on non-local face, but exclude local fields
 // from Mask. This test case will pass as no action is taken due to the missing Mask bit.
-class UdpLocalFieldsEnableNoMaskBit
+struct UdpLocalFieldsEnableNoMaskBit
 {
-public:
-  static std::string
-  getUri()
-  {
-    return "udp4://127.0.0.1:26363";
-  }
-
-  static constexpr ndn::nfd::FacePersistency
-  getPersistency()
-  {
-    return ndn::nfd::FACE_PERSISTENCY_PERSISTENT;
-  }
-
-  static constexpr bool
-  getInitLocalFieldsEnabled()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabled()
-  {
-    return true;
-  }
-
-  static constexpr bool
-  getLocalFieldsEnabledMask()
-  {
-    return false;
-  }
-
-  static constexpr bool
-  shouldHaveWire()
-  {
-    return false;
-  }
+  static inline const std::string uri = "udp4://127.0.0.1:26363";
+  static constexpr bool localFieldsInit = false;
+  static constexpr bool localFieldsEnabled = true;
+  static constexpr bool mask = false;
+  static constexpr bool shouldHaveBody = false;
 };
 
 using LocalFieldFaces = boost::mp11::mp_list<
-  boost::mp11::mp_list<TcpLocalFieldsEnable, CommandSuccess>,
-  boost::mp11::mp_list<TcpLocalFieldsDisable, CommandSuccess>,
+  boost::mp11::mp_list<TcpLocalFields<true>, CommandSuccess>,
+  boost::mp11::mp_list<TcpLocalFields<false>, CommandSuccess>,
   boost::mp11::mp_list<UdpLocalFieldsEnable, CommandFailure<409>>,
   boost::mp11::mp_list<UdpLocalFieldsDisable, CommandSuccess>,
   boost::mp11::mp_list<UdpLocalFieldsEnableNoMaskBit, CommandSuccess>
@@ -522,28 +329,24 @@
   using TestType = boost::mp11::mp_first<T>;
   using ResultType = boost::mp11::mp_second<T>;
 
-  createFace(TestType::getUri(), TestType::getPersistency(), {}, {},
-             TestType::getInitLocalFieldsEnabled());
+  createFace(TestType::uri, ndn::nfd::FACE_PERSISTENCY_PERSISTENT, {}, {}, TestType::localFieldsInit);
 
   ControlParameters requestParams;
   requestParams.setFaceId(faceId);
-  requestParams.setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, TestType::getLocalFieldsEnabled());
-  if (!TestType::getLocalFieldsEnabledMask()) {
+  requestParams.setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, TestType::localFieldsEnabled);
+  if constexpr (!TestType::mask) {
     requestParams.unsetFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED);
   }
 
   updateFace(requestParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(ResultType::getExpected());
-    BOOST_TEST_MESSAGE(actual.getText());
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
+    BOOST_TEST(actual.getCode() == ResultType::getExpected().getCode(), actual.getText());
 
-    if (TestType::shouldHaveWire() && actual.getBody().hasWire()) {
+    if constexpr (TestType::shouldHaveBody) {
       ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(!actualParams.hasFacePersistency());
-      BOOST_CHECK(actualParams.hasFlags());
-      BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
-      BOOST_CHECK(actualParams.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
+      BOOST_TEST(!actualParams.hasFacePersistency());
+      BOOST_TEST(actualParams.hasFlags());
+      BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
+      BOOST_TEST(actualParams.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
     }
   });
 }
@@ -561,41 +364,25 @@
   disableParams.setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, false);
 
   updateFace(enableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate local fields enabled
-      BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Enable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate local fields enabled
+    BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
   });
 
   updateFace(disableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate local fields disabled
-      BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Disable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate local fields disabled
+    BOOST_TEST(!actualParams.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED));
   });
 }
 
@@ -612,41 +399,25 @@
   disableParams.setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, false);
 
   updateFace(enableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate reliability enabled
-      BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Enable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate reliability enabled
+    BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
   });
 
   updateFace(disableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate reliability disabled
-      BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Disable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate reliability disabled
+    BOOST_TEST(!actualParams.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED));
   });
 }
 
@@ -667,51 +438,35 @@
   disableParams.setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, false);
 
   updateFace(enableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      // Check that congestion marking parameters changed
-      BOOST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
-      BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), 50_ms);
-      BOOST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
-      BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 10000);
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate congestion marking enabled
-      BOOST_CHECK(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Enable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    // Check that congestion marking parameters changed
+    BOOST_TEST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
+    BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), 50_ms);
+    BOOST_TEST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
+    BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 10000);
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate congestion marking enabled
+    BOOST_TEST(actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
   });
 
   updateFace(disableParams, false, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_CHECK_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
 
-    if (actual.getBody().hasWire()) {
-      ControlParameters actualParams(actual.getBody());
-
-      BOOST_CHECK(actualParams.hasFaceId());
-      BOOST_CHECK(actualParams.hasFacePersistency());
-      // Check that congestion marking parameters changed, even though feature disabled
-      BOOST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
-      BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), 70_ms);
-      BOOST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
-      BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 5000);
-      BOOST_REQUIRE(actualParams.hasFlags());
-      // Check if flags indicate marking disabled
-      BOOST_CHECK(!actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
-    }
-    else {
-      BOOST_ERROR("Disable: Response does not contain ControlParameters");
-    }
+    ControlParameters actualParams(actual.getBody());
+    BOOST_TEST(actualParams.hasFaceId());
+    BOOST_TEST(actualParams.hasFacePersistency());
+    // Check that congestion marking parameters changed, even though feature disabled
+    BOOST_TEST_REQUIRE(actualParams.hasBaseCongestionMarkingInterval());
+    BOOST_CHECK_EQUAL(actualParams.getBaseCongestionMarkingInterval(), 70_ms);
+    BOOST_TEST_REQUIRE(actualParams.hasDefaultCongestionThreshold());
+    BOOST_CHECK_EQUAL(actualParams.getDefaultCongestionThreshold(), 5000);
+    BOOST_TEST_REQUIRE(actualParams.hasFlags());
+    // Check if flags indicate marking disabled
+    BOOST_TEST(!actualParams.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED));
   });
 }
 
@@ -719,13 +474,18 @@
 {
   createFace();
 
-  // Send a command that does nothing (will return 200) and does not contain a FaceId
+  // Send a command that does nothing and does not contain a FaceId
   ControlParameters sentParams;
 
+  // Success case: FaceId is obtained automatically from IncomingFaceIdTag
   updateFace(sentParams, true, [] (const ControlResponse& actual) {
-    ControlResponse expected(200, "OK");
-    BOOST_REQUIRE_EQUAL(actual.getCode(), expected.getCode());
-    BOOST_TEST_MESSAGE(actual.getText());
+    BOOST_TEST(actual.getCode() == 200, actual.getText());
+  });
+
+  // Error case: IncomingFaceIdTag is missing
+  updateFace(sentParams, false, [] (const ControlResponse& actual) {
+    BOOST_TEST(actual.getCode() == 404);
+    BOOST_TEST(actual.getText() == "No FaceId specified and IncomingFaceId not available");
   });
 }
 
diff --git a/tests/daemon/mgmt/face-manager.t.cpp b/tests/daemon/mgmt/face-manager.t.cpp
index b0ad678..6d25143 100644
--- a/tests/daemon/mgmt/face-manager.t.cpp
+++ b/tests/daemon/mgmt/face-manager.t.cpp
@@ -43,7 +43,7 @@
 
 class FaceManagerFixture : public ManagerFixtureWithAuthenticator
 {
-public:
+protected:
   FaceManagerFixture()
     : m_faceSystem(m_faceTable, make_shared<ndn::net::NetworkMonitorStub>(0))
     , m_manager(m_faceSystem, m_dispatcher, *m_authenticator)
@@ -52,32 +52,20 @@
     setPrivilege("faces");
   }
 
-public:
   enum AddFaceFlags {
     REMOVE_LAST_NOTIFICATION = 1 << 0,
-    SET_SCOPE_LOCAL          = 1 << 1,
-    SET_URI_TEST             = 1 << 2,
-    RANDOMIZE_COUNTERS       = 1 << 3,
+    RANDOMIZE_COUNTERS       = 1 << 1,
   };
 
   /**
    * \brief Adds a face to the FaceTable.
    * \param flags bitwise OR'ed AddFaceFlags
    */
+  template<typename... Args>
   shared_ptr<Face>
-  addFace(unsigned int flags = 0)
+  addFace(unsigned int flags = 0, Args&&... args)
   {
-    std::string uri = "dummy://";
-    ndn::nfd::FaceScope scope = ndn::nfd::FACE_SCOPE_NON_LOCAL;
-
-    if (flags & SET_SCOPE_LOCAL) {
-      scope = ndn::nfd::FACE_SCOPE_LOCAL;
-    }
-    if (flags & SET_URI_TEST) {
-      uri = "test://";
-    }
-
-    auto face = make_shared<DummyFace>(uri, uri, scope);
+    auto face = make_shared<DummyFace>(std::forward<Args>(args)...);
     m_faceTable.add(face);
 
     if (flags & RANDOMIZE_COUNTERS) {
@@ -96,7 +84,7 @@
 
     advanceClocks(1_ms, 10); // wait for notification posted
     if (flags & REMOVE_LAST_NOTIFICATION) {
-      BOOST_REQUIRE(!m_responses.empty());
+      BOOST_TEST_REQUIRE(!m_responses.empty());
       m_responses.pop_back();
     }
 
@@ -124,7 +112,7 @@
 
 BOOST_AUTO_TEST_CASE(Existing)
 {
-  auto addedFace = addFace(REMOVE_LAST_NOTIFICATION | SET_SCOPE_LOCAL); // clear notification for creation
+  auto addedFace = addFace(REMOVE_LAST_NOTIFICATION); // clear notification for creation
 
   auto parameters = ControlParameters().setFaceId(addedFace->getId());
   auto req = makeControlCommandRequest(FaceManagerCommandFixture::DESTROY_REQUEST, parameters);
@@ -158,7 +146,7 @@
 {
   const size_t nEntries = 32;
   for (size_t i = 0; i < nEntries; ++i) {
-    addFace(REMOVE_LAST_NOTIFICATION | SET_URI_TEST | RANDOMIZE_COUNTERS);
+    addFace(REMOVE_LAST_NOTIFICATION | RANDOMIZE_COUNTERS, "test://", "test://");
   }
 
   receiveInterest(Interest("/localhost/nfd/faces/list").setCanBePrefix(true));
@@ -167,9 +155,9 @@
   content.parse();
   BOOST_REQUIRE_EQUAL(content.elements().size(), nEntries);
 
-  std::set<FaceId> faceIds;
-  for (size_t idx = 0; idx < nEntries; ++idx) {
-    ndn::nfd::FaceStatus decodedStatus(content.elements()[idx]);
+  std::unordered_set<FaceId> faceIds;
+  for (const auto& el : content.elements()) {
+    ndn::nfd::FaceStatus decodedStatus(el);
     BOOST_TEST_INFO_SCOPE(decodedStatus);
     BOOST_CHECK(m_faceTable.get(decodedStatus.getFaceId()) != nullptr);
     faceIds.insert(decodedStatus.getFaceId());
@@ -178,16 +166,15 @@
 
   ndn::nfd::FaceStatus status(content.elements().front());
   const Face* face = m_faceTable.get(status.getFaceId());
-  BOOST_REQUIRE(face != nullptr);
+  BOOST_TEST_REQUIRE(face != nullptr);
 
   // check face properties
   BOOST_CHECK_EQUAL(status.getRemoteUri(), face->getRemoteUri().toString());
   BOOST_CHECK_EQUAL(status.getLocalUri(), face->getLocalUri().toString());
-  BOOST_CHECK_EQUAL(status.hasExpirationPeriod(),
-                    face->getExpirationTime() != time::steady_clock::time_point::max());
-  BOOST_CHECK_EQUAL(status.getFaceScope(), face->getScope());
-  BOOST_CHECK_EQUAL(status.getFacePersistency(), face->getPersistency());
-  BOOST_CHECK_EQUAL(status.getLinkType(), face->getLinkType());
+  BOOST_TEST(!status.hasExpirationPeriod());
+  BOOST_CHECK_EQUAL(status.getFaceScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL);
+  BOOST_CHECK_EQUAL(status.getFacePersistency(), ndn::nfd::FACE_PERSISTENCY_PERSISTENT);
+  BOOST_CHECK_EQUAL(status.getLinkType(), ndn::nfd::LINK_TYPE_POINT_TO_POINT);
 
   // check link service properties
   BOOST_CHECK_EQUAL(status.hasBaseCongestionMarkingInterval(), false);
@@ -195,7 +182,7 @@
   BOOST_CHECK_EQUAL(status.getFlags(), 0);
 
   // check transport properties
-  BOOST_CHECK_EQUAL(status.hasMtu(), true);
+  BOOST_TEST_REQUIRE(status.hasMtu());
   BOOST_CHECK_EQUAL(status.getMtu(), ndn::MAX_NDN_PACKET_SIZE);
 
   // check counters
@@ -213,56 +200,82 @@
 {
   using ndn::nfd::FaceQueryFilter;
 
-  auto face1 = addFace(REMOVE_LAST_NOTIFICATION); // dummy://
-  auto face2 = addFace(REMOVE_LAST_NOTIFICATION | SET_SCOPE_LOCAL); // dummy://, local
-  auto face3 = addFace(REMOVE_LAST_NOTIFICATION | SET_URI_TEST); // test://
+  auto face1 = addFace(REMOVE_LAST_NOTIFICATION, "dummy://one", "dummy://one",
+                       ndn::nfd::FACE_SCOPE_NON_LOCAL,
+                       ndn::nfd::FACE_PERSISTENCY_PERSISTENT,
+                       ndn::nfd::LINK_TYPE_POINT_TO_POINT);
+  auto face2 = addFace(REMOVE_LAST_NOTIFICATION, "dummy://two", "remote://foo",
+                       ndn::nfd::FACE_SCOPE_LOCAL,
+                       ndn::nfd::FACE_PERSISTENCY_PERSISTENT,
+                       ndn::nfd::LINK_TYPE_POINT_TO_POINT);
+  auto face3 = addFace(REMOVE_LAST_NOTIFICATION, "local://bar", "remote://foo",
+                       ndn::nfd::FACE_SCOPE_NON_LOCAL,
+                       ndn::nfd::FACE_PERSISTENCY_PERMANENT,
+                       ndn::nfd::LINK_TYPE_POINT_TO_POINT);
+  auto face4 = addFace(REMOVE_LAST_NOTIFICATION, "local://bar", "dummy://four",
+                       ndn::nfd::FACE_SCOPE_NON_LOCAL,
+                       ndn::nfd::FACE_PERSISTENCY_PERSISTENT,
+                       ndn::nfd::LINK_TYPE_AD_HOC);
 
   auto generateQuery = [] (const auto& filter) {
     return Interest(Name("/localhost/nfd/faces/query").append(filter.wireEncode()))
            .setCanBePrefix(true);
   };
 
-  auto schemeQuery = generateQuery(FaceQueryFilter().setUriScheme("dummy"));
+  auto allQuery = generateQuery(FaceQueryFilter());
+  auto noneQuery = generateQuery(FaceQueryFilter().setUriScheme("nomatch"));
   auto idQuery = generateQuery(FaceQueryFilter().setFaceId(face1->getId()));
-  auto scopeQuery = generateQuery(FaceQueryFilter().setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL));
+  auto schemeQuery = generateQuery(FaceQueryFilter().setUriScheme("dummy"));
+  auto remoteQuery = generateQuery(FaceQueryFilter().setRemoteUri("remote://foo"));
+  auto localQuery = generateQuery(FaceQueryFilter().setLocalUri("local://bar"));
+  auto scopeQuery = generateQuery(FaceQueryFilter().setFaceScope(ndn::nfd::FACE_SCOPE_LOCAL));
+  auto persistencyQuery = generateQuery(FaceQueryFilter().setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT));
+  auto linkQuery = generateQuery(FaceQueryFilter().setLinkType(ndn::nfd::LINK_TYPE_AD_HOC));
   auto invalidQueryName = Name("/localhost/nfd/faces/query")
                           .append(ndn::makeStringBlock(tlv::Content, "invalid"));
   auto invalidQuery = Interest(invalidQueryName).setCanBePrefix(true);
 
-  receiveInterest(schemeQuery); // face1 and face2 expected
+  receiveInterest(allQuery); // all 4 faces expected
+  receiveInterest(noneQuery); // no faces expected
   receiveInterest(idQuery); // face1 expected
-  receiveInterest(scopeQuery); // face1 and face3 expected
+  receiveInterest(schemeQuery); // face1, face2, face4 expected
+  receiveInterest(remoteQuery); // face2 and face3 expected
+  receiveInterest(localQuery); // face3 and face4 expected
+  receiveInterest(scopeQuery); // face2 expected
+  receiveInterest(persistencyQuery); // face3 expected
+  receiveInterest(linkQuery); // face4 expected
   receiveInterest(invalidQuery); // nack expected
 
-  BOOST_REQUIRE_EQUAL(m_responses.size(), 4);
+  BOOST_REQUIRE_EQUAL(m_responses.size(), 10);
 
-  Block content;
-  ndn::nfd::FaceStatus status;
+  auto checkQueryResponse = [this] (size_t idx, const std::unordered_set<FaceId>& expected) {
+    BOOST_TEST_INFO("Response index = " << idx);
+    const Block& content = m_responses.at(idx).getContent();
+    content.parse();
+    std::unordered_set<FaceId> actual;
+    std::string actualStr;
+    for (const auto& el : content.elements()) {
+      ndn::nfd::FaceStatus status(el);
+      actual.insert(status.getFaceId());
+      actualStr += std::to_string(status.getFaceId()) + " ";
+    }
+    BOOST_TEST_INFO("Content = { " << actualStr << "}");
+    BOOST_TEST(actual == expected);
+  };
 
-  content = m_responses[0].getContent();
-  content.parse();
-  BOOST_CHECK_EQUAL(content.elements().size(), 2); // face1 and face2
-  status.wireDecode(content.elements()[0]);
-  BOOST_CHECK_EQUAL(face1->getId(), status.getFaceId());
-  status.wireDecode(content.elements()[1]);
-  BOOST_CHECK_EQUAL(face2->getId(), status.getFaceId());
+  checkQueryResponse(0, {face1->getId(), face2->getId(), face3->getId(), face4->getId()});
+  checkQueryResponse(1, {});
+  checkQueryResponse(2, {face1->getId()});
+  checkQueryResponse(3, {face1->getId(), face2->getId(), face4->getId()});
+  checkQueryResponse(4, {face2->getId(), face3->getId()});
+  checkQueryResponse(5, {face3->getId(), face4->getId()});
+  checkQueryResponse(6, {face2->getId()});
+  checkQueryResponse(7, {face3->getId()});
+  checkQueryResponse(8, {face4->getId()});
 
-  content = m_responses[1].getContent();
-  content.parse();
-  BOOST_CHECK_EQUAL(content.elements().size(), 1); // face1
-  status.wireDecode(content.elements()[0]);
-  BOOST_CHECK_EQUAL(face1->getId(), status.getFaceId());
-
-  content = m_responses[2].getContent();
-  content.parse();
-  BOOST_CHECK_EQUAL(content.elements().size(), 2); // face1 and face3
-  status.wireDecode(content.elements()[0]);
-  BOOST_CHECK_EQUAL(face1->getId(), status.getFaceId());
-  status.wireDecode(content.elements()[1]);
-  BOOST_CHECK_EQUAL(face3->getId(), status.getFaceId());
-
-  ControlResponse expectedResponse(400, "Malformed filter"); // nack, 400, malformed filter
-  BOOST_CHECK_EQUAL(checkResponse(3, invalidQueryName, expectedResponse, tlv::ContentType_Nack),
+  // nack, 400, malformed filter
+  ControlResponse expectedResponse(400, "Malformed filter");
+  BOOST_CHECK_EQUAL(checkResponse(9, invalidQueryName, expectedResponse, tlv::ContentType_Nack),
                     CheckResponseResult::OK);
 }
 
@@ -330,10 +343,10 @@
   content.parse();
   BOOST_REQUIRE_EQUAL(content.elements().size(), nEntries);
 
-  for (size_t idx = 0; idx < nEntries; ++idx) {
-    ndn::nfd::ChannelStatus decodedStatus(content.elements()[idx]);
+  for (const auto& el : content.elements()) {
+    ndn::nfd::ChannelStatus decodedStatus(el);
     BOOST_TEST_INFO_SCOPE(decodedStatus);
-    BOOST_CHECK(addedChannels.find(decodedStatus.getLocalUri()) != addedChannels.end());
+    BOOST_TEST(addedChannels.count(decodedStatus.getLocalUri()) == 1);
   }
 }
 
diff --git a/tests/daemon/mgmt/fib-manager.t.cpp b/tests/daemon/mgmt/fib-manager.t.cpp
index af03ae1..9cab78f 100644
--- a/tests/daemon/mgmt/fib-manager.t.cpp
+++ b/tests/daemon/mgmt/fib-manager.t.cpp
@@ -147,7 +147,7 @@
   case FibManagerFixture::CheckNextHopResult::WRONG_COST:
     return os << "WRONG_COST";
   }
-  return os << static_cast<int>(result);
+  return os << ndn::to_underlying(result);
 }
 
 BOOST_AUTO_TEST_SUITE(Mgmt)
@@ -422,14 +422,14 @@
   BOOST_REQUIRE_EQUAL(content.elements().size(), nEntries);
 
   std::vector<ndn::nfd::FibEntry> receivedRecords, expectedRecords;
-  for (size_t idx = 0; idx < nEntries; ++idx) {
-    ndn::nfd::FibEntry decodedEntry(content.elements()[idx]);
+  for (const auto& el : content.elements()) {
+    ndn::nfd::FibEntry decodedEntry(el);
     BOOST_TEST_INFO_SCOPE(decodedEntry);
     receivedRecords.push_back(decodedEntry);
     actualPrefixes.erase(decodedEntry.getPrefix());
 
     auto matchedEntry = m_fib.findExactMatch(decodedEntry.getPrefix());
-    BOOST_REQUIRE(matchedEntry != nullptr);
+    BOOST_TEST_REQUIRE(matchedEntry != nullptr);
 
     expectedRecords.emplace_back();
     expectedRecords.back().setPrefix(matchedEntry->getPrefix());
diff --git a/tests/daemon/mgmt/forwarder-status-manager.t.cpp b/tests/daemon/mgmt/forwarder-status-manager.t.cpp
index 56db14a..039a101 100644
--- a/tests/daemon/mgmt/forwarder-status-manager.t.cpp
+++ b/tests/daemon/mgmt/forwarder-status-manager.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2023,  Regents of the University of California,
+ * Copyright (c) 2014-2025,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -85,9 +85,8 @@
   auto afterRequest = time::system_clock::now();
 
   // verify
-  Block response = this->concatenateResponses(0, m_responses.size());
-  ndn::nfd::ForwarderStatus status;
-  BOOST_REQUIRE_NO_THROW(status.wireDecode(response));
+  Block content = concatenateResponses();
+  ndn::nfd::ForwarderStatus status(content);
 
   BOOST_CHECK_EQUAL(status.getNfdVersion(), NFD_VERSION_BUILD_STRING);
   BOOST_CHECK_EQUAL(time::toUnixTimestamp(status.getStartTimestamp()), time::toUnixTimestamp(m_startTime));
diff --git a/tests/daemon/mgmt/manager-common-fixture.cpp b/tests/daemon/mgmt/manager-common-fixture.cpp
index e918cdb..4a75983 100644
--- a/tests/daemon/mgmt/manager-common-fixture.cpp
+++ b/tests/daemon/mgmt/manager-common-fixture.cpp
@@ -29,7 +29,8 @@
 
 InterestSignerFixture::InterestSignerFixture()
 {
-  BOOST_REQUIRE(m_keyChain.createIdentity(DEFAULT_COMMAND_SIGNER_IDENTITY));
+  auto id = m_keyChain.createIdentity(DEFAULT_COMMAND_SIGNER_IDENTITY);
+  BOOST_VERIFY(id);
 }
 
 Interest
@@ -80,18 +81,11 @@
   advanceClocks(1_ms);
 }
 
-ControlResponse
-ManagerCommonFixture::makeResponse(uint32_t code, const std::string& text,
-                                   const ControlParameters& parameters)
-{
-  return ControlResponse(code, text).setBody(parameters.wireEncode());
-}
-
 ManagerCommonFixture::CheckResponseResult
 ManagerCommonFixture::checkResponse(size_t idx,
                                     const Name& expectedName,
                                     const ControlResponse& expectedResponse,
-                                    int expectedContentType /*= -1*/)
+                                    int expectedContentType)
 {
   Data data;
   try {
@@ -103,7 +97,7 @@
   }
 
   if (data.getName() != expectedName) {
-    BOOST_TEST_MESSAGE("response[" << idx << "] has wrong name " << data.getName());
+    BOOST_TEST_MESSAGE("response[" << idx << "] has wrong name " << std::quoted(data.getName().toUri()));
     return CheckResponseResult::WRONG_NAME;
   }
 
@@ -117,8 +111,8 @@
   try {
     response.wireDecode(data.getContent().blockFromValue());
   }
-  catch (const tlv::Error&) {
-    BOOST_TEST_MESSAGE("response[" << idx << "] cannot be decoded");
+  catch (const tlv::Error& e) {
+    BOOST_TEST_MESSAGE("response[" << idx << "] cannot be decoded: " << e.what());
     return CheckResponseResult::INVALID_RESPONSE;
   }
 
@@ -128,7 +122,7 @@
   }
 
   if (response.getText() != expectedResponse.getText()) {
-    BOOST_TEST_MESSAGE("response[" << idx << "] has wrong StatusText " << response.getText());
+    BOOST_TEST_MESSAGE("response[" << idx << "] has wrong StatusText " << std::quoted(response.getText()));
     return CheckResponseResult::WRONG_TEXT;
   }
 
@@ -138,7 +132,8 @@
     BOOST_TEST_MESSAGE("response[" << idx << "] has wrong body size " << body.value_size());
     return CheckResponseResult::WRONG_BODY_SIZE;
   }
-  if (body.value_size() > 0 && memcmp(body.value(), expectedBody.value(), body.value_size()) != 0) {
+
+  if (!std::equal(body.value_begin(), body.value_end(), expectedBody.value_begin())) {
     BOOST_TEST_MESSAGE("response[" << idx << "] has wrong body value");
     return CheckResponseResult::WRONG_BODY_VALUE;
   }
@@ -176,26 +171,26 @@
 operator<<(std::ostream& os, ManagerCommonFixture::CheckResponseResult result)
 {
   switch (result) {
-    case ManagerCommonFixture::CheckResponseResult::OK:
-      return os << "OK";
-    case ManagerCommonFixture::CheckResponseResult::OUT_OF_BOUNDARY:
-      return os << "OUT_OF_BOUNDARY";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_NAME:
-      return os << "WRONG_NAME";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_CONTENT_TYPE:
-      return os << "WRONG_CONTENT_TYPE";
-    case ManagerCommonFixture::CheckResponseResult::INVALID_RESPONSE:
-      return os << "INVALID_RESPONSE";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_CODE:
-      return os << "WRONG_CODE";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_TEXT:
-      return os << "WRONG_TEXT";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_SIZE:
-      return os << "WRONG_BODY_SIZE";
-    case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_VALUE:
-      return os << "WRONG_BODY_VALUE";
+  case ManagerCommonFixture::CheckResponseResult::OK:
+    return os << "OK";
+  case ManagerCommonFixture::CheckResponseResult::OUT_OF_BOUNDARY:
+    return os << "OUT_OF_BOUNDARY";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_NAME:
+    return os << "WRONG_NAME";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_CONTENT_TYPE:
+    return os << "WRONG_CONTENT_TYPE";
+  case ManagerCommonFixture::CheckResponseResult::INVALID_RESPONSE:
+    return os << "INVALID_RESPONSE";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_CODE:
+    return os << "WRONG_CODE";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_TEXT:
+    return os << "WRONG_TEXT";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_SIZE:
+    return os << "WRONG_BODY_SIZE";
+  case ManagerCommonFixture::CheckResponseResult::WRONG_BODY_VALUE:
+    return os << "WRONG_BODY_VALUE";
   }
-  return os << static_cast<int>(result);
+  return os << ndn::to_underlying(result);
 }
 
 void
diff --git a/tests/daemon/mgmt/manager-common-fixture.hpp b/tests/daemon/mgmt/manager-common-fixture.hpp
index 22d9120..a28611a 100644
--- a/tests/daemon/mgmt/manager-common-fixture.hpp
+++ b/tests/daemon/mgmt/manager-common-fixture.hpp
@@ -84,7 +84,7 @@
  */
 class ManagerCommonFixture : public InterestSignerFixture
 {
-public: // initialize
+public:
   /**
    * @brief Add `/localhost/nfd` as a top prefix to the dispatcher.
    *
@@ -93,21 +93,20 @@
   void
   setTopPrefix();
 
-public: // test
   /**
    * @brief Cause management to receive an Interest.
    *
-   * call DummyClientFace::receive to receive Interest and then call advanceClocks to ensure
-   * the Interest dispatched
-   *
-   * @param interest the Interest to receive
+   * Calls DummyClientFace::receive() to receive the Interest and then calls advanceClocks()
+   * to ensure the Interest is dispatched.
    */
   void
   receiveInterest(const Interest& interest);
 
-public: // verify
   static ControlResponse
-  makeResponse(uint32_t code, const std::string& text, const ControlParameters& parameters);
+  makeResponse(uint32_t code, const std::string& text, const ControlParameters& parameters)
+  {
+    return ControlResponse(code, text).setBody(parameters.wireEncode());
+  }
 
   enum class CheckResponseResult {
     OK,
@@ -118,7 +117,7 @@
     WRONG_CODE,
     WRONG_TEXT,
     WRONG_BODY_SIZE,
-    WRONG_BODY_VALUE
+    WRONG_BODY_VALUE,
   };
 
   /**
diff --git a/tests/daemon/mgmt/rib-manager.t.cpp b/tests/daemon/mgmt/rib-manager.t.cpp
index 2e876d5..6da89d3 100644
--- a/tests/daemon/mgmt/rib-manager.t.cpp
+++ b/tests/daemon/mgmt/rib-manager.t.cpp
@@ -186,11 +186,8 @@
     auto replyFibAddCommand = [this] (const Interest& interest) {
       ControlParameters params(interest.getName().at(4).blockFromValue());
       BOOST_CHECK(params.getName() == "/localhost/nfd/rib" || params.getName() == "/localhop/nfd/rib");
-      params.setFaceId(1)
-            .setCost(0);
-      ControlResponse resp;
-      resp.setCode(200)
-          .setBody(params.wireEncode());
+      params.setFaceId(1).setCost(0);
+      ControlResponse resp = makeResponse(200, "OK", params);
 
       auto data = make_shared<Data>(interest.getName());
       data->setContent(resp.wireEncode());
@@ -603,8 +600,8 @@
   BOOST_REQUIRE_EQUAL(content.elements().size(), nEntries);
 
   std::vector<ndn::nfd::RibEntry> receivedRecords, expectedRecords;
-  for (size_t idx = 0; idx < nEntries; ++idx) {
-    ndn::nfd::RibEntry decodedEntry(content.elements()[idx]);
+  for (const auto& el : content.elements()) {
+    ndn::nfd::RibEntry decodedEntry(el);
     BOOST_TEST_INFO_SCOPE(decodedEntry);
     receivedRecords.push_back(decodedEntry);
     actualPrefixes.erase(decodedEntry.getName());
@@ -613,7 +610,7 @@
     BOOST_REQUIRE(matchedEntryIt != m_rib.end());
 
     auto matchedEntry = matchedEntryIt->second;
-    BOOST_REQUIRE(matchedEntry != nullptr);
+    BOOST_TEST_REQUIRE(matchedEntry != nullptr);
 
     expectedRecords.emplace_back();
     expectedRecords.back().setName(matchedEntry->getName());
@@ -664,8 +661,8 @@
   auto it2 = m_rib.find("/test-remove-invalid-faces-2");
   BOOST_CHECK(it2 == m_rib.end());
   BOOST_REQUIRE(it1 != m_rib.end());
-  BOOST_CHECK(it1->second->hasFaceId(1));
-  BOOST_CHECK(!it1->second->hasFaceId(2));
+  BOOST_TEST(it1->second->hasFaceId(1));
+  BOOST_TEST(!it1->second->hasFaceId(2));
 }
 
 BOOST_AUTO_TEST_CASE(OnNotification)
diff --git a/tests/daemon/mgmt/strategy-choice-manager.t.cpp b/tests/daemon/mgmt/strategy-choice-manager.t.cpp
index 6cd2e70..aff0bee 100644
--- a/tests/daemon/mgmt/strategy-choice-manager.t.cpp
+++ b/tests/daemon/mgmt/strategy-choice-manager.t.cpp
@@ -91,10 +91,7 @@
   ControlParameters expectedParams;
   expectedParams.setName("/A")
                 .setStrategy(strategyNameP); // response should have versioned strategy name
-  ControlResponse expectedResp;
-  expectedResp.setCode(200)
-              .setText("OK")
-              .setBody(expectedParams.wireEncode());
+  ControlResponse expectedResp = makeResponse(200, "OK", expectedParams);
   BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
                     CheckResponseResult::OK);
 
@@ -146,7 +143,7 @@
 BOOST_AUTO_TEST_CASE(UnsetSuccess)
 {
   auto insertRes = sc.insert("/A", strategyNameP);
-  BOOST_REQUIRE(insertRes);
+  BOOST_TEST_REQUIRE(insertRes);
 
   ControlParameters reqParams;
   reqParams.setName("/A");
@@ -154,10 +151,7 @@
   receiveInterest(req);
 
   ControlParameters expectedParams(reqParams);
-  ControlResponse expectedResp;
-  expectedResp.setCode(200)
-              .setText("OK")
-              .setBody(expectedParams.wireEncode());
+  ControlResponse expectedResp = makeResponse(200, "OK", expectedParams);
   BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
                     CheckResponseResult::OK);
 
@@ -172,10 +166,7 @@
   receiveInterest(req);
 
   ControlParameters expectedParams(reqParams);
-  ControlResponse expectedResp;
-  expectedResp.setCode(200)
-              .setText("OK")
-              .setBody(expectedParams.wireEncode());
+  ControlResponse expectedResp = makeResponse(200, "OK", expectedParams);
   BOOST_CHECK_EQUAL(checkResponse(0, req.getName(), expectedResp),
                     CheckResponseResult::OK);
 
@@ -201,7 +192,7 @@
 BOOST_AUTO_TEST_CASE(StrategyChoiceDataset)
 {
   std::map<Name, Name> expected; // namespace => strategy instance name
-  for (const strategy_choice::Entry& entry : sc) {
+  for (const auto& entry : sc) {
     expected[entry.getPrefix()] = entry.getStrategyInstanceName();
   }
 
@@ -211,7 +202,7 @@
     Name strategy = DummyStrategy::getStrategyName(i);
 
     auto insertRes = sc.insert(name, strategy);
-    BOOST_CHECK(insertRes);
+    BOOST_TEST(insertRes);
     expected[name] = strategy;
   }
 
@@ -221,8 +212,8 @@
   dataset.parse();
   BOOST_CHECK_EQUAL(dataset.elements_size(), expected.size());
 
-  for (auto i = dataset.elements_begin(); i != dataset.elements_end(); ++i) {
-    ndn::nfd::StrategyChoice record(*i);
+  for (const auto& el : dataset.elements()) {
+    ndn::nfd::StrategyChoice record(el);
     BOOST_TEST_INFO_SCOPE(record);
     auto found = expected.find(record.getName());
     if (found == expected.end()) {
diff --git a/tests/daemon/rib/readvertise/nfd-rib-readvertise-destination.t.cpp b/tests/daemon/rib/readvertise/nfd-rib-readvertise-destination.t.cpp
index 2f1e27a..e6d9988 100644
--- a/tests/daemon/rib/readvertise/nfd-rib-readvertise-destination.t.cpp
+++ b/tests/daemon/rib/readvertise/nfd-rib-readvertise-destination.t.cpp
@@ -42,46 +42,32 @@
 class NfdRibReadvertiseDestinationFixture : public GlobalIoTimeFixture, public KeyChainFixture
 {
 protected:
-  NfdRibReadvertiseDestinationFixture()
-    : nSuccessCallbacks(0)
-    , nFailureCallbacks(0)
-    , face(g_io, m_keyChain, {true, false})
-    , controller(face, m_keyChain)
-    , dest(controller, rib, ndn::nfd::CommandOptions().setPrefix("/localhost/nlsr"))
-    , successCallback([this] { nSuccessCallbacks++; })
-    , failureCallback([this] (const std::string&) { nFailureCallbacks++; })
-  {
-  }
-
-public:
-  uint32_t nSuccessCallbacks;
-  uint32_t nFailureCallbacks;
-
-protected:
   static inline const Name RIB_REGISTER_COMMAND_PREFIX = Name("/localhost/nlsr")
                                                          .append(ndn::nfd::RibRegisterCommand::getName());
   static inline const Name RIB_UNREGISTER_COMMAND_PREFIX = Name("/localhost/nlsr")
                                                            .append(ndn::nfd::RibUnregisterCommand::getName());
 
-  ndn::DummyClientFace face;
-  ndn::nfd::Controller controller;
+  ndn::DummyClientFace face{g_io, m_keyChain, {true, false}};
+  ndn::nfd::Controller controller{face, m_keyChain};
   Rib rib;
-  NfdRibReadvertiseDestination dest;
-  std::function<void()> successCallback;
-  std::function<void(const std::string&)> failureCallback;
+  NfdRibReadvertiseDestination dest{controller, rib, ndn::nfd::CommandOptions().setPrefix("/localhost/nlsr")};
+
+  std::function<void()> successCallback = [this] { nSuccessCallbacks++; };
+  std::function<void(const std::string&)> failureCallback = [this] (auto&&) { nFailureCallbacks++; };
+
+  int nSuccessCallbacks = 0;
+  int nFailureCallbacks = 0;
 };
 
 BOOST_AUTO_TEST_SUITE(Rib)
 BOOST_FIXTURE_TEST_SUITE(TestNfdRibReadvertiseDestination, NfdRibReadvertiseDestinationFixture)
 
-class AdvertiseSuccessScenario
+struct AdvertiseSuccessScenario
 {
-public:
-  ndn::nfd::ControlResponse
+  static ndn::nfd::ControlResponse
   makeResponse(const ControlParameters& sentCp)
   {
     ControlParameters response;
-
     response.setFaceId(1)
       .setName(sentCp.getName())
       .setOrigin(ndn::nfd::ROUTE_ORIGIN_CLIENT)
@@ -92,40 +78,30 @@
     responsePayload.setCode(200)
       .setText("Successfully registered.")
       .setBody(response.wireEncode());
+
     return responsePayload;
   }
 
-  void
-  checkCommandOutcome(NfdRibReadvertiseDestinationFixture* fixture)
-  {
-    BOOST_CHECK_EQUAL(fixture->nSuccessCallbacks, 1);
-    BOOST_CHECK_EQUAL(fixture->nFailureCallbacks, 0);
-  }
+  static constexpr int nExpectedSuccessCalls = 1;
+  static constexpr int nExpectedFailureCalls = 0;
 };
 
-class AdvertiseFailureScenario
+struct AdvertiseFailureScenario
 {
-public:
-  ndn::nfd::ControlResponse
-  makeResponse(ControlParameters sentCp)
+  static ndn::nfd::ControlResponse
+  makeResponse(const ControlParameters& sentCp)
   {
-    ndn::nfd::ControlResponse responsePayload(403, "Not Authenticated");
-    return responsePayload;
+    return ndn::nfd::ControlResponse(403, "Not Authenticated");
   }
 
-  void
-  checkCommandOutcome(NfdRibReadvertiseDestinationFixture* fixture)
-  {
-    BOOST_CHECK_EQUAL(fixture->nFailureCallbacks, 1);
-    BOOST_CHECK_EQUAL(fixture->nSuccessCallbacks, 0);
-  }
+  static constexpr int nExpectedSuccessCalls = 0;
+  static constexpr int nExpectedFailureCalls = 1;
 };
 
 using AdvertiseScenarios = boost::mp11::mp_list<AdvertiseSuccessScenario, AdvertiseFailureScenario>;
 
 BOOST_AUTO_TEST_CASE_TEMPLATE(Advertise, Scenario, AdvertiseScenarios)
 {
-  Scenario scenario;
   Name prefix("/ndn/memphis/test");
   ReadvertisedRoute rr(prefix);
 
@@ -139,27 +115,27 @@
 
   // Parse the sent command Interest to check correctness.
   ControlParameters sentCp;
-  BOOST_CHECK_NO_THROW(sentCp.wireDecode(sentInterest.getName().get(RIB_REGISTER_COMMAND_PREFIX.size()).blockFromValue()));
+  BOOST_CHECK_NO_THROW(sentCp.wireDecode(sentInterest.getName().get(RIB_REGISTER_COMMAND_PREFIX.size())
+                                         .blockFromValue()));
   BOOST_CHECK_EQUAL(sentCp.getOrigin(), ndn::nfd::ROUTE_ORIGIN_CLIENT);
   BOOST_CHECK_EQUAL(sentCp.getName(), prefix);
 
-  ndn::nfd::ControlResponse responsePayload = scenario.makeResponse(sentCp);
+  ndn::nfd::ControlResponse responsePayload = Scenario::makeResponse(sentCp);
   auto responseData = makeData(sentInterest.getName());
   responseData->setContent(responsePayload.wireEncode());
   face.receive(*responseData);
   this->advanceClocks(10_ms);
 
-  scenario.checkCommandOutcome(this);
+  BOOST_TEST(nSuccessCallbacks == Scenario::nExpectedSuccessCalls);
+  BOOST_TEST(nFailureCallbacks == Scenario::nExpectedFailureCalls);
 }
 
-class WithdrawSuccessScenario
+struct WithdrawSuccessScenario
 {
-public:
-  ndn::nfd::ControlResponse
+  static ndn::nfd::ControlResponse
   makeResponse(const ControlParameters& sentCp)
   {
     ControlParameters response;
-
     response.setFaceId(1)
       .setName(sentCp.getName())
       .setOrigin(ndn::nfd::ROUTE_ORIGIN_CLIENT);
@@ -172,37 +148,26 @@
     return responsePayload;
   }
 
-  void
-  checkCommandOutcome(NfdRibReadvertiseDestinationFixture* fixture)
-  {
-    BOOST_CHECK_EQUAL(fixture->nSuccessCallbacks, 1);
-    BOOST_CHECK_EQUAL(fixture->nFailureCallbacks, 0);
-  }
+  static constexpr int nExpectedSuccessCalls = 1;
+  static constexpr int nExpectedFailureCalls = 0;
 };
 
-class WithdrawFailureScenario
+struct WithdrawFailureScenario
 {
-public:
-  ndn::nfd::ControlResponse
-  makeResponse(ControlParameters sentCp)
+  static ndn::nfd::ControlResponse
+  makeResponse(const ControlParameters& sentCp)
   {
-    ndn::nfd::ControlResponse responsePayload(403, "Not authenticated");
-    return responsePayload;
+    return ndn::nfd::ControlResponse(403, "Not authenticated");
   }
 
-  void
-  checkCommandOutcome(NfdRibReadvertiseDestinationFixture* fixture)
-  {
-    BOOST_CHECK_EQUAL(fixture->nFailureCallbacks, 1);
-    BOOST_CHECK_EQUAL(fixture->nSuccessCallbacks, 0);
-  }
+  static constexpr int nExpectedSuccessCalls = 0;
+  static constexpr int nExpectedFailureCalls = 1;
 };
 
 using WithdrawScenarios = boost::mp11::mp_list<WithdrawSuccessScenario, WithdrawFailureScenario>;
 
 BOOST_AUTO_TEST_CASE_TEMPLATE(Withdraw, Scenario, WithdrawScenarios)
 {
-  Scenario scenario;
   Name prefix("/ndn/memphis/test");
   ReadvertisedRoute rr(prefix);
 
@@ -215,18 +180,20 @@
   BOOST_CHECK(RIB_UNREGISTER_COMMAND_PREFIX.isPrefixOf(sentInterest.getName()));
 
   ControlParameters sentCp;
-  BOOST_CHECK_NO_THROW(sentCp.wireDecode(sentInterest.getName().get(RIB_UNREGISTER_COMMAND_PREFIX.size()).blockFromValue()));
+  BOOST_CHECK_NO_THROW(sentCp.wireDecode(sentInterest.getName().get(RIB_UNREGISTER_COMMAND_PREFIX.size())
+                                         .blockFromValue()));
   BOOST_CHECK_EQUAL(sentCp.getOrigin(), ndn::nfd::ROUTE_ORIGIN_CLIENT);
   BOOST_CHECK_EQUAL(sentCp.getName(), prefix);
 
-  ndn::nfd::ControlResponse responsePayload = scenario.makeResponse(sentCp);
+  ndn::nfd::ControlResponse responsePayload = Scenario::makeResponse(sentCp);
   auto responseData = makeData(sentInterest.getName());
   responseData->setContent(responsePayload.wireEncode());
 
   face.receive(*responseData);
   this->advanceClocks(1_ms);
 
-  scenario.checkCommandOutcome(this);
+  BOOST_TEST(nSuccessCallbacks == Scenario::nExpectedSuccessCalls);
+  BOOST_TEST(nFailureCallbacks == Scenario::nExpectedFailureCalls);
 }
 
 BOOST_AUTO_TEST_CASE(DestinationAvailability)
@@ -235,8 +202,7 @@
   Name commandPrefix("/localhost/nlsr");
   Route route;
 
-  dest.afterAvailabilityChange.connect(
-    std::bind(&std::vector<bool>::push_back, &availabilityChangeHistory, _1));
+  dest.afterAvailabilityChange.connect([&] (bool val) { availabilityChangeHistory.push_back(val); });
   BOOST_CHECK_EQUAL(dest.isAvailable(), false);
 
   rib.insert(commandPrefix, route);
