diff --git a/tests/unit-tests/helper/ndn-link-control-helper.t.cpp b/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
index 736987d..a36715a 100644
--- a/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
+++ b/tests/unit-tests/helper/ndn-link-control-helper.t.cpp
@@ -18,25 +18,14 @@
  **/
 
 #include "helper/ndn-link-control-helper.hpp"
-#include "model/ndn-l3-protocol.hpp"
-#include "model/ndn-net-device-face.hpp"
-#include "model/ndn-app-face.hpp"
-#include "NFD/daemon/fw/forwarder.hpp"
 #include "NFD/core/scheduler.hpp"
 
-#include <ndn-cxx/management/nfd-face-status.hpp>
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
 #include "../tests-common.hpp"
 
 namespace ns3 {
 namespace ndn {
 
-BOOST_FIXTURE_TEST_SUITE(HelperNdnLinkControlHelper, CleanupFixture)
+BOOST_FIXTURE_TEST_SUITE(HelperNdnLinkControlHelper, ScenarioHelperWithCleanupFixture)
 
 BOOST_AUTO_TEST_CASE(TwoNodeTopology)
 {
@@ -45,42 +34,38 @@
   Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
   Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
 
-  NodeContainer nodes;
-  nodes.Create(2);
+  createTopology({
+      {"1", "2"},
+    });
 
-  PointToPointHelper p2p;
-  auto link0_1 = p2p.Install(nodes.Get(0), nodes.Get(1));
+  addRoutes({
+      {"1", "2", "/prefix", 1},
+    });
 
-  StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes(true);
-  ndnHelper.InstallAll();
+  addApps({
+      {"1", "ns3::ndn::ConsumerCbr",
+          {{"Prefix", "/prefix"}, {"Frequency", "1"}},
+          "0s", "100s"},
+      {"2", "ns3::ndn::Producer",
+          {{"Prefix", "/prefix"}, {"PayloadSize", "1024"}},
+          "0s", "100s"}
+    });
 
-  AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
-
-  consumerHelper.SetPrefix("/prefix");
-  consumerHelper.SetAttribute("Frequency", StringValue("1"));
-  ApplicationContainer consumerAppContainer = consumerHelper.Install(nodes.Get(0));
-
-  AppHelper producerHelper("ns3::ndn::Producer");
-
-  producerHelper.SetPrefix("/prefix");
-  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
-  ApplicationContainer producerAppContainer = producerHelper.Install(nodes.Get(1));
-
-  auto netDeviceFace1_0 = nodes.Get(1)->GetObject<L3Protocol>()->getFaceByNetDevice(link0_1.Get(1));
-
-  Simulator::Schedule(Seconds(5.1), ndn::LinkControlHelper::FailLink, nodes.Get(0), nodes.Get(1));
-  Simulator::Schedule(Seconds(10.1), ndn::LinkControlHelper::UpLink, nodes.Get(0), nodes.Get(1));
+  Simulator::Schedule(Seconds(5.1), ndn::LinkControlHelper::FailLink, getNode("1"), getNode("2"));
+  Simulator::Schedule(Seconds(10.1), ndn::LinkControlHelper::UpLink, getNode("1"), getNode("2"));
 
   nfd::scheduler::schedule(time::milliseconds(5200), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace1_0->getFaceStatus().getNInInterests(), 6);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 6);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getFaceStatus().getNInDatas(), 6);
     });
 
   nfd::scheduler::schedule(time::milliseconds(10200), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace1_0->getFaceStatus().getNInInterests(), 6);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 6);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getFaceStatus().getNInDatas(), 6);
     });
   nfd::scheduler::schedule(time::milliseconds(15100), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace1_0->getFaceStatus().getNInInterests(), 11);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 11);
+      BOOST_CHECK_EQUAL(getFace("1", "2")->getFaceStatus().getNInDatas(), 11);
     });
 
   Simulator::Stop(Seconds(15.2));
@@ -94,88 +79,73 @@
   Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
   Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
 
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create(6);
+  // Connecting nodes in 6 node topology:                        //
+  //                                                             //
+  //                            +---+                            //
+  //                         +- | 2 | -+                         //
+  //                        /   +---+   \                        //
+  //              +---+    /             \    +---+              //
+  // +---+        |   | --+               +-- |   |        +---+ //
+  // | 0 | ------ | 1 |                       | 4 | ------ | 5 | //
+  // +---+        |   | --+               +-- |   |        +---+ //
+  //              +---+    \             /    +---+              //
+  //                        \   +---+   /                        //
+  //                         +- | 3 | -+                         //
+  //                            +---+                            //
 
+  createTopology({
+      {"0", "1"},
+      {"1", "2"}, {"1", "3"},
+      {"2", "4"}, {"3", "4"},
+      {"4", "5"},
+    });
 
