diff --git a/tests/daemon/fw/best-route-strategy2.t.cpp b/tests/daemon/fw/best-route-strategy2.t.cpp
index a3b2aba..ac5c3ef 100644
--- a/tests/daemon/fw/best-route-strategy2.t.cpp
+++ b/tests/daemon/fw/best-route-strategy2.t.cpp
@@ -75,10 +75,10 @@
 
 BOOST_AUTO_TEST_CASE(Forward)
 {
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 10);
-  fibEntry->addNextHop(face2, 20);
-  fibEntry->addNextHop(face3, 30);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 10);
+  fibEntry.addNextHop(*face2, 20);
+  fibEntry.addNextHop(*face3, 30);
 
   shared_ptr<Interest> interest = makeInterest("ndn:/BzgFBchqA");
   shared_ptr<pit::Entry> pitEntry = pit.insert(*interest).first;
@@ -127,7 +127,7 @@
   BOOST_CHECK_EQUAL(strategy.sendInterestHistory[4].outFaceId, face1->getId());
   BOOST_CHECK_EQUAL(strategy.sendInterestHistory[5].outFaceId, face3->getId());
 
-  fibEntry->removeNextHop(face1);
+  fibEntry.removeNextHop(*face1);
 
   strategy.sendInterestHistory.clear();
   for (int i = 0; i < 3; ++i) {
@@ -153,10 +153,10 @@
     return "/P";
   }
 
-  shared_ptr<fib::Entry>
-  makeFibEntry(BestRouteStrategy2Fixture* fixture)
+  void
+  insertFibEntry(BestRouteStrategy2Fixture* fixture)
   {
-    return fixture->fib.insert(Name()).first;
+    fixture->fib.insert(Name());
   }
 };
 
@@ -169,12 +169,10 @@
     return "/P";
   }
 
-  shared_ptr<fib::Entry>
-  makeFibEntry(BestRouteStrategy2Fixture* fixture)
+  void
+  insertFibEntry(BestRouteStrategy2Fixture* fixture)
   {
-    shared_ptr<fib::Entry> fibEntry = fixture->fib.insert(Name()).first;
-    fibEntry->addNextHop(fixture->face1, 10);
-    return fibEntry;
+    fixture->fib.insert(Name()).first->addNextHop(*fixture->face1, 10);
   }
 };
 
@@ -187,13 +185,11 @@
     return "/localhop/P";
   }
 
-  shared_ptr<fib::Entry>
-  makeFibEntry(BestRouteStrategy2Fixture* fixture)
+  void
+  insertFibEntry(BestRouteStrategy2Fixture* fixture)
   {
-    shared_ptr<fib::Entry> fibEntry = fixture->fib.insert("/localhop").first;
-    fibEntry->addNextHop(fixture->face2, 10);
+    fixture->fib.insert("/localhop").first->addNextHop(*fixture->face2, 10);
     // face1 and face2 are both non-local; Interest from face1 cannot be forwarded to face2
-    return fibEntry;
   }
 };
 
@@ -202,13 +198,12 @@
 BOOST_AUTO_TEST_CASE_TEMPLATE(IncomingInterest, Scenario, NoRouteScenarios)
 {
   Scenario scenario;
+  scenario.insertFibEntry(this);
 
   shared_ptr<Interest> interest = makeInterest(scenario.getInterestName());
   shared_ptr<pit::Entry> pitEntry = pit.insert(*interest).first;
   pitEntry->insertOrUpdateInRecord(face1, *interest);
 
-  shared_ptr<fib::Entry> fibEntry = scenario.makeFibEntry(this);
-
   strategy.afterReceiveInterest(*face1, *interest, pitEntry);
 
   BOOST_REQUIRE_EQUAL(strategy.rejectPendingInterestHistory.size(), 1);
@@ -226,10 +221,10 @@
 
 BOOST_AUTO_TEST_CASE(OneUpstream) // one upstream, send Nack when Nack arrives
 {
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face3, 10);
-  fibEntry->addNextHop(face4, 20);
-  fibEntry->addNextHop(face5, 30);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face3, 10);
+  fibEntry.addNextHop(*face4, 20);
+  fibEntry.addNextHop(*face5, 30);
 
   shared_ptr<Interest> interest1 = makeInterest("/McQYjMbm", 992);
   shared_ptr<Interest> interest2 = makeInterest("/McQYjMbm", 114);
@@ -256,10 +251,10 @@
 
 BOOST_AUTO_TEST_CASE(TwoUpstreams) // two upstreams, send Nack when both Nacks arrive
 {
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face3, 10);
-  fibEntry->addNextHop(face4, 20);
-  fibEntry->addNextHop(face5, 30);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face3, 10);
+  fibEntry.addNextHop(*face4, 20);
+  fibEntry.addNextHop(*face5, 30);
 
   shared_ptr<Interest> interest1 = makeInterest("/aS9FAyUV19", 286);
   shared_ptr<pit::Entry> pitEntry = pit.insert(*interest1).first;
@@ -285,10 +280,10 @@
 
 BOOST_AUTO_TEST_CASE(Timeout) // two upstreams, one times out, don't send Nack
 {
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face3, 10);
-  fibEntry->addNextHop(face4, 20);
-  fibEntry->addNextHop(face5, 30);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face3, 10);
+  fibEntry.addNextHop(*face4, 20);
+  fibEntry.addNextHop(*face5, 30);
 
   shared_ptr<Interest> interest1 = makeInterest("/sIYw0TXWDj", 115);
   interest1->setInterestLifetime(time::milliseconds(400));
@@ -429,10 +424,10 @@
 {
   Combination combination;
 
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face3, 10);
-  fibEntry->addNextHop(face4, 20);
-  fibEntry->addNextHop(face5, 30);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face3, 10);
+  fibEntry.addNextHop(*face4, 20);
+  fibEntry.addNextHop(*face5, 30);
 
   shared_ptr<Interest> interest1 = makeInterest("/F6sEwB24I", 282);
   shared_ptr<pit::Entry> pitEntry = pit.insert(*interest1).first;
diff --git a/tests/daemon/fw/client-control-strategy.t.cpp b/tests/daemon/fw/client-control-strategy.t.cpp
index 0305b47..0a31244 100644
--- a/tests/daemon/fw/client-control-strategy.t.cpp
+++ b/tests/daemon/fw/client-control-strategy.t.cpp
@@ -54,8 +54,8 @@
   forwarder.addFace(face4);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face2, 0);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face2, 0);
 
   Pit& pit = forwarder.getPit();
 
