diff --git a/tests/unit/face.t.cpp b/tests/unit/face.t.cpp
index eb01f8f..ef1cab3 100644
--- a/tests/unit/face.t.cpp
+++ b/tests/unit/face.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2019 Regents of the University of California.
+ * Copyright (c) 2013-2020 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -43,7 +43,7 @@
 template<typename PrefixRegReply = WantPrefixRegReply>
 class FaceFixture : public IdentityManagementTimeFixture
 {
-public:
+protected:
   FaceFixture()
     : face(io, m_keyChain, {true, !std::is_same<PrefixRegReply, NoPrefixRegReply>::value})
   {
@@ -59,8 +59,8 @@
                              const RegisterPrefixFailureCallback& failure)> f)
   {
     boost::logic::tribool result = boost::logic::indeterminate;
-    f([&] (const Name&) { result = true; },
-      [&] (const Name&, const std::string&) { result = false; });
+    f([&] (auto) { result = true; },
+      [&] (auto, auto) { result = false; });
 
     advanceClocks(1_ms);
     BOOST_REQUIRE(!boost::logic::indeterminate(result));
@@ -75,22 +75,23 @@
                                const UnregisterPrefixFailureCallback& failure)> f)
   {
     boost::logic::tribool result = boost::logic::indeterminate;
-    f([&] { result = true; }, [&] (const std::string&) { result = false; });
+    f([&] { result = true; },
+      [&] (auto) { result = false; });
 
     advanceClocks(1_ms);
     BOOST_REQUIRE(!boost::logic::indeterminate(result));
     return static_cast<bool>(result);
   }
 
-public:
+protected:
   DummyClientFace face;
 };
 
 BOOST_FIXTURE_TEST_SUITE(TestFace, FaceFixture<>)
 
-BOOST_AUTO_TEST_SUITE(Consumer)
+BOOST_AUTO_TEST_SUITE(ExpressInterest)
 
-BOOST_AUTO_TEST_CASE(ExpressInterestData)
+BOOST_AUTO_TEST_CASE(ReplyData)
 {
   size_t nData = 0;
   face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
@@ -122,21 +123,17 @@
   BOOST_CHECK_EQUAL(nTimeouts, 1);
 }
 
-BOOST_AUTO_TEST_CASE(ExpressMultipleInterestData)
+BOOST_AUTO_TEST_CASE(MultipleData)
 {
   size_t nData = 0;
 
   face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
-                       [&] (const Interest& i, const Data& d) {
-                         ++nData;
-                       },
+                       [&] (const auto&, const auto&) { ++nData; },
                        bind([] { BOOST_FAIL("Unexpected Nack"); }),
                        bind([] { BOOST_FAIL("Unexpected timeout"); }));
 
   face.expressInterest(*makeInterest("/Hello/World/a", true, 50_ms),
-                       [&] (const Interest& i, const Data& d) {
-                         ++nData;
-                       },
+                       [&] (const auto&, const auto&) { ++nData; },
                        bind([] { BOOST_FAIL("Unexpected Nack"); }),
                        bind([] { BOOST_FAIL("Unexpected timeout"); }));
 
@@ -151,7 +148,7 @@
   BOOST_CHECK_EQUAL(face.sentData.size(), 0);
 }
 
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyDataCallback)
+BOOST_AUTO_TEST_CASE(EmptyDataCallback)
 {
   face.expressInterest(*makeInterest("/Hello/World", true),
                        nullptr,
@@ -165,7 +162,7 @@
   } while (false));
 }
 
-BOOST_AUTO_TEST_CASE(ExpressInterestTimeout)
+BOOST_AUTO_TEST_CASE(Timeout)
 {
   size_t nTimeouts = 0;
   face.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
@@ -184,7 +181,7 @@
   BOOST_CHECK_EQUAL(face.sentNacks.size(), 0);
 }
 
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyTimeoutCallback)
+BOOST_AUTO_TEST_CASE(EmptyTimeoutCallback)
 {
   face.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
                        bind([] { BOOST_FAIL("Unexpected Data"); }),
@@ -197,7 +194,7 @@
   } while (false));
 }
 
