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()) {