diff --git a/tests/daemon/fw/dummy-strategy.hpp b/tests/daemon/fw/dummy-strategy.hpp
index ca6a858..17831fd 100644
--- a/tests/daemon/fw/dummy-strategy.hpp
+++ b/tests/daemon/fw/dummy-strategy.hpp
@@ -63,7 +63,7 @@
     }
 
     if (interestOutFace) {
-      this->sendInterest(pitEntry, interestOutFace);
+      this->sendInterest(pitEntry, *interestOutFace);
     }
     else {
       this->rejectPendingInterest(pitEntry);
diff --git a/tests/daemon/fw/forwarder.t.cpp b/tests/daemon/fw/forwarder.t.cpp
index 1a4de92..7f2bc41 100644
--- a/tests/daemon/fw/forwarder.t.cpp
+++ b/tests/daemon/fw/forwarder.t.cpp
@@ -39,12 +39,9 @@
 {
   Forwarder forwarder;
 
-  Name nameA("ndn:/A");
-  Name nameAB("ndn:/A/B");
-  Name nameABC("ndn:/A/B/C");
-  shared_ptr<Interest> interestAB = makeInterest(nameAB);
+  shared_ptr<Interest> interestAB = makeInterest("/A/B");
   interestAB->setInterestLifetime(time::seconds(4));
-  shared_ptr<Data> dataABC = makeData(nameABC);
+  shared_ptr<Data> dataABC = makeData("/A/B/C");
 
   auto face1 = make_shared<DummyFace>();
   auto face2 = make_shared<DummyFace>();
@@ -52,15 +49,14 @@
   forwarder.addFace(face2);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name("ndn:/A")).first;
-  fibEntry->addNextHop(face2, 0);
+  fib.insert("/A").first->addNextHop(*face2, 0);
 
   BOOST_CHECK_EQUAL(forwarder.getCounters().nInInterests, 0);
   BOOST_CHECK_EQUAL(forwarder.getCounters().nOutInterests, 0);
   face1->receiveInterest(*interestAB);
   this->advanceClocks(time::milliseconds(100), time::seconds(1));
   BOOST_REQUIRE_EQUAL(face2->sentInterests.size(), 1);
-  BOOST_CHECK_EQUAL(face2->sentInterests[0].getName(), nameAB);
+  BOOST_CHECK_EQUAL(face2->sentInterests[0].getName(), "/A/B");
   BOOST_REQUIRE(face2->sentInterests[0].getTag<lp::IncomingFaceIdTag>() != nullptr);
   BOOST_CHECK_EQUAL(*face2->sentInterests[0].getTag<lp::IncomingFaceIdTag>(), face1->getId());
   BOOST_CHECK_EQUAL(forwarder.getCounters().nInInterests, 1);
@@ -71,7 +67,7 @@
   face2->receiveData(*dataABC);
   this->advanceClocks(time::milliseconds(100), time::seconds(1));
   BOOST_REQUIRE_EQUAL(face1->sentData.size(), 1);
-  BOOST_CHECK_EQUAL(face1->sentData[0].getName(), nameABC);
+  BOOST_CHECK_EQUAL(face1->sentData[0].getName(), "/A/B/C");
   BOOST_REQUIRE(face1->sentData[0].getTag<lp::IncomingFaceIdTag>() != nullptr);
   BOOST_CHECK_EQUAL(*face1->sentData[0].getTag<lp::IncomingFaceIdTag>(), face2->getId());
   BOOST_CHECK_EQUAL(forwarder.getCounters().nInData, 1);
@@ -89,14 +85,13 @@
   forwarder.addFace(face2);
   forwarder.addFace(face3);
 
-  shared_ptr<Interest> interestA = makeInterest("ndn:/A");
+  shared_ptr<Interest> interestA = makeInterest("/A");
   interestA->setInterestLifetime(time::seconds(4));
-  shared_ptr<Data> dataA = makeData("ndn:/A");
+  shared_ptr<Data> dataA = makeData("/A");
   dataA->setTag(make_shared<lp::IncomingFaceIdTag>(face3->getId()));
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name("ndn:/A")).first;
-  fibEntry->addNextHop(face2, 0);
+  fib.insert("/A").first->addNextHop(*face2, 0);
 
   Pit& pit = forwarder.getPit();
   BOOST_CHECK_EQUAL(pit.size(), 0);
@@ -130,7 +125,7 @@
   forwarder.addFace(face3);
 
   Pit& pit = forwarder.getPit();
-  auto interestA1 = makeInterest("ndn:/A");
+  auto interestA1 = makeInterest("/A");
   interestA1->setNonce(8378);
   shared_ptr<pit::Entry> pitA = pit.insert(*interestA1).first;
   pit::InRecordCollection::iterator inA1 = pitA->insertOrUpdateInRecord(face1, *interestA1);
@@ -153,7 +148,7 @@
   BOOST_CHECK_EQUAL(face1->sentInterests.back().getNonce(), 8378);
 
   this->advanceClocks(time::seconds(2));
-  auto interestA2 = makeInterest("ndn:/A");
+  auto interestA2 = makeInterest("/A");
   interestA2->setNonce(9102);
   pitA->insertOrUpdateInRecord(face2, *interestA2);
 
@@ -644,8 +639,7 @@
   forwarder.addFace(face4);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name("/zT4XwK0Hnx")).first;
-  fibEntry->addNextHop(face4, 0);
+  fib.insert("/zT4XwK0Hnx").first->addNextHop(*face4, 0);
 
   // receive Interest on face1
   face1->sentNacks.clear();
@@ -699,8 +693,7 @@
   });
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name("ndn:/A")).first;
-  fibEntry->addNextHop(face2, 0);
+  fib.insert("/A").first->addNextHop(*face2, 0);
 
   // receive an Interest
   shared_ptr<Interest> interest = makeInterest("ndn:/A/1");
@@ -758,8 +751,7 @@
   // consumer region
   nrt.clear();
   nrt.insert("/arizona/cs/avenir");
-  shared_ptr<fib::Entry> fibRoot = fib.insert("/").first;
-  fibRoot->addNextHop(face2, 10);
+  fib.insert("/").first->addNextHop(*face2, 10);
 
   auto interest1 = makeInterest("/net/ndnsim/www/1.html");
   interest1->setLink(link->wireEncode());
@@ -769,15 +761,13 @@
   BOOST_CHECK_EQUAL(forwarder.lookupFib(*pit1).getPrefix(), "/");
   BOOST_CHECK_EQUAL(interest1->hasSelectedDelegation(), false);
 
-  fibRoot->removeNextHop(face2);
+  fib.insert("/").first->removeNextHop(*face2);
 
   // first default-free router, both delegations are available
   nrt.clear();
   nrt.insert("/arizona/cs/hobo");
-  shared_ptr<fib::Entry> fibTelia = fib.insert("/telia").first;
-  fibTelia->addNextHop(face2, 10);
-  shared_ptr<fib::Entry> fibUcla = fib.insert("/ucla").first;
-  fibUcla->addNextHop(face2, 10);
+  fib.insert("/telia").first->addNextHop(*face2, 10);
+  fib.insert("/ucla").first->addNextHop(*face2, 10);
 
   auto interest2 = makeInterest("/net/ndnsim/www/2.html");
   interest2->setLink(link->wireEncode());