-BOOST_AUTO_TEST_CASE(ExpressInterestNack)
+BOOST_AUTO_TEST_CASE(ReplyNack)
 {
   size_t nNacks = 0;
 
@@ -223,24 +220,20 @@
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
 }
 
-BOOST_AUTO_TEST_CASE(ExpressMultipleInterestNack)
+BOOST_AUTO_TEST_CASE(MultipleNacks)
 {
   size_t nNacks = 0;
 
   auto interest = makeInterest("/Hello/World", false, 50_ms, 1);
   face.expressInterest(*interest,
                        bind([] { BOOST_FAIL("Unexpected Data"); }),
-                       [&] (const Interest& i, const lp::Nack& n) {
-                         ++nNacks;
-                       },
+                       [&] (const auto&, const auto&) { ++nNacks; },
                        bind([] { BOOST_FAIL("Unexpected timeout"); }));
 
   interest->setNonce(2);
   face.expressInterest(*interest,
                        bind([] { BOOST_FAIL("Unexpected Data"); }),
-                       [&] (const Interest& i, const lp::Nack& n) {
-                         ++nNacks;
-                       },
+                       [&] (const auto&, const auto&) { ++nNacks; },
                        bind([] { BOOST_FAIL("Unexpected timeout"); }));
 
   advanceClocks(40_ms);
@@ -253,7 +246,7 @@
   BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
 }
 
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyNackCallback)
+BOOST_AUTO_TEST_CASE(EmptyNackCallback)
 {
   face.expressInterest(*makeInterest("/Hello/World"),
                        bind([] { BOOST_FAIL("Unexpected Data"); }),
@@ -267,24 +260,67 @@
   } while (false));
 }
 
-BOOST_AUTO_TEST_CASE(CancelPendingInterestHandle)
+BOOST_AUTO_TEST_CASE(PutDataFromDataCallback) // Bug 4596
+{
+  face.expressInterest(*makeInterest("/localhost/notification/1"),
+                       [&] (const auto&, const auto&) {
+                         face.put(*makeData("/chronosync/sampleDigest/1"));
+                       }, nullptr, nullptr);
+  advanceClocks(10_ms);
+  BOOST_CHECK_EQUAL(face.sentInterests.back().getName(), "/localhost/notification/1");
+
+  face.receive(*makeInterest("/chronosync/sampleDigest", true));
+  advanceClocks(10_ms);
+
+  face.put(*makeData("/localhost/notification/1"));
+  advanceClocks(10_ms);
+  BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/chronosync/sampleDigest/1");
+}
+
+BOOST_AUTO_TEST_CASE(DestroyWithPendingInterest)
+{
+  auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+  face2->expressInterest(*makeInterest("/Hello/World", false, 50_ms),
+                         nullptr, nullptr, nullptr);
+  advanceClocks(50_ms, 2);
+  face2.reset();
+
+  advanceClocks(50_ms, 2); // should not crash - Bug 2518
+
+  // avoid "test case [...] did not check any assertions" message from Boost.Test
+  BOOST_CHECK(true);
+}
+
+BOOST_AUTO_TEST_CASE(Handle)
 {
   auto hdl = face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
                                   bind([] { BOOST_FAIL("Unexpected data"); }),
                                   bind([] { BOOST_FAIL("Unexpected nack"); }),
                                   bind([] { BOOST_FAIL("Unexpected timeout"); }));
-  advanceClocks(10_ms);
-
+  advanceClocks(1_ms);
   hdl.cancel();
-  advanceClocks(10_ms);
-
+  advanceClocks(1_ms);
   face.receive(*makeData("/Hello/World/%21"));
   advanceClocks(200_ms, 5);
 
