diff --git a/tests/daemon/face/internal-client-face.t.cpp b/tests/daemon/face/internal-client-face.t.cpp
deleted file mode 100644
index 0b2295c..0000000
--- a/tests/daemon/face/internal-client-face.t.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
- * Copyright (c) 2014-2015,  Regents of the University of California,
- *                           Arizona Board of Regents,
- *                           Colorado State University,
- *                           University Pierre & Marie Curie, Sorbonne University,
- *                           Washington University in St. Louis,
- *                           Beijing Institute of Technology,
- *                           The University of Memphis.
- *
- * This file is part of NFD (Named Data Networking Forwarding Daemon).
- * See AUTHORS.md for complete list of NFD authors and contributors.
- *
- * NFD is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
- *
- * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "face/internal-client-face.hpp"
-#include "face/internal-face.hpp"
-#include "tests/test-common.hpp"
-#include "tests/identity-management-fixture.hpp"
-
-namespace nfd {
-namespace tests {
-
-class InternalClientFaceFixture : public UnitTestTimeFixture
-                                , public IdentityManagementFixture
-{
-public:
-  InternalClientFaceFixture()
-    : m_internalFace(make_shared<InternalFace>())
-    , m_face(makeInternalClientFace(m_internalFace, m_keyChain))
-  {
-  }
-
-protected:
-  shared_ptr<InternalFace> m_internalFace;
-  shared_ptr<InternalClientFace> m_face;
-};
-
-BOOST_FIXTURE_TEST_SUITE(FaceInternalClientFace, InternalClientFaceFixture)
-
-BOOST_AUTO_TEST_CASE(ExpressInterest)
-{
-  bool didReceiveDataBack = false;
-  bool didTimeoutCallbackFire = false;
-  Data receivedData;
-
-  auto expressInterest = [&] (shared_ptr<Interest> interest) {
-    didReceiveDataBack = false;
-    didTimeoutCallbackFire = false;
-    m_face->expressInterest(interest->setInterestLifetime(time::milliseconds(100)),
-                            [&] (const Interest& interest, Data& data) {
-                              didReceiveDataBack = true;
-                              receivedData = data;
-                            },
-                            bind([&] { didTimeoutCallbackFire = true; }));
-    advanceClocks(time::milliseconds(1));
-  };
-
-  expressInterest(makeInterest("/test/timeout"));
-  advanceClocks(time::milliseconds(1), 200); // wait for time out
-  BOOST_CHECK(didTimeoutCallbackFire);
-
-  auto dataToSend = makeData("/test/data")->setContent(Block("\x81\x01\0x01", 3));
-  expressInterest(makeInterest("/test/data"));
-  m_internalFace->sendData(dataToSend); // send data to satisfy the expressed interest
-  advanceClocks(time::milliseconds(1));
-  BOOST_CHECK(didReceiveDataBack);
-  BOOST_CHECK(receivedData.wireEncode() == dataToSend.wireEncode());
-}
-
-BOOST_AUTO_TEST_CASE(InterestFilter)
-{
-  bool didOnInterestCallbackFire = false;
-  Block receivedBlock, expectedBlock;
-
-  auto testSendInterest = [&] (shared_ptr<Interest> interest) {
-    didOnInterestCallbackFire = false;
-    expectedBlock = interest->wireEncode();
-    m_internalFace->sendInterest(*interest);
-  };
-
-  testSendInterest(makeInterest("/test/filter")); // no filter is set now
-  BOOST_CHECK(!didOnInterestCallbackFire);
-
-  // set filter
-  auto filter = m_face->setInterestFilter("/test/filter",
-                                          bind([&](const Interest& interset) {
-                                              didOnInterestCallbackFire = true;
-                                              receivedBlock = interset.wireEncode();
-                                            }, _2));
-  advanceClocks(time::milliseconds(1));
-
-  testSendInterest(makeInterest("/test/filter"));
-  BOOST_CHECK(didOnInterestCallbackFire);
-  BOOST_CHECK(receivedBlock == expectedBlock);
-
-  // unset filter
-  didOnInterestCallbackFire = false;
-  m_face->unsetInterestFilter(filter);
-  advanceClocks(time::milliseconds(1));
-  testSendInterest(makeInterest("/test/filter"));
-  BOOST_CHECK(!didOnInterestCallbackFire);
-}
-
-BOOST_AUTO_TEST_CASE(PutData)
-{
-  bool didInternalFaceReceiveData = false;
-  Data receivedData;
-  m_internalFace->onReceiveData.connect([&] (const Data& data) {
-      didInternalFaceReceiveData = true;
-      receivedData = data;
-    });
-
-  auto dataToPut = makeData("/test/put/data");
-  m_face->put(*dataToPut);
-  advanceClocks(time::milliseconds(1));
-  BOOST_CHECK(didInternalFaceReceiveData);
-  BOOST_CHECK(receivedData.wireEncode() == dataToPut->wireEncode());
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace tests
-} // namespace nfd
diff --git a/tests/daemon/face/internal-face.t.cpp b/tests/daemon/face/internal-face.t.cpp
index 44f5e7b..eab0b67 100644
--- a/tests/daemon/face/internal-face.t.cpp
+++ b/tests/daemon/face/internal-face.t.cpp
@@ -24,120 +24,194 @@
  */
 
 #include "face/internal-face.hpp"
+#include "face/lp-face-wrapper.hpp"
 #include "tests/test-common.hpp"
+#include "tests/identity-management-fixture.hpp"
 
 namespace nfd {
+namespace face {
 namespace tests {
 
-class InternalFaceFixture : protected BaseFixture
+using namespace nfd::tests;
+
+BOOST_AUTO_TEST_SUITE(Face)
+
+class InternalFaceFixture : public UnitTestTimeFixture
+                          , public IdentityManagementFixture
 {
 public:
   InternalFaceFixture()
   {
-    m_face.onReceiveInterest.connect([this] (const Interest& interest) {
-        inInterests.push_back(interest);
-      });
-    m_face.onSendInterest.connect([this] (const Interest& interest) {
-        outInterests.push_back(interest);
-      });
-    m_face.onReceiveData.connect([this] (const Data& data) {
-        inData.push_back(data);
-      });
-    m_face.onSendData.connect([this] (const Data& data) {
-        outData.push_back(data);
-      });
+    std::tie(forwarderFace, clientFace) = makeInternalFace(m_keyChain);;
+
+    // TODO#3172 connect to afterReceive* signals
+    forwarderFace->onReceiveInterest.connect(
+      [this] (const Interest& interest) { receivedInterests.push_back(interest); } );
+    forwarderFace->onReceiveData.connect(
+      [this] (const Data& data) { receivedData.push_back(data); } );
+    forwarderFace->onReceiveNack.connect(
+      [this] (const lp::Nack& nack) { receivedNacks.push_back(nack); } );
   }
 
 protected:
-  InternalFace m_face;
-  std::vector<Interest> inInterests;
-  std::vector<Interest> outInterests;
-  std::vector<Data> inData;
-  std::vector<Data> outData;
+  shared_ptr<nfd::Face> forwarderFace;
+  shared_ptr<ndn::Face> clientFace;
+
+  std::vector<Interest> receivedInterests;
+  std::vector<Data> receivedData;
+  std::vector<lp::Nack> receivedNacks;
 };
 
-BOOST_FIXTURE_TEST_SUITE(FaceInternalFace, InternalFaceFixture)
+BOOST_FIXTURE_TEST_SUITE(TestInternalFace, InternalFaceFixture)
 
-BOOST_AUTO_TEST_CASE(SendInterest)
+// note: "send" and "receive" in test case names refer to the direction seen on forwarderFace.
+// i.e. "send" means transmission from forwarder to client,
+//      "receive" means transmission client to forwarder.
+
+BOOST_AUTO_TEST_CASE(ReceiveInterestTimeout)
 {
-  BOOST_CHECK(outInterests.empty());
+  shared_ptr<Interest> interest = makeInterest("/TLETccRv");
+  interest->setInterestLifetime(time::milliseconds(100));
 
-  auto interest = makeInterest("/test/send/interest");
-  Block expectedBlock = interest->wireEncode(); // assign a value to nonce
-  m_face.sendInterest(*interest);
+  bool hasTimeout = false;
+  clientFace->expressInterest(*interest,
+    bind([] { BOOST_ERROR("unexpected Data"); }),
+    bind([] { BOOST_ERROR("unexpected Nack"); }),
+    bind([&hasTimeout] { hasTimeout = true; }));
+  this->advanceClocks(time::milliseconds(1), 10);
 
-  BOOST_CHECK_EQUAL(outInterests.size(), 1);
-  BOOST_CHECK(outInterests[0].wireEncode() == expectedBlock);
+  BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
+  BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/TLETccRv");
+
+  this->advanceClocks(time::milliseconds(1), 100);
+
+  BOOST_CHECK(hasTimeout);
 }
 
-BOOST_AUTO_TEST_CASE(SendData)
+BOOST_AUTO_TEST_CASE(ReceiveInterestSendData)
 {
-  BOOST_CHECK(outData.empty());
+  shared_ptr<Interest> interest = makeInterest("/PQstEJGdL");
 
-  auto data = makeData("/test/send/data");
-  m_face.sendData(*data);
+  bool hasReceivedData = false;
+  clientFace->expressInterest(*interest,
+    [&hasReceivedData] (const Interest&, const Data& data) {
+      hasReceivedData = true;
+      BOOST_CHECK_EQUAL(data.getName(), "/PQstEJGdL/aI7oCrDXNX");
+    },
+    bind([] { BOOST_ERROR("unexpected Nack"); }),
+    bind([] { BOOST_ERROR("unexpected timeout"); }));
+  this->advanceClocks(time::milliseconds(1), 10);
 
-  BOOST_CHECK_EQUAL(outData.size(), 1);
-  BOOST_CHECK(outData[0].wireEncode() == data->wireEncode());
+  BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
+  BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/PQstEJGdL");
+
+  shared_ptr<Data> data = makeData("/PQstEJGdL/aI7oCrDXNX");
+  forwarderFace->sendData(*data);
+  this->advanceClocks(time::milliseconds(1), 10);
+
+  BOOST_CHECK(hasReceivedData);
 }
 
-BOOST_AUTO_TEST_CASE(ReceiveInterest)
+BOOST_AUTO_TEST_CASE(ReceiveInterestSendNack)
 {
-  BOOST_CHECK(inInterests.empty());
+  shared_ptr<Interest> interest = makeInterest("/1HrsRM1X", 152);
 
-  auto interest = makeInterest("/test/receive/interest");
-  Block expectedBlock = interest->wireEncode(); // assign a value to nonce
-  m_face.receiveInterest(*interest);
+  bool hasReceivedNack = false;
+  clientFace->expressInterest(*interest,
+    bind([] { BOOST_ERROR("unexpected Data"); }),
+    [&hasReceivedNack] (const Interest&, const lp::Nack& nack) {
+      hasReceivedNack = true;
+      BOOST_CHECK_EQUAL(nack.getReason(), lp::NackReason::NO_ROUTE);
+    },
+    bind([] { BOOST_ERROR("unexpected timeout"); }));
+  this->advanceClocks(time::milliseconds(1), 10);
 
-  BOOST_CHECK_EQUAL(inInterests.size(), 1);
-  BOOST_CHECK(inInterests[0].wireEncode() == expectedBlock);
+  BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
+  BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/1HrsRM1X");
+
+  lp::Nack nack = makeNack("/1HrsRM1X", 152, lp::NackReason::NO_ROUTE);
+  forwarderFace->sendNack(nack);
+  this->advanceClocks(time::milliseconds(1), 10);
+
+  BOOST_CHECK(hasReceivedNack);
 }
 
-BOOST_AUTO_TEST_CASE(ReceiveData)
+BOOST_AUTO_TEST_CASE(SendInterestReceiveData)
 {
-  BOOST_CHECK(inData.empty());
+  bool hasDeliveredInterest = false;
+  clientFace->setInterestFilter("/Wpc8TnEeoF",
+    [this, &hasDeliveredInterest] (const ndn::InterestFilter&, const Interest& interest) {
+      hasDeliveredInterest = true;
+      BOOST_CHECK_EQUAL(interest.getName(), "/Wpc8TnEeoF/f6SzV8hD");
 
-  auto data = makeData("/test/send/data");
-  m_face.receiveData(*data);
+      shared_ptr<Data> data = makeData("/Wpc8TnEeoF/f6SzV8hD/3uytUJCuIi");
+      clientFace->put(*data);
+    });
 
-  BOOST_CHECK_EQUAL(inData.size(), 1);
-  BOOST_CHECK(inData[0].wireEncode() == data->wireEncode());
+  shared_ptr<Interest> interest = makeInterest("/Wpc8TnEeoF/f6SzV8hD");
+  forwarderFace->sendInterest(*interest);
+  this->advanceClocks(time::milliseconds(1), 10);
+
+  BOOST_CHECK(hasDeliveredInterest);
+  BOOST_REQUIRE_EQUAL(receivedData.size(), 1);
+  BOOST_CHECK_EQUAL(receivedData.back().getName(), "/Wpc8TnEeoF/f6SzV8hD/3uytUJCuIi");
 }
 
-BOOST_AUTO_TEST_CASE(ReceiveBlock)
+BOOST_AUTO_TEST_CASE(SendInterestReceiveNack)
 {
-  BOOST_CHECK(inInterests.empty());
-  BOOST_CHECK(inData.empty());
+  bool hasDeliveredInterest = false;
+  clientFace->setInterestFilter("/4YgJKWcXN",
+    [this, &hasDeliveredInterest] (const ndn::InterestFilter&, const Interest& interest) {
+      hasDeliveredInterest = true;
+      BOOST_CHECK_EQUAL(interest.getName(), "/4YgJKWcXN/5oaTe05o");
 
-  Block interestBlock = makeInterest("test/receive/interest")->wireEncode();
-  m_face.receive(interestBlock);
-  BOOST_CHECK_EQUAL(inInterests.size(), 1);
-  BOOST_CHECK(inInterests[0].wireEncode() == interestBlock);
+      lp::Nack nack = makeNack("/4YgJKWcXN/5oaTe05o", 191, lp::NackReason::NO_ROUTE);
+      clientFace->put(nack);
+    });
 
-  Block dataBlock = makeData("test/receive/data")->wireEncode();
-  m_face.receive(dataBlock);
-  BOOST_CHECK_EQUAL(inData.size(), 1);
-  BOOST_CHECK(inData[0].wireEncode() == dataBlock);
+  shared_ptr<Interest> interest = makeInterest("/4YgJKWcXN/5oaTe05o", 191);
+  forwarderFace->sendInterest(*interest);
+  this->advanceClocks(time::milliseconds(1), 10);
+
+  BOOST_CHECK(hasDeliveredInterest);
+  BOOST_REQUIRE_EQUAL(receivedNacks.size(), 1);
+  BOOST_CHECK_EQUAL(receivedNacks.back().getReason(), lp::NackReason::NO_ROUTE);
 }
 
-BOOST_AUTO_TEST_CASE(ExtractPacketFromBlock)
+BOOST_AUTO_TEST_CASE(CloseForwarderFace)
 {
-  {
-    Block block = makeInterest("/test/interest")->wireEncode();
-    const Block& payload = ndn::nfd::LocalControlHeader::getPayload(block);
-    auto interest = m_face.extractPacketFromBlock<Interest>(block, payload);
-    BOOST_CHECK(interest->wireEncode() == block);
-  }
+  forwarderFace->close();
+  this->advanceClocks(time::milliseconds(1), 10);
+  BOOST_CHECK_EQUAL(static_pointer_cast<face::LpFaceWrapper>(forwarderFace)->getLpFace()->getState(), FaceState::CLOSED);
+  forwarderFace.reset();
 
-  {
-    Block block = makeData("/test/data")->wireEncode();
-    const Block& payload = ndn::nfd::LocalControlHeader::getPayload(block);
-    auto data = m_face.extractPacketFromBlock<Data>(block, payload);
-    BOOST_CHECK(data->wireEncode() == block);
-  }
+  shared_ptr<Interest> interest = makeInterest("/zpHsVesu0B");
+  interest->setInterestLifetime(time::milliseconds(100));
+
+  bool hasTimeout = false;
+  clientFace->expressInterest(*interest,
+    bind([] { BOOST_ERROR("unexpected Data"); }),
+    bind([] { BOOST_ERROR("unexpected Nack"); }),
+    bind([&hasTimeout] { hasTimeout = true; }));
+  BOOST_CHECK_NO_THROW(this->advanceClocks(time::milliseconds(1), 200));
+
+  BOOST_CHECK_EQUAL(receivedInterests.size(), 0);
+  BOOST_CHECK(hasTimeout);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_CASE(CloseClientFace)
+{
+  g_io.poll(); // #3248 workaround
+  clientFace.reset();
+
+  shared_ptr<Interest> interest = makeInterest("/aau42XQqb");
+  forwarderFace->sendInterest(*interest);
+  BOOST_CHECK_NO_THROW(this->advanceClocks(time::milliseconds(1), 10));
+}
+
+BOOST_AUTO_TEST_SUITE_END() // TestInternalFace
+BOOST_AUTO_TEST_SUITE_END() // Face
 
 } // namespace tests
+} // namespace face
 } // namespace nfd
diff --git a/tests/daemon/fw/topology-tester.cpp b/tests/daemon/fw/topology-tester.cpp
index 10a0b31..8b94abc 100644
--- a/tests/daemon/fw/topology-tester.cpp
+++ b/tests/daemon/fw/topology-tester.cpp
@@ -31,64 +31,29 @@
 namespace fw {
 namespace tests {
 
+using face::InternalTransportBase;
+using face::InternalForwarderTransport;
+using face::InternalClientTransport;
 using face::LpFaceWrapper;
+using face::GenericLinkService;
 
-TopologyForwarderTransport::TopologyForwarderTransport(
-    const FaceUri& localUri, const FaceUri& remoteUri,
-    ndn::nfd::FaceScope scope, ndn::nfd::LinkType linkType)
-{
-  this->setLocalUri(localUri);
-  this->setRemoteUri(remoteUri);
-  this->setScope(scope);
-  this->setPersistency(ndn::nfd::FACE_PERSISTENCY_PERMANENT);
-  this->setLinkType(linkType);
-}
-
-void
-TopologyForwarderTransport::receiveFromTopology(const Block& packet)
-{
-  Packet p;
-  p.packet = packet;
-  this->receive(std::move(p));
-}
-
-void
-TopologyForwarderTransport::doSend(Packet&& packet)
-{
-  this->emitSignal(afterSend, packet.packet);
-}
-
-void
-TopologyClientTransport::receiveFromTopology(const Block& packet)
-{
-  if (m_receiveCallback) {
-    m_receiveCallback(packet);
-  }
-}
-
-void
-TopologyClientTransport::send(const Block& wire)
-{
-  this->emitSignal(afterSend, wire);
-}
-
-void
-TopologyClientTransport::send(const Block& header, const Block& payload)
-{
-  ndn::EncodingBuffer encoder(header.size() + payload.size(), header.size() + payload.size());
-  encoder.appendByteArray(header.wire(), header.size());
-  encoder.appendByteArray(payload.wire(), payload.size());
-
-  this->send(encoder.block());
-}
-
-TopologyLinkBase::TopologyLinkBase()
+TopologyLink::TopologyLink(const time::nanoseconds& delay)
   : m_isUp(true)
+  , m_delay(delay)
 {
+  BOOST_ASSERT(delay > time::nanoseconds::zero());
+  // zero delay does not work on OSX
 }
 
 void
-TopologyLinkBase::attachTransport(TopologyNode i, TopologyTransportBase* transport)
+TopologyLink::addFace(TopologyNode i, shared_ptr<LpFaceWrapper> face)
+{
+  this->attachTransport(i, dynamic_cast<InternalTransportBase*>(face->getLpFace()->getTransport()));
+  m_faces[i] = face;
+}
+
+void
+TopologyLink::attachTransport(TopologyNode i, InternalTransportBase* transport)
 {
   BOOST_ASSERT(transport != nullptr);
   BOOST_ASSERT(m_transports.count(i) == 0);
@@ -98,7 +63,7 @@
 }
 
 void
-TopologyLinkBase::transmit(TopologyNode i, const Block& packet)
+TopologyLink::transmit(TopologyNode i, const Block& packet)
 {
   if (!m_isUp) {
     return;
@@ -109,49 +74,38 @@
       continue;
     }
 
-    TopologyTransportBase* recipient = p.second;
+    InternalTransportBase* recipient = p.second;
     this->scheduleReceive(recipient, packet);
   }
 }
 
-TopologyLink::TopologyLink(const time::nanoseconds& delay)
-  : m_delay(delay)
-{
-  BOOST_ASSERT(delay > time::nanoseconds::zero());
-  // zero delay does not work on OSX
-}
-
 void
-TopologyLink::addFace(TopologyNode i, shared_ptr<LpFaceWrapper> face)
-{
-  this->attachTransport(i, dynamic_cast<TopologyTransportBase*>(face->getLpFace()->getTransport()));
-  m_faces[i] = face;
-}
-
-void
-TopologyLink::scheduleReceive(TopologyTransportBase* recipient, const Block& packet)
+TopologyLink::scheduleReceive(InternalTransportBase* recipient, const Block& packet)
 {
   scheduler::schedule(m_delay, [packet, recipient] {
-    recipient->receiveFromTopology(packet);
+    recipient->receiveFromLink(packet);
   });
 }
 
-TopologyAppLink::TopologyAppLink(shared_ptr<LpFaceWrapper> face)
-  : m_face(face)
+TopologyAppLink::TopologyAppLink(shared_ptr<LpFaceWrapper> forwarderFace)
+  : m_face(forwarderFace)
+  , m_forwarderTransport(static_cast<InternalForwarderTransport*>(forwarderFace->getLpFace()->getTransport()))
+  , m_clientTransport(make_shared<InternalClientTransport>())
+  , m_client(make_shared<ndn::Face>(m_clientTransport, getGlobalIoService()))
 {
-  this->attachTransport(0, dynamic_cast<TopologyTransportBase*>(face->getLpFace()->getTransport()));
-
-  auto clientTransport = make_shared<TopologyClientTransport>();
-  m_client = make_shared<ndn::Face>(clientTransport, getGlobalIoService());
-  this->attachTransport(1, clientTransport.get());
+  this->recover();
 }
 
 void
-TopologyAppLink::scheduleReceive(TopologyTransportBase* recipient, const Block& packet)
+TopologyAppLink::fail()
 {
-  getGlobalIoService().post([packet, recipient] {
-    recipient->receiveFromTopology(packet);
-  });
+  m_clientTransport->connectToForwarder(nullptr);
+}
+
+void
+TopologyAppLink::recover()
+{
+  m_clientTransport->connectToForwarder(m_forwarderTransport);
 }
 
 TopologyNode
@@ -179,8 +133,8 @@
     Forwarder& forwarder = this->getForwarder(i);
     FaceUri localUri("topology://" + m_forwarderLabels.at(i) + "/" + label);
 
-    auto service = make_unique<face::GenericLinkService>();
-    auto transport = make_unique<TopologyForwarderTransport>(localUri, remoteUri,
+    auto service = make_unique<GenericLinkService>();
+    auto transport = make_unique<InternalForwarderTransport>(localUri, remoteUri,
                      ndn::nfd::FACE_SCOPE_NON_LOCAL, linkType);
     auto face = make_unique<LpFace>(std::move(service), std::move(transport));
     auto faceW = make_shared<LpFaceWrapper>(std::move(face));
@@ -200,8 +154,8 @@
   FaceUri localUri("topology://" + m_forwarderLabels.at(i) + "/local/" + label);
   FaceUri remoteUri("topology://" + m_forwarderLabels.at(i) + "/app/" + label);
 
-  auto service = make_unique<face::GenericLinkService>();
-  auto transport = make_unique<TopologyForwarderTransport>(localUri, remoteUri,
+  auto service = make_unique<GenericLinkService>();
+  auto transport = make_unique<InternalForwarderTransport>(localUri, remoteUri,
                    ndn::nfd::FACE_SCOPE_LOCAL, ndn::nfd::LINK_TYPE_POINT_TO_POINT);
   auto face = make_unique<LpFace>(std::move(service), std::move(transport));
   auto faceW = make_shared<LpFaceWrapper>(std::move(face));
diff --git a/tests/daemon/fw/topology-tester.hpp b/tests/daemon/fw/topology-tester.hpp
index dd6d77d..9a10ad7 100644
--- a/tests/daemon/fw/topology-tester.hpp
+++ b/tests/daemon/fw/topology-tester.hpp
@@ -31,7 +31,7 @@
 #define NFD_TESTS_NFD_FW_TOPOLOGY_TESTER_HPP
 
 #include <ndn-cxx/face.hpp>
-#include <ndn-cxx/transport/transport.hpp>
+#include "face/internal-transport.hpp"
 #include "face/lp-face-wrapper.hpp"
 #include "fw/strategy.hpp"
 #include "tests/test-common.hpp"
@@ -42,84 +42,17 @@
 
 using namespace nfd::tests;
 
-/** \brief abstracts a Transport used in TopologyTester
- */
-class TopologyTransportBase
-{
-public:
-  /** \brief causes the transport to receive a link-layer packet
-   */
-  virtual void
-  receiveFromTopology(const Block& packet) = 0;
-
-  signal::Signal<TopologyTransportBase, Block> afterSend;
-
-protected:
-  DECLARE_SIGNAL_EMIT(afterSend)
-};
-
-/** \brief implements a forwarder-side Transport used in TopologyTester
- */
-class TopologyForwarderTransport : public face::Transport, public TopologyTransportBase
-{
-public:
-  TopologyForwarderTransport(const FaceUri& localUri, const FaceUri& remoteUri,
-                             ndn::nfd::FaceScope scope, ndn::nfd::LinkType linkType);
-
-  virtual void
-  receiveFromTopology(const Block& packet) DECL_OVERRIDE;
-
-protected:
-  virtual void
-  doClose() DECL_OVERRIDE
-  {
-  }
-
-private:
-  virtual void
-  doSend(Packet&& packet) DECL_OVERRIDE;
-};
-
-/** \brief implements a client-side Transport used in TopologyTester
- */
-class TopologyClientTransport : public ndn::Transport, public TopologyTransportBase
-{
-public:
-  virtual void
-  receiveFromTopology(const Block& packet) DECL_OVERRIDE;
-
-  virtual void
-  close() DECL_OVERRIDE
-  {
-  }
-
-  virtual void
-  pause() DECL_OVERRIDE
-  {
-  }
-
-  virtual void
-  resume() DECL_OVERRIDE
-  {
-  }
-
-  virtual void
-  send(const Block& wire) DECL_OVERRIDE;
-
-  virtual void
-  send(const Block& header, const Block& payload) DECL_OVERRIDE;
-};
-
 /** \brief identifies a node (forwarder) in the topology
  */
 typedef size_t TopologyNode;
 
-/** \brief represents a network or local-app link
+/** \brief represents a network link in the topology which connects two or more nodes
  */
-class TopologyLinkBase : noncopyable
+class TopologyLink : noncopyable
 {
 public:
-  TopologyLinkBase();
+  explicit
+  TopologyLink(const time::nanoseconds& delay);
 
   /** \brief fail the link, cause packets to be dropped silently
    */
@@ -137,32 +70,6 @@
     m_isUp = true;
   }
 
-protected:
-  /** \brief attach a Transport onto this link
-   */
-  void
-  attachTransport(TopologyNode i, TopologyTransportBase* transport);
-
-private:
-  void
-  transmit(TopologyNode i, const Block& packet);
-
-  virtual void
-  scheduleReceive(TopologyTransportBase* recipient, const Block& packet) = 0;
-
-protected:
-  bool m_isUp;
-  std::unordered_map<TopologyNode, TopologyTransportBase*> m_transports;
-};
-
-/** \brief represents a network link in the topology which connects two or more nodes
- */
-class TopologyLink : public TopologyLinkBase
-{
-public:
-  explicit
-  TopologyLink(const time::nanoseconds& delay);
-
   void
   addFace(TopologyNode i, shared_ptr<face::LpFaceWrapper> face);
 
@@ -174,22 +81,43 @@
     return *m_faces.at(i);
   }
 
-private:
-  virtual void
-  scheduleReceive(TopologyTransportBase* recipient, const Block& packet) DECL_OVERRIDE;
+protected:
+  /** \brief attach a Transport onto this link
+   */
+  void
+  attachTransport(TopologyNode i, face::InternalTransportBase* transport);
 
 private:
+  void
+  transmit(TopologyNode i, const Block& packet);
+
+  void
+  scheduleReceive(face::InternalTransportBase* recipient, const Block& packet);
+
+private:
+  bool m_isUp;
   time::nanoseconds m_delay;
+  std::unordered_map<TopologyNode, face::InternalTransportBase*> m_transports;
   std::unordered_map<TopologyNode, shared_ptr<face::LpFaceWrapper>> m_faces;
 };
 
 /** \brief represents a link to a local application
  */
-class TopologyAppLink : public TopologyLinkBase
+class TopologyAppLink : noncopyable
 {
 public:
   explicit
-  TopologyAppLink(shared_ptr<face::LpFaceWrapper> face);
+  TopologyAppLink(shared_ptr<face::LpFaceWrapper> forwarderFace);
+
+  /** \brief fail the link, cause packets to be dropped silently
+   */
+  void
+  fail();
+
+  /** \brief recover the link from a failure
+   */
+  void
+  recover();
 
   /** \return face on forwarder side
    */
@@ -208,11 +136,9 @@
   }
 
 private:
-  virtual void
-  scheduleReceive(TopologyTransportBase* recipient, const Block& packet) DECL_OVERRIDE;
-
-private:
-  shared_ptr<face::LpFaceWrapper> m_face;
+  shared_ptr<Face> m_face;
+  face::InternalForwarderTransport* m_forwarderTransport;
+  shared_ptr<face::InternalClientTransport> m_clientTransport;
   shared_ptr<ndn::Face> m_client;
 };
 