@@ -788,14 +778,13 @@
   BOOST_REQUIRE_EQUAL(interest2->hasSelectedDelegation(), true);
   BOOST_CHECK_EQUAL(interest2->getSelectedDelegation(), "/telia/terabits");
 
-  fib.erase(*fibTelia);
-  fib.erase(*fibUcla);
+  fib.erase("/telia");
+  fib.erase("/ucla");
 
   // first default-free router, only second delegation is available
   nrt.clear();
   nrt.insert("/arizona/cs/hobo");
-  fibUcla = fib.insert("/ucla").first;
-  fibUcla->addNextHop(face2, 10);
+  fib.insert("/ucla").first->addNextHop(*face2, 10);
 
   auto interest3 = makeInterest("/net/ndnsim/www/3.html");
   interest3->setLink(link->wireEncode());
@@ -806,15 +795,13 @@
   BOOST_REQUIRE_EQUAL(interest3->hasSelectedDelegation(), true);
   BOOST_CHECK_EQUAL(interest3->getSelectedDelegation(), "/ucla/cs");
 
-  fib.erase(*fibUcla);
+  fib.erase("/ucla");
 
   // default-free router, chosen SelectedDelegation
   nrt.clear();
   nrt.insert("/ucsd/caida/click");
-  fibTelia = fib.insert("/telia").first;
-  fibTelia->addNextHop(face2, 10);
-  fibUcla = fib.insert("/ucla").first;
-  fibUcla->addNextHop(face2, 10);
+  fib.insert("/telia").first->addNextHop(*face2, 10);
+  fib.insert("/ucla").first->addNextHop(*face2, 10);
 
   auto interest4 = makeInterest("/net/ndnsim/www/4.html");
   interest4->setLink(link->wireEncode());
@@ -826,17 +813,15 @@
   BOOST_REQUIRE_EQUAL(interest4->hasSelectedDelegation(), true);
   BOOST_CHECK_EQUAL(interest4->getSelectedDelegation(), "/ucla/cs");
 
-  fib.erase(*fibTelia);
-  fib.erase(*fibUcla);
+  fib.erase("/telia");
+  fib.erase("/ucla");
 
   // producer region
   nrt.clear();
   nrt.insert("/ucla/cs/spurs");
-  fibRoot->addNextHop(face2, 10);
-  fibUcla = fib.insert("/ucla").first;
-  fibUcla->addNextHop(face2, 10);
-  shared_ptr<fib::Entry> fibNdnsim = fib.insert("/net/ndnsim").first;
-  fibNdnsim->addNextHop(face2, 10);
+  fib.insert("/").first->addNextHop(*face2, 10);
+  fib.insert("/ucla").first->addNextHop(*face2, 10);
+  fib.insert("/net/ndnsim").first->addNextHop(*face2, 10);
 
   auto interest5 = makeInterest("/net/ndnsim/www/5.html");
   interest5->setLink(link->wireEncode());
@@ -848,9 +833,9 @@
   BOOST_REQUIRE_EQUAL(interest5->hasSelectedDelegation(), true);
   BOOST_CHECK_EQUAL(interest5->getSelectedDelegation(), "/ucla/cs");
 
-  fibRoot->removeNextHop(face2);
-  fib.erase(*fibUcla);
-  fib.erase(*fibNdnsim);
+  fib.insert("/").first->removeNextHop(*face2);
+  fib.erase("/ucla");
+  fib.erase("/ndnsim");
 }
 
 
diff --git a/tests/daemon/fw/multicast-strategy.t.cpp b/tests/daemon/fw/multicast-strategy.t.cpp
index 5204821..2800dc7 100644
--- a/tests/daemon/fw/multicast-strategy.t.cpp
+++ b/tests/daemon/fw/multicast-strategy.t.cpp
@@ -52,10 +52,10 @@
   forwarder.addFace(face3);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 0);
-  fibEntry->addNextHop(face2, 0);
-  fibEntry->addNextHop(face3, 0);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 0);
+  fibEntry.addNextHop(*face2, 0);
+  fibEntry.addNextHop(*face3, 0);
 
   shared_ptr<Interest> interest = makeInterest("ndn:/H0D6i5fc");
   Pit& pit = forwarder.getPit();
@@ -88,8 +88,8 @@
   forwarder.addFace(face2);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert("ndn:/localhop/uS09bub6tm").first;
-  fibEntry->addNextHop(face2, 0);
+  fib::Entry& fibEntry = *fib.insert("ndn:/localhop/uS09bub6tm").first;
+  fibEntry.addNextHop(*face2, 0);
 
   shared_ptr<Interest> interest = makeInterest("ndn:/localhop/uS09bub6tm/eG3MMoP6z");
   Pit& pit = forwarder.getPit();
@@ -111,8 +111,8 @@
   forwarder.addFace(face1);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 0);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 0);
 
   shared_ptr<Interest> interest = makeInterest("ndn:/H0D6i5fc");
   Pit& pit = forwarder.getPit();
diff --git a/tests/daemon/fw/ncc-strategy.t.cpp b/tests/daemon/fw/ncc-strategy.t.cpp
index 9fec06b..b624c74 100644
--- a/tests/daemon/fw/ncc-strategy.t.cpp
+++ b/tests/daemon/fw/ncc-strategy.t.cpp
@@ -62,9 +62,9 @@
   forwarder.addFace(face3);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 10);
-  fibEntry->addNextHop(face2, 20);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 10);
+  fibEntry.addNextHop(*face2, 20);
 
   StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
   strategyChoice.install(strategy);
@@ -126,8 +126,8 @@
   forwarder.addFace(face3);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 10);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 10);
 
   StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
   strategyChoice.install(strategy);
@@ -162,7 +162,7 @@
   strategy->afterReceiveInterest(*face3, *interest2, pitEntry2);
 
   // FIB entry is changed before doPropagate executes
-  fibEntry->addNextHop(face2, 20);
+  fibEntry.addNextHop(*face2, 20);
   this->advanceClocks(time::milliseconds(10), time::milliseconds(1000));// should not crash
 }
 
@@ -182,9 +182,9 @@
   forwarder.addFace(face3);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 10);
-  fibEntry->addNextHop(face2, 20);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 10);
+  fibEntry.addNextHop(*face2, 20);
 
   StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
   strategyChoice.install(strategy);
@@ -242,8 +242,8 @@
   forwarder.addFace(face2);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face2, 10);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face2, 10);
 
   StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
   strategyChoice.install(strategy);