+  // cancel after destructing face
+  auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+  auto hdl2 = face2->expressInterest(*makeInterest("/Hello/World", true, 50_ms),
+                                     bind([] { BOOST_FAIL("Unexpected data"); }),
+                                     bind([] { BOOST_FAIL("Unexpected nack"); }),
+                                     bind([] { BOOST_FAIL("Unexpected timeout"); }));
+  advanceClocks(1_ms);
+  face2.reset();
+  advanceClocks(1_ms);
+  hdl2.cancel(); // should not crash
+  advanceClocks(1_ms);
+
   // avoid "test case [...] did not check any assertions" message from Boost.Test
   BOOST_CHECK(true);
 }
 
+BOOST_AUTO_TEST_SUITE_END() // ExpressInterest
+
 BOOST_AUTO_TEST_CASE(RemoveAllPendingInterests)
 {
   face.expressInterest(*makeInterest("/Hello/World/0", false, 50_ms),
@@ -309,40 +345,6 @@
   advanceClocks(200_ms, 5);
 }
 
-BOOST_AUTO_TEST_CASE(DestructionWithoutCancellingPendingInterests) // Bug #2518
-{
-  {
-    DummyClientFace face2(io, m_keyChain);
-    face2.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
-                          nullptr, nullptr, nullptr);
-    advanceClocks(50_ms, 2);
-  }
-
-  advanceClocks(50_ms, 2); // should not crash
-
-  // avoid "test case [...] did not check any assertions" message from Boost.Test
-  BOOST_CHECK(true);
-}
-
-BOOST_AUTO_TEST_CASE(DataCallbackPutData) // Bug 4596
-{
-  face.expressInterest(*makeInterest("/localhost/notification/1"),
-                       [&] (const Interest& i, const Data& d) {
-                         face.put(*makeData("/chronosync/sampleDigest/1"));
-                       }, nullptr, nullptr);
-  advanceClocks(10_ms);
-  BOOST_CHECK_EQUAL(face.sentInterests.back().getName(), "/localhost/notification/1");
-
-  face.receive(*makeInterest("/chronosync/sampleDigest", true));
-  advanceClocks(10_ms);
-
-  face.put(*makeData("/localhost/notification/1"));
-  advanceClocks(10_ms);
-  BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/chronosync/sampleDigest/1");
-}
-
-BOOST_AUTO_TEST_SUITE_END() // Consumer
-
 BOOST_AUTO_TEST_SUITE(Producer)
 
 BOOST_AUTO_TEST_CASE(PutData)
@@ -511,7 +513,72 @@
   BOOST_CHECK_EQUAL(hasNack, true);
 }
 
-BOOST_AUTO_TEST_CASE(SetUnsetInterestFilter)
+BOOST_AUTO_TEST_SUITE_END() // Producer
+
+BOOST_AUTO_TEST_SUITE(RegisterPrefix)
+
+BOOST_FIXTURE_TEST_CASE(Failure, FaceFixture<NoPrefixRegReply>)
+{
+  BOOST_CHECK(!runPrefixReg([&] (const auto& success, const auto& failure) {
+    face.registerPrefix("/Hello/World", success, failure);
+    this->advanceClocks(5_s, 20); // wait for command timeout
+  }));
+}
+
+BOOST_AUTO_TEST_CASE(Handle)
+{
+  RegisteredPrefixHandle hdl;
+  auto doReg = [&] {
+    return runPrefixReg([&] (const auto& success, const auto& failure) {
+      hdl = face.registerPrefix("/Hello/World", success, failure);
+    });
+  };
+  auto doUnreg = [&] {
+    return runPrefixUnreg([&] (const auto& success, const auto& failure) {
+      hdl.unregister(success, failure);
+    });
+  };
+
+  // despite the "undefined behavior" warning, we try not to crash, but no API guarantee for this
+  BOOST_CHECK(!doUnreg());
+
+  // cancel after unregister
+  BOOST_CHECK(doReg());
+  BOOST_CHECK(doUnreg());
+  hdl.cancel();
+  advanceClocks(1_ms);
+
+  // unregister after cancel
+  BOOST_CHECK(doReg());
+  hdl.cancel();
+  advanceClocks(1_ms);
+  BOOST_CHECK(!doUnreg());
+
+  // cancel after destructing face
+  auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+  hdl = face2->registerPrefix("/Hello/World/2", nullptr,
+                              bind([] { BOOST_FAIL("Unexpected registerPrefix failure"); }));
+  advanceClocks(1_ms);
+  face2.reset();
+  advanceClocks(1_ms);
+  hdl.cancel(); // should not crash
+  advanceClocks(1_ms);
+
+  // unregister after destructing face
+  auto face3 = make_unique<DummyClientFace>(io, m_keyChain);
+  hdl = face3->registerPrefix("/Hello/World/3", nullptr,
+                              bind([] { BOOST_FAIL("Unexpected registerPrefix failure"); }));
+  advanceClocks(1_ms);
+  face3.reset();
+  advanceClocks(1_ms);
+  BOOST_CHECK(!doUnreg());
+}
+
+BOOST_AUTO_TEST_SUITE_END() // RegisterPrefix
+
+BOOST_AUTO_TEST_SUITE(SetInterestFilter)
+
+BOOST_AUTO_TEST_CASE(SetAndCancel)
 {
   size_t nInterests = 0;
   size_t nRegs = 0;
@@ -543,15 +610,9 @@
 
   face.receive(*makeInterest("/Hello/World/%21/3"));
   BOOST_CHECK_EQUAL(nInterests, 2);
-
-  face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
-  advanceClocks(25_ms, 4);
-
-  face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
-  advanceClocks(25_ms, 4);
 }
 