-  // Connecting nodes in 6 node topology:
-  //
-  //                            +---+
-  //                         +- | 2 | -+
-  //                        /   +---+   \
-  //              +---+    /             \    +---+
-  // +---+        |   | --+               +-- |   |        +---+
-  // | 0 | ------ | 1 |                       | 4 | ------ | 5 |
-  // +---+        |   | --+               +-- |   |        +---+
-  //              +---+    \             /    +---+
-  //                        \   +---+   /
-  //                         +- | 3 | -+
-  //                            +---+
-  PointToPointHelper p2p;
-  p2p.Install(nodes.Get(0), nodes.Get(1));
-  auto link1_2 = p2p.Install(nodes.Get(1), nodes.Get(2));
-  auto link1_3 = p2p.Install(nodes.Get(1), nodes.Get(3));
-  p2p.Install(nodes.Get(2), nodes.Get(4));
-  p2p.Install(nodes.Get(3), nodes.Get(4));
-  p2p.Install(nodes.Get(4), nodes.Get(5));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes(true);
-  ndnHelper.InstallAll();
+  addRoutes({
+      {"0", "1", "/prefix", 1},
+      {"1", "2", "/prefix", 1}, {"1", "3", "/prefix", 1},
+      {"2", "4", "/prefix", 1}, {"3", "4", "/prefix", 1},
+      {"4", "5", "/prefix", 1},
+    });
 
   // Choosing forwarding strategy
   ndn::StrategyChoiceHelper::InstallAll("/prefix", "/localhost/nfd/strategy/broadcast");
 
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper("ns3::ndn::ConsumerCbr");
-  // Consumer will request /prefix/0, /prefix/1, ...
-  consumerHelper.SetPrefix("/prefix");
-  consumerHelper.SetAttribute("Frequency", StringValue("1")); // 1 interests a second
-  consumerHelper.Install(nodes.Get(0));                       // first node
-
-  // Producer
-  ndn::AppHelper producerHelper("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix("/prefix");
-  producerHelper.SetAttribute("PayloadSize", StringValue("1024"));
-  producerHelper.Install(nodes.Get(5)); // last node
-
-  auto netDeviceFace2_1 = nodes.Get(2)->GetObject<L3Protocol>()->getFaceByNetDevice(link1_2.Get(1));
-  auto netDeviceFace3_1 = nodes.Get(3)->GetObject<L3Protocol>()->getFaceByNetDevice(link1_3.Get(1));
+  addApps({
+      {"0", "ns3::ndn::ConsumerCbr",
+          {{"Prefix", "/prefix"}, {"Frequency", "1"}},
+          "0s", "100s"},
+      {"5", "ns3::ndn::Producer",
+          {{"Prefix", "/prefix"}, {"PayloadSize", "1024"}},
+          "0s", "100s"}
+    });
 
   nfd::scheduler::schedule(time::milliseconds(10100), [&] {
-      LinkControlHelper::FailLink(nodes.Get(1), nodes.Get(2));
+      LinkControlHelper::FailLink(getNode("1"), getNode("2"));
     });
 
   // just before link failure
   nfd::scheduler::schedule(time::milliseconds(10050), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace2_1->getFaceStatus().getNInInterests(), 11);
-      BOOST_CHECK_EQUAL(netDeviceFace3_1->getFaceStatus().getNInInterests(), 11);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 11);
+      BOOST_CHECK_EQUAL(getFace("3", "1")->getFaceStatus().getNInInterests(), 11);
     });
 
   // just before link recovery
   nfd::scheduler::schedule(time::milliseconds(20050), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace2_1->getFaceStatus().getNInInterests(), 11);
-      BOOST_CHECK_EQUAL(netDeviceFace3_1->getFaceStatus().getNInInterests(), 21);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 11);
+      BOOST_CHECK_EQUAL(getFace("3", "1")->getFaceStatus().getNInInterests(), 21);
     });
 
   nfd::scheduler::schedule(time::milliseconds(20100), [&] {
-      LinkControlHelper::UpLink(nodes.Get(1), nodes.Get(2));
+      LinkControlHelper::UpLink(getNode("1"), getNode("2"));
     });
 
   nfd::scheduler::schedule(time::milliseconds(30050), [&] {
-      BOOST_CHECK_EQUAL(netDeviceFace2_1->getFaceStatus().getNInInterests(), 21);
-      BOOST_CHECK_EQUAL(netDeviceFace3_1->getFaceStatus().getNInInterests(), 31);
+      BOOST_CHECK_EQUAL(getFace("2", "1")->getFaceStatus().getNInInterests(), 21);
+      BOOST_CHECK_EQUAL(getFace("3", "1")->getFaceStatus().getNInInterests(), 31);
     });
 
   Simulator::Stop(Seconds(30.1));
-
   Simulator::Run();
-  Simulator::Destroy();
 }
 
 BOOST_AUTO_TEST_SUITE_END()