@@ -292,9 +292,9 @@
   forwarder.addFace(face2);
 
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(Name()).first;
-  fibEntry->addNextHop(face1, 10); // face1 is top-ranked nexthop
-  fibEntry->addNextHop(face2, 20);
+  fib::Entry& fibEntry = *fib.insert(Name()).first;
+  fibEntry.addNextHop(*face1, 10); // face1 is top-ranked nexthop
+  fibEntry.addNextHop(*face2, 20);
 
   StrategyChoice& strategyChoice = forwarder.getStrategyChoice();
   strategyChoice.install(strategy);
diff --git a/tests/daemon/fw/strategy-tester.hpp b/tests/daemon/fw/strategy-tester.hpp
index ed831ff..da79517 100644
--- a/tests/daemon/fw/strategy-tester.hpp
+++ b/tests/daemon/fw/strategy-tester.hpp
@@ -53,7 +53,7 @@
 protected:
   virtual void
   sendInterest(shared_ptr<pit::Entry> pitEntry,
-               shared_ptr<Face> outFace,
+               Face& outFace,
                bool wantNewNonce = false) override;
 
   virtual void
@@ -91,12 +91,12 @@
 template<typename S>
 inline void
 StrategyTester<S>::sendInterest(shared_ptr<pit::Entry> pitEntry,
-                                shared_ptr<Face> outFace,
+                                Face& outFace,
                                 bool wantNewNonce)
 {
-  SendInterestArgs args{pitEntry, outFace->getId(), wantNewNonce};
+  SendInterestArgs args{pitEntry, outFace.getId(), wantNewNonce};
   sendInterestHistory.push_back(args);
-  pitEntry->insertOrUpdateOutRecord(outFace, pitEntry->getInterest());
+  pitEntry->insertOrUpdateOutRecord(outFace.shared_from_this(), pitEntry->getInterest());
   afterAction();
 }
 
diff --git a/tests/daemon/fw/topology-tester.cpp b/tests/daemon/fw/topology-tester.cpp
index b1eeb6a..9224b40 100644
--- a/tests/daemon/fw/topology-tester.cpp
+++ b/tests/daemon/fw/topology-tester.cpp
@@ -184,8 +184,7 @@
 {
   Forwarder& forwarder = this->getForwarder(i);
   Fib& fib = forwarder.getFib();
-  shared_ptr<fib::Entry> fibEntry = fib.insert(prefix).first;
-  fibEntry->addNextHop(const_cast<Face&>(face).shared_from_this(), cost);
+  fib.insert(prefix).first->addNextHop(const_cast<Face&>(face), cost);
 }
 
 void