-BOOST_AUTO_TEST_CASE(SetInterestFilterEmptyInterestCallback)
+BOOST_AUTO_TEST_CASE(EmptyInterestCallback)
 {
   face.setInterestFilter("/A", nullptr);
   advanceClocks(1_ms);
@@ -562,7 +623,7 @@
   } while (false));
 }
 
-BOOST_AUTO_TEST_CASE(SetUnsetInterestFilterWithoutSucessCallback)
+BOOST_AUTO_TEST_CASE(WithoutSuccessCallback)
 {
   size_t nInterests = 0;
   auto hdl = face.setInterestFilter("/Hello/World",
@@ -590,15 +651,9 @@
 
   face.receive(*makeInterest("/Hello/World/%21/3"));
   BOOST_CHECK_EQUAL(nInterests, 2);
-
-  face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
-  advanceClocks(25_ms, 4);
-
-  face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
-  advanceClocks(25_ms, 4);
 }
 
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterFail, FaceFixture<NoPrefixRegReply>)
+BOOST_FIXTURE_TEST_CASE(Failure, FaceFixture<NoPrefixRegReply>)
 {
   // don't enable registration reply
   size_t nRegFailed = 0;
@@ -614,7 +669,7 @@
   BOOST_CHECK_EQUAL(nRegFailed, 1);
 }
 
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterFailWithoutSuccessCallback, FaceFixture<NoPrefixRegReply>)
+BOOST_FIXTURE_TEST_CASE(FailureWithoutSuccessCallback, FaceFixture<NoPrefixRegReply>)
 {
   // don't enable registration reply
   size_t nRegFailed = 0;
@@ -629,31 +684,6 @@
   BOOST_CHECK_EQUAL(nRegFailed, 1);
 }
 
-BOOST_FIXTURE_TEST_CASE(RegisterUnregisterPrefixFail, FaceFixture<NoPrefixRegReply>)
-{
-  BOOST_CHECK(!runPrefixReg([&] (const auto& success, const auto& failure) {
-    face.registerPrefix("/Hello/World", success, failure);
-    this->advanceClocks(5_s, 20); // wait for command timeout
-  }));
-}
-
-BOOST_AUTO_TEST_CASE(RegisterUnregisterPrefixHandle)
-{
-  RegisteredPrefixHandle hdl;
-  BOOST_CHECK(!runPrefixUnreg([&] (const auto& success, const auto& failure) {
-    // despite the "undefined behavior" warning, we try not to crash, but no API guarantee for this
-    hdl.unregister(success, failure);
-  }));
-
-  BOOST_CHECK(runPrefixReg([&] (const auto& success, const auto& failure) {
-    hdl = face.registerPrefix("/Hello/World", success, failure);
-  }));
-
-  BOOST_CHECK(runPrefixUnreg([&] (const auto& success, const auto& failure) {
-    hdl.unregister(success, failure);
-  }));
-}
-
 BOOST_AUTO_TEST_CASE(SimilarFilters)
 {
   size_t nInInterests1 = 0;
@@ -684,21 +714,7 @@
   BOOST_CHECK_EQUAL(nInInterests3, 0);
 }
 