diff --git a/tests/daemon/mgmt/fib-manager.t.cpp b/tests/daemon/mgmt/fib-manager.t.cpp
index ee56cf7..9e5f285 100644
--- a/tests/daemon/mgmt/fib-manager.t.cpp
+++ b/tests/daemon/mgmt/fib-manager.t.cpp
@@ -94,19 +94,19 @@
   checkNextHop(const Name& prefix, ssize_t expectedNNextHops = -1,
                FaceId faceId = face::FACEID_NULL, int32_t expectedCost = -1)
   {
-    auto entry = m_fib.findExactMatch(prefix);
-    if (!static_cast<bool>(entry)) {
+    const fib::Entry* entry = m_fib.findExactMatch(prefix);
+    if (entry == nullptr) {
       return CheckNextHopResult::NO_FIB_ENTRY;
     }
 
-    auto nextHops = entry->getNextHops();
+    const fib::NextHopList& nextHops = entry->getNextHops();
     if (expectedNNextHops != -1 && nextHops.size() != static_cast<size_t>(expectedNNextHops)) {
       return CheckNextHopResult::WRONG_N_NEXTHOPS;
     }
 
     if (faceId != face::FACEID_NULL) {
       for (auto&& record : nextHops) {
-        if (record.getFace()->getId() == faceId) {
+        if (record.getFace().getId() == faceId) {
           return expectedCost != -1 && record.getCost() != static_cast<uint32_t>(expectedCost) ?
             CheckNextHopResult::WRONG_COST : CheckNextHopResult::OK;
         }
@@ -285,10 +285,10 @@
   BOOST_REQUIRE_NE(face2, face::INVALID_FACEID);
   BOOST_REQUIRE_NE(face3, face::INVALID_FACEID);
 
-  shared_ptr<fib::Entry> entry = m_fib.insert("/hello").first;
-  entry->addNextHop(m_faceTable.get(face1), 101);
-  entry->addNextHop(m_faceTable.get(face2), 202);
-  entry->addNextHop(m_faceTable.get(face3), 303);
+  fib::Entry* entry = m_fib.insert("/hello").first;
+  entry->addNextHop(*m_faceTable.get(face1), 101);
+  entry->addNextHop(*m_faceTable.get(face2), 202);
+  entry->addNextHop(*m_faceTable.get(face3), 303);
 
   testRemoveNextHop(makeParameters("/hello", face1));
   BOOST_REQUIRE_EQUAL(m_responses.size(), 1);
@@ -340,9 +340,9 @@
     receiveInterest(command);
   };
 
-  shared_ptr<fib::Entry> entry = m_fib.insert("/hello").first;
-  entry->addNextHop(m_faceTable.get(face1), 101);
-  entry->addNextHop(m_faceTable.get(face2), 202);
+  fib::Entry* entry = m_fib.insert("/hello").first;
+  entry->addNextHop(*m_faceTable.get(face1), 101);
+  entry->addNextHop(*m_faceTable.get(face2), 202);
 
   testWithImplicitFaceId(ControlParameters().setName("/hello").setFaceId(0), face1);
   BOOST_REQUIRE_EQUAL(m_responses.size(), 1);
@@ -372,7 +372,7 @@
     receiveInterest(command);
   };
 
-  m_fib.insert("/hello").first->addNextHop(m_faceTable.get(face1), 101);
+  m_fib.insert("/hello").first->addNextHop(*m_faceTable.get(face1), 101);
 
   testRemoveNextHop(makeParameters("/hello", face2 + 100));
   BOOST_REQUIRE_EQUAL(m_responses.size(), 1); // face does not exist
@@ -446,9 +446,9 @@
   for (size_t i = 0 ; i < nEntries ; i ++) {
     Name prefix = Name("test").appendSegment(i);
     actualPrefixes.insert(prefix);
-    auto fibEntry = m_fib.insert(prefix).first;
-    fibEntry->addNextHop(m_faceTable.get(addFace()), std::numeric_limits<uint8_t>::max() - 1);
-    fibEntry->addNextHop(m_faceTable.get(addFace()), std::numeric_limits<uint8_t>::max() - 2);
+    fib::Entry* fibEntry = m_fib.insert(prefix).first;
+    fibEntry->addNextHop(*m_faceTable.get(addFace()), std::numeric_limits<uint8_t>::max() - 1);
+    fibEntry->addNextHop(*m_faceTable.get(addFace()), std::numeric_limits<uint8_t>::max() - 2);
   }
 
   receiveInterest(makeInterest("/localhost/nfd/fib/list"));
@@ -476,7 +476,7 @@
     const auto& nextHops = matchedEntry->getNextHops();
     for (auto&& next : nextHops) {
       ndn::nfd::NextHopRecord nextHopRecord;
-      nextHopRecord.setFaceId(next.getFace()->getId());
+      nextHopRecord.setFaceId(next.getFace().getId());
       nextHopRecord.setCost(next.getCost());
       record.addNextHopRecord(nextHopRecord);
     }
diff --git a/tests/daemon/table/fib.t.cpp b/tests/daemon/table/fib.t.cpp
index 30846f4..7071c19 100644
--- a/tests/daemon/table/fib.t.cpp
+++ b/tests/daemon/table/fib.t.cpp
@@ -31,174 +31,142 @@
 #include "tests/test-common.hpp"
 
 namespace nfd {
+namespace fib {
 namespace tests {
 
+using namespace nfd::tests;
+
 BOOST_AUTO_TEST_SUITE(Table)
 BOOST_FIXTURE_TEST_SUITE(TestFib, BaseFixture)
 
-BOOST_AUTO_TEST_CASE(Entry)
+BOOST_AUTO_TEST_CASE(FibEntry)
 {
   Name prefix("ndn:/pxWhfFza");
   shared_ptr<Face> face1 = make_shared<DummyFace>();
   shared_ptr<Face> face2 = make_shared<DummyFace>();
 
-  fib::Entry entry(prefix);
+  Entry entry(prefix);
   BOOST_CHECK_EQUAL(entry.getPrefix(), prefix);
 
-  const fib::NextHopList& nexthops1 = entry.getNextHops();
   // []
-  BOOST_CHECK_EQUAL(nexthops1.size(), 0);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 0);
 
-  entry.addNextHop(face1, 20);
-  const fib::NextHopList& nexthops2 = entry.getNextHops();
+  entry.addNextHop(*face1, 20);
   // [(face1,20)]
-  BOOST_CHECK_EQUAL(nexthops2.size(), 1);
-  BOOST_CHECK_EQUAL(nexthops2.begin()->getFace(), face1);
-  BOOST_CHECK_EQUAL(nexthops2.begin()->getCost(), 20);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 1);
+  BOOST_CHECK_EQUAL(&entry.getNextHops().begin()->getFace(), face1.get());
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getCost(), 20);
 
-  entry.addNextHop(face1, 30);
-  const fib::NextHopList& nexthops3 = entry.getNextHops();
+  entry.addNextHop(*face1, 30);
   // [(face1,30)]
-  BOOST_CHECK_EQUAL(nexthops3.size(), 1);
-  BOOST_CHECK_EQUAL(nexthops3.begin()->getFace(), face1);
-  BOOST_CHECK_EQUAL(nexthops3.begin()->getCost(), 30);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 1);
+  BOOST_CHECK_EQUAL(&entry.getNextHops().begin()->getFace(), face1.get());
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getCost(), 30);
 
-  entry.addNextHop(face2, 40);
-  const fib::NextHopList& nexthops4 = entry.getNextHops();
+  entry.addNextHop(*face2, 40);
   // [(face1,30), (face2,40)]
-  BOOST_CHECK_EQUAL(nexthops4.size(), 2);
-  int i = -1;
-  for (fib::NextHopList::const_iterator it = nexthops4.begin();
-       it != nexthops4.end(); ++it) {
-    ++i;
-    switch (i) {
-      case 0:
-        BOOST_CHECK_EQUAL(it->getFace(), face1);
-        BOOST_CHECK_EQUAL(it->getCost(), 30);
-        break;
-      case 1:
-        BOOST_CHECK_EQUAL(it->getFace(), face2);
-        BOOST_CHECK_EQUAL(it->getCost(), 40);
-        break;
-    }
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 2);
+  {
+    NextHopList::const_iterator it = entry.getNextHops().begin();
+    BOOST_REQUIRE(it != entry.getNextHops().end());
+    BOOST_CHECK_EQUAL(&it->getFace(), face1.get());
+    BOOST_CHECK_EQUAL(it->getCost(), 30);
+
+    ++it;
+    BOOST_REQUIRE(it != entry.getNextHops().end());
+    BOOST_CHECK_EQUAL(&it->getFace(), face2.get());
+    BOOST_CHECK_EQUAL(it->getCost(), 40);
+
+    ++it;
+    BOOST_CHECK(it == entry.getNextHops().end());
   }
 
-  entry.addNextHop(face2, 10);
-  const fib::NextHopList& nexthops5 = entry.getNextHops();
+  entry.addNextHop(*face2, 10);
   // [(face2,10), (face1,30)]
-  BOOST_CHECK_EQUAL(nexthops5.size(), 2);
-  i = -1;
-  for (fib::NextHopList::const_iterator it = nexthops5.begin();
-       it != nexthops5.end(); ++it) {
-    ++i;
-    switch (i) {
-      case 0:
-        BOOST_CHECK_EQUAL(it->getFace(), face2);
-        BOOST_CHECK_EQUAL(it->getCost(), 10);
-        break;
-      case 1:
-        BOOST_CHECK_EQUAL(it->getFace(), face1);
-        BOOST_CHECK_EQUAL(it->getCost(), 30);
-        break;
-    }
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 2);
+  {
+    NextHopList::const_iterator it = entry.getNextHops().begin();
+    BOOST_REQUIRE(it != entry.getNextHops().end());
+    BOOST_CHECK_EQUAL(&it->getFace(), face2.get());
+    BOOST_CHECK_EQUAL(it->getCost(), 10);
+
+    ++it;
+    BOOST_REQUIRE(it != entry.getNextHops().end());
+    BOOST_CHECK_EQUAL(&it->getFace(), face1.get());
+    BOOST_CHECK_EQUAL(it->getCost(), 30);
+
+    ++it;
+    BOOST_CHECK(it == entry.getNextHops().end());
   }
 
-  entry.removeNextHop(face1);
-  const fib::NextHopList& nexthops6 = entry.getNextHops();
+  entry.removeNextHop(*face1);
   // [(face2,10)]
-  BOOST_CHECK_EQUAL(nexthops6.size(), 1);
-  BOOST_CHECK_EQUAL(nexthops6.begin()->getFace(), face2);
-  BOOST_CHECK_EQUAL(nexthops6.begin()->getCost(), 10);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 1);
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getFace().getId(), face2->getId());
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getCost(), 10);
 
-  entry.removeNextHop(face1);
-  const fib::NextHopList& nexthops7 = entry.getNextHops();
+  entry.removeNextHop(*face1);
   // [(face2,10)]
-  BOOST_CHECK_EQUAL(nexthops7.size(), 1);
-  BOOST_CHECK_EQUAL(nexthops7.begin()->getFace(), face2);
-  BOOST_CHECK_EQUAL(nexthops7.begin()->getCost(), 10);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 1);
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getFace().getId(), face2->getId());
+  BOOST_CHECK_EQUAL(entry.getNextHops().begin()->getCost(), 10);
 
-  entry.removeNextHop(face2);
-  const fib::NextHopList& nexthops8 = entry.getNextHops();
+  entry.removeNextHop(*face2);
   // []
-  BOOST_CHECK_EQUAL(nexthops8.size(), 0);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 0);
 
-  entry.removeNextHop(face2);
-  const fib::NextHopList& nexthops9 = entry.getNextHops();
+  entry.removeNextHop(*face2);
   // []
-  BOOST_CHECK_EQUAL(nexthops9.size(), 0);
+  BOOST_CHECK_EQUAL(entry.getNextHops().size(), 0);
 }
 
 BOOST_AUTO_TEST_CASE(Insert_LongestPrefixMatch)
 {
-  Name nameEmpty;
-  Name nameA   ("ndn:/A");
-  Name nameAB  ("ndn:/A/B");
-  Name nameABC ("ndn:/A/B/C");
-  Name nameABCD("ndn:/A/B/C/D");
-  Name nameE   ("ndn:/E");
-
-  std::pair<shared_ptr<fib::Entry>, bool> insertRes;
-  shared_ptr<fib::Entry> entry;
-
   NameTree nameTree;
   Fib fib(nameTree);
+
   // []
   BOOST_CHECK_EQUAL(fib.size(), 0);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A").getPrefix(), "/"); // the empty entry
 
-  entry = fib.findLongestPrefixMatch(nameA);
-  BOOST_REQUIRE(static_cast<bool>(entry)); // the empty entry
-
-  insertRes = fib.insert(nameEmpty);
+  std::pair<Entry*, bool> insertRes = fib.insert("/");
   BOOST_CHECK_EQUAL(insertRes.second, true);
-  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), nameEmpty);
+  BOOST_REQUIRE(insertRes.first != nullptr);
+  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), "/");
   // ['/']
   BOOST_CHECK_EQUAL(fib.size(), 1);
 
-  entry = fib.findLongestPrefixMatch(nameA);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameEmpty);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A").getPrefix(), "/");
 
-  insertRes = fib.insert(nameA);
+  insertRes = fib.insert("/A");
   BOOST_CHECK_EQUAL(insertRes.second, true);
-  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), nameA);
+  BOOST_REQUIRE(insertRes.first != nullptr);
+  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), "/A");
   // ['/', '/A']
   BOOST_CHECK_EQUAL(fib.size(), 2);
 
-  insertRes = fib.insert(nameA);
+  insertRes = fib.insert("/A");
   BOOST_CHECK_EQUAL(insertRes.second, false);
-  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), nameA);
+  BOOST_REQUIRE(insertRes.first != nullptr);
+  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), "/A");
   // ['/', '/A']
   BOOST_CHECK_EQUAL(fib.size(), 2);
 
-  entry = fib.findLongestPrefixMatch(nameA);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameA);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A").getPrefix(), "/A");
 
-  entry = fib.findLongestPrefixMatch(nameABCD);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameA);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A/B/C/D").getPrefix(), "/A");
 
-  insertRes = fib.insert(nameABC);
+  insertRes = fib.insert("/A/B/C");
   BOOST_CHECK_EQUAL(insertRes.second, true);
-  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), nameABC);
+  BOOST_REQUIRE(insertRes.first != nullptr);
+  BOOST_CHECK_EQUAL(insertRes.first->getPrefix(), "/A/B/C");
   // ['/', '/A', '/A/B/C']
   BOOST_CHECK_EQUAL(fib.size(), 3);
 
-  entry = fib.findLongestPrefixMatch(nameA);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameA);
-
-  entry = fib.findLongestPrefixMatch(nameAB);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameA);
-
-  entry = fib.findLongestPrefixMatch(nameABCD);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameABC);
-
-  entry = fib.findLongestPrefixMatch(nameE);
-  BOOST_REQUIRE(static_cast<bool>(entry));
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameEmpty);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A").getPrefix(), "/A");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A/B").getPrefix(), "/A");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/A/B/C/D").getPrefix(), "/A/B/C");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/E").getPrefix(), "/");
 }
 
 BOOST_AUTO_TEST_CASE(LongestPrefixMatchWithPitEntry)
@@ -221,21 +189,13 @@
   shared_ptr<Interest> interestADE = makeInterest(fullNameADE);
   shared_ptr<pit::Entry> pitADE = pit.insert(*interestADE).first;
 
-  size_t nNameTreeEntries = nameTree.size();
+  size_t nNameTreeEntriesBefore = nameTree.size();
 
-  shared_ptr<fib::Entry> entry = fib.findLongestPrefixMatch(*pitAB);
-  BOOST_REQUIRE(entry != nullptr);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), "/A");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch(*pitAB).getPrefix(), "/A");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch(*pitABC).getPrefix(), fullNameABC);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch(*pitADE).getPrefix(), "/A");
 
-  entry = fib.findLongestPrefixMatch(*pitABC);
-  BOOST_REQUIRE(entry != nullptr);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), fullNameABC);
-
-  entry = fib.findLongestPrefixMatch(*pitADE);
-  BOOST_REQUIRE(entry != nullptr);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), "/A");
-
-  BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntries);
+  BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore);
 }
 
 BOOST_AUTO_TEST_CASE(LongestPrefixMatchWithMeasurementsEntry)
@@ -250,79 +210,57 @@
   shared_ptr<measurements::Entry> mAB = measurements.get("/A/B");
   shared_ptr<measurements::Entry> mABCD = measurements.get("/A/B/C/D");
 