-BOOST_AUTO_TEST_CASE(SetRegexFilterError)
-{
-  face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
-                         [] (const Name&, const Interest&) {
-                           BOOST_FAIL("InterestFilter::Error should have been triggered");
-                         },
-                         nullptr,
-                         bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
-
-  advanceClocks(25_ms, 4);
-
-  BOOST_REQUIRE_THROW(face.receive(*makeInterest("/Hello/World/XXX/b/c")), InterestFilter::Error);
-}
-
-BOOST_AUTO_TEST_CASE(SetRegexFilter)
+BOOST_AUTO_TEST_CASE(RegexFilter)
 {
   size_t nInInterests = 0;
   face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
@@ -721,7 +737,21 @@
   BOOST_CHECK_EQUAL(nInInterests, 2);
 }
 
-BOOST_AUTO_TEST_CASE(SetRegexFilterAndRegister)
+BOOST_AUTO_TEST_CASE(RegexFilterError)
+{
+  face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
+                         [] (const Name&, const Interest&) {
+                           BOOST_FAIL("InterestFilter::Error should have been triggered");
+                         },
+                         nullptr,
+                         bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
+
+  advanceClocks(25_ms, 4);
+
+  BOOST_CHECK_THROW(face.receive(*makeInterest("/Hello/World/XXX/b/c")), InterestFilter::Error);
+}
+
+BOOST_AUTO_TEST_CASE(RegexFilterAndRegisterPrefix)
 {
   size_t nInInterests = 0;
   face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
@@ -748,7 +778,7 @@
   BOOST_CHECK_EQUAL(nInInterests, 2);
 }
 
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterNoReg, FaceFixture<NoPrefixRegReply>) // Bug 2318
+BOOST_FIXTURE_TEST_CASE(WithoutRegisterPrefix, FaceFixture<NoPrefixRegReply>) // Bug 2318
 {
   // This behavior is specific to DummyClientFace.
   // Regular Face won't accept incoming packets until something is sent.
@@ -763,10 +793,10 @@
   BOOST_CHECK_EQUAL(hit, 1);
 }
 
-BOOST_AUTO_TEST_CASE(SetInterestFilterHandle)
+BOOST_AUTO_TEST_CASE(Handle)
 {
   int hit = 0;
-  auto hdl = face.setInterestFilter(Name("/"), bind([&hit] { ++hit; }));
+  InterestFilterHandle hdl = face.setInterestFilter(Name("/"), bind([&hit] { ++hit; }));
   face.processEvents(-1_ms);
 
   face.receive(*makeInterest("/A"));
@@ -779,11 +809,18 @@
   face.receive(*makeInterest("/B"));
   face.processEvents(-1_ms);
   BOOST_CHECK_EQUAL(hit, 1);
+
+  // cancel after destructing face
+  auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+  InterestFilterHandle hdl2 = face2->setInterestFilter("/Hello/World/2", nullptr);
+  advanceClocks(1_ms);
+  face2.reset();
+  advanceClocks(1_ms);
+  hdl2.cancel(); // should not crash
+  advanceClocks(1_ms);
 }
 
-BOOST_AUTO_TEST_SUITE_END() // Producer
-
-BOOST_AUTO_TEST_SUITE(IoRoutines)
+BOOST_AUTO_TEST_SUITE_END() // SetInterestFilter
 
 BOOST_AUTO_TEST_CASE(ProcessEvents)
 {
@@ -813,8 +850,6 @@
   BOOST_CHECK(true);
 }
 
-BOOST_AUTO_TEST_SUITE_END() // IoRoutines
-
 BOOST_AUTO_TEST_SUITE(Transport)
 
 using ndn::Transport;