-  shared_ptr<fib::Entry> entry = fib.findLongestPrefixMatch(*mAB);
-  BOOST_REQUIRE(entry != nullptr);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), "/A");
-
-  entry = fib.findLongestPrefixMatch(*mABCD);
-  BOOST_REQUIRE(entry != nullptr);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), "/A/B/C");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch(*mAB).getPrefix(), "/A");
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch(*mABCD).getPrefix(), "/A/B/C");
 }
 
 BOOST_AUTO_TEST_CASE(RemoveNextHopFromAllEntries)
 {
   shared_ptr<Face> face1 = make_shared<DummyFace>();
   shared_ptr<Face> face2 = make_shared<DummyFace>();
-  Name nameEmpty("ndn:/");
-  Name nameA("ndn:/A");
-  Name nameB("ndn:/B");
-
-  std::pair<shared_ptr<fib::Entry>, bool> insertRes;
-  shared_ptr<fib::Entry> entry;
 
   NameTree nameTree;
   Fib fib(nameTree);
   // {}
 
-  insertRes = fib.insert(nameA);
-  insertRes.first->addNextHop(face1, 0);
-  insertRes.first->addNextHop(face2, 0);
+  Entry* entryA = fib.insert("/A").first;
+  entryA->addNextHop(*face1, 0);
+  entryA->addNextHop(*face2, 0);
   // {'/A':[1,2]}
 
-  insertRes = fib.insert(nameB);
-  insertRes.first->addNextHop(face1, 0);
+  Entry* entryB = fib.insert("/B").first;
+  entryB->addNextHop(*face1, 0);
   // {'/A':[1,2], '/B':[1]}
   BOOST_CHECK_EQUAL(fib.size(), 2);
 
-  insertRes = fib.insert("/C");
-  insertRes.first->addNextHop(face2, 1);
+  Entry* entryC = fib.insert("/C").first;
+  entryC->addNextHop(*face2, 1);
   // {'/A':[1,2], '/B':[1], '/C':[2]}
   BOOST_CHECK_EQUAL(fib.size(), 3);
 
-  insertRes = fib.insert("/B/1");
-  insertRes.first->addNextHop(face1, 0);
+  Entry* entryB1 = fib.insert("/B/1").first;
+  entryB1->addNextHop(*face1, 0);
   // {'/A':[1,2], '/B':[1], '/B/1':[1], '/C':[2]}
   BOOST_CHECK_EQUAL(fib.size(), 4);
 
-  insertRes = fib.insert("/B/1/2");
-  insertRes.first->addNextHop(face1, 0);
+  Entry* entryB12 = fib.insert("/B/1/2").first;
+  entryB12->addNextHop(*face1, 0);
   // {'/A':[1,2], '/B':[1], '/B/1':[1], '/B/1/2':[1], '/C':[2]}
   BOOST_CHECK_EQUAL(fib.size(), 5);
 
-  insertRes = fib.insert("/B/1/2/3");
-  insertRes.first->addNextHop(face1, 0);
-  // {'/A':[1,2], '/B':[1], '/B/1':[1], '/B/1/2':[1], '/B/1/3':[1], '/C':[2]}
-  BOOST_CHECK_EQUAL(fib.size(), 6);
-
-  insertRes = fib.insert("/B/1/2/3/4");
-  insertRes.first->addNextHop(face1, 0);
-  // {'/A':[1,2], '/B':[1], '/B/1':[1], '/B/1/2':[1], '/B/1/2/3':[1], '/B/1/2/3/4':[1], '/C':[2]}
-  BOOST_CHECK_EQUAL(fib.size(), 7);
-
   /////////////
 
-  fib.removeNextHopFromAllEntries(face1);
+  fib.removeNextHopFromAllEntries(*face1);
   // {'/A':[2], '/C':[2]}
   BOOST_CHECK_EQUAL(fib.size(), 2);
 
-  entry = fib.findLongestPrefixMatch(nameA);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameA);
-  const fib::NextHopList& nexthopsA = entry->getNextHops();
+  const Entry& foundA = fib.findLongestPrefixMatch("/A");
+  BOOST_CHECK_EQUAL(foundA.getPrefix(), "/A");
+  const NextHopList& nexthopsA = foundA.getNextHops();
   BOOST_CHECK_EQUAL(nexthopsA.size(), 1);
-  BOOST_CHECK_EQUAL(nexthopsA.begin()->getFace(), face2);
+  BOOST_CHECK_EQUAL(&nexthopsA.begin()->getFace(), face2.get());
 
-  entry = fib.findLongestPrefixMatch(nameB);
-  BOOST_CHECK_EQUAL(entry->getPrefix(), nameEmpty);
+  BOOST_CHECK_EQUAL(fib.findLongestPrefixMatch("/B").getPrefix(), "/");
 }
 
 BOOST_AUTO_TEST_CASE(RemoveNextHopFromManyEntries)
@@ -332,40 +270,32 @@
   shared_ptr<Face> face1 = make_shared<DummyFace>();
 
   for (uint64_t i = 0; i < 300; ++i) {
-    shared_ptr<fib::Entry> entry = fib.insert(Name("/P").appendVersion(i)).first;
-    entry->addNextHop(face1, 0);
+    Entry* entry = fib.insert(Name("/P").appendVersion(i)).first;
+    entry->addNextHop(*face1, 0);
   }
   BOOST_CHECK_EQUAL(fib.size(), 300);
 
-  fib.removeNextHopFromAllEntries(face1);
+  fib.removeNextHopFromAllEntries(*face1);
   BOOST_CHECK_EQUAL(fib.size(), 0);
 }
 
 void
-validateFindExactMatch(const Fib& fib, const Name& target)
+validateFindExactMatch(Fib& fib, const Name& target)
 {
-  shared_ptr<fib::Entry> entry = fib.findExactMatch(target);
-  if (static_cast<bool>(entry))
-    {
-      BOOST_CHECK_EQUAL(entry->getPrefix(), target);
-    }
-  else
-    {
-      BOOST_FAIL("No entry found for " << target);
-    }
+  const Entry* entry = fib.findExactMatch(target);
+  BOOST_REQUIRE_MESSAGE(entry != nullptr, "No entry found for " << target);
+  BOOST_CHECK_EQUAL(entry->getPrefix(), target);
 }
 
 void
-validateNoExactMatch(const Fib& fib, const Name& target)
+validateNoExactMatch(Fib& fib, const Name& target)
 {
-  shared_ptr<fib::Entry> entry = fib.findExactMatch(target);
-  if (static_cast<bool>(entry))
-    {
-      BOOST_FAIL("Found unexpected entry for " << target);
-    }
+  const Entry* entry = fib.findExactMatch(target);
+  BOOST_CHECK_MESSAGE(entry == nullptr,
+                      "Found unexpected entry for " << target);
 }
 
-BOOST_AUTO_TEST_CASE(FindExactMatch)
+BOOST_AUTO_TEST_CASE(ExactMatch)
 {
   NameTree nameTree;
   Fib fib(nameTree);
@@ -376,20 +306,27 @@
   validateFindExactMatch(fib, "/A");
   validateFindExactMatch(fib, "/A/B");
   validateFindExactMatch(fib, "/A/B/C");
+
   validateNoExactMatch(fib, "/");
-
   validateNoExactMatch(fib, "/does/not/exist");
+}
 
-  NameTree gapNameTree;
-  Fib gapFib(nameTree);
+BOOST_AUTO_TEST_CASE(ExactMatchGap)
+{
+  NameTree nameTree;
+  Fib fib(nameTree);
   fib.insert("/X");
   fib.insert("/X/Y/Z");
 
-  validateNoExactMatch(gapFib, "/X/Y");
+  validateNoExactMatch(fib, "/X/Y");
+}
 
-  NameTree emptyNameTree;
-  Fib emptyFib(emptyNameTree);
-  validateNoExactMatch(emptyFib, "/nothing/here");
+BOOST_AUTO_TEST_CASE(ExactMatchEmpty)
+{
+  NameTree nameTree;
+  Fib fib(nameTree);
+  validateNoExactMatch(fib, "/");
+  validateNoExactMatch(fib, "/nothing/here");
 }
 
 void
@@ -397,24 +334,12 @@
 {
   fib.erase(target);
 
-  shared_ptr<fib::Entry> entry = fib.findExactMatch(target);
-  if (static_cast<bool>(entry))
-    {
-      BOOST_FAIL("Found \"removed\" entry for " << target);
-    }
+  const Entry* entry = fib.findExactMatch(target);
+  BOOST_CHECK_MESSAGE(entry == nullptr, "Found \"removed\" entry for " << target);
 }
 
 BOOST_AUTO_TEST_CASE(Erase)
 {
-  NameTree emptyNameTree;
-  Fib emptyFib(emptyNameTree);
-
-  emptyFib.erase("/does/not/exist"); // crash test
-
-  validateErase(emptyFib, "/");
-
-  emptyFib.erase("/still/does/not/exist"); // crash test
-
   NameTree nameTree;
   Fib fib(nameTree);
   fib.insert("/");
@@ -439,15 +364,28 @@
 
   validateErase(fib, "/");
   validateNoExactMatch(fib, "/");
+}
 
-  NameTree gapNameTree;
-  Fib gapFib(gapNameTree);
-  gapFib.insert("/X");
-  gapFib.insert("/X/Y/Z");
+BOOST_AUTO_TEST_CASE(EraseGap)
+{
+  NameTree nameTree;
+  Fib fib(nameTree);
+  fib.insert("/X");
+  fib.insert("/X/Y/Z");
 
-  gapFib.erase("/X/Y"); //should do nothing
-  validateFindExactMatch(gapFib, "/X");
-  validateFindExactMatch(gapFib, "/X/Y/Z");
+  fib.erase("/X/Y"); //should do nothing
+  validateFindExactMatch(fib, "/X");
+  validateFindExactMatch(fib, "/X/Y/Z");
+}
+
+BOOST_AUTO_TEST_CASE(EraseEmpty)
+{
+  NameTree nameTree;
+  Fib fib(nameTree);
+
+  BOOST_CHECK_NO_THROW(fib.erase("/does/not/exist"));
+  validateErase(fib, "/");
+  BOOST_CHECK_NO_THROW(fib.erase("/still/does/not/exist"));
 }
 
 BOOST_AUTO_TEST_CASE(EraseNameTreeEntry)
@@ -456,8 +394,8 @@
   Fib fib(nameTree);
   size_t nNameTreeEntriesBefore = nameTree.size();
 
-  fib.insert("ndn:/A/B/C");
-  fib.erase("ndn:/A/B/C");
+  fib.insert("/A/B/C");
+  fib.erase("/A/B/C");
   BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore);
 }
 
@@ -475,11 +413,7 @@
   fib.insert(nameABC);
   fib.insert(nameRoot);
 
-  std::set<Name> expected;
-  expected.insert(nameA);
-  expected.insert(nameAB);
-  expected.insert(nameABC);
-  expected.insert(nameRoot);
+  std::set<Name> expected{nameA, nameAB, nameABC, nameRoot};
 
   for (Fib::const_iterator it = fib.begin(); it != fib.end(); it++) {
     bool isInSet = expected.find(it->getPrefix()) != expected.end();
@@ -494,4 +428,5 @@
 BOOST_AUTO_TEST_SUITE_END() // Table
 
 } // namespace tests
+} // namespace fib
 } // namespace nfd
diff --git a/tests/daemon/table/measurements.t.cpp b/tests/daemon/table/measurements.t.cpp
index bbf1903..c8b2e27 100644
--- a/tests/daemon/table/measurements.t.cpp
+++ b/tests/daemon/table/measurements.t.cpp
@@ -70,8 +70,8 @@
 {
   Fib fib(nameTree);
 
-  shared_ptr<fib::Entry> fibA = fib.insert("/A").first;
-  shared_ptr<fib::Entry> fibAB = fib.insert("/A/B").first;
+  const fib::Entry* fibA = fib.insert("/A").first;
+  const fib::Entry* fibAB = fib.insert("/A/B").first;
 
   shared_ptr<measurements::Entry> entryA = measurements.get(*fibA);
   BOOST_REQUIRE(entryA != nullptr);
@@ -86,9 +86,9 @@
 {
   Fib fib(nameTree);
 
-  shared_ptr<fib::Entry> fib0 = fib.findLongestPrefixMatch("/");
+  const fib::Entry& fib0 = fib.findLongestPrefixMatch("/");
 
-  shared_ptr<measurements::Entry> entry0 = measurements.get(*fib0);
+  shared_ptr<measurements::Entry> entry0 = measurements.get(fib0);
   BOOST_REQUIRE(entry0 != nullptr);
   BOOST_CHECK_EQUAL(entry0->getName(), "/");
 }
diff --git a/tests/daemon/table/name-tree.t.cpp b/tests/daemon/table/name-tree.t.cpp
index 2a5bd40..a79e2d5 100644
--- a/tests/daemon/table/name-tree.t.cpp
+++ b/tests/daemon/table/name-tree.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -66,8 +66,8 @@
   std::vector<shared_ptr<name_tree::Entry> >& childList = npe->getChildren();
   BOOST_CHECK_EQUAL(childList.size(), static_cast<size_t>(0));
 
-  shared_ptr<fib::Entry> fib = npe->getFibEntry();
-  BOOST_CHECK(!static_cast<bool>(fib));
+  fib::Entry* fib = npe->getFibEntry();
+  BOOST_CHECK(fib == nullptr);
 
   const std::vector< shared_ptr<pit::Entry> >& pitList = npe->getPitEntries();
   BOOST_CHECK_EQUAL(pitList.size(), static_cast<size_t>(0));
@@ -84,14 +84,12 @@
 
   // Insert FIB
 
-  shared_ptr<fib::Entry> fibEntry(new fib::Entry(prefix));
-  shared_ptr<fib::Entry> fibEntryParent(new fib::Entry(parentName));
+  npe->setFibEntry(make_unique<fib::Entry>(prefix));
+  BOOST_REQUIRE(npe->getFibEntry() != nullptr);
+  BOOST_CHECK_EQUAL(npe->getFibEntry()->getPrefix(), prefix);
 
-  npe->setFibEntry(fibEntry);
-  BOOST_CHECK_EQUAL(npe->getFibEntry(), fibEntry);
-
-  npe->setFibEntry(shared_ptr<fib::Entry>());
-  BOOST_CHECK(!static_cast<bool>(npe->getFibEntry()));
+  npe->setFibEntry(nullptr);
+  BOOST_CHECK(npe->getFibEntry() == nullptr);
 
   // Insert a PIT
 
