diff --git a/daemon/fw/best-route-strategy2.cpp b/daemon/fw/best-route-strategy.cpp
similarity index 81%
rename from daemon/fw/best-route-strategy2.cpp
rename to daemon/fw/best-route-strategy.cpp
index 7a560d8..11ae600 100644
--- a/daemon/fw/best-route-strategy2.cpp
+++ b/daemon/fw/best-route-strategy.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2020,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -23,20 +23,20 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "best-route-strategy2.hpp"
+#include "best-route-strategy.hpp"
 #include "algorithm.hpp"
 #include "common/logger.hpp"
 
 namespace nfd {
 namespace fw {
 
-NFD_LOG_INIT(BestRouteStrategy2);
-NFD_REGISTER_STRATEGY(BestRouteStrategy2);
+NFD_LOG_INIT(BestRouteStrategy);
+NFD_REGISTER_STRATEGY(BestRouteStrategy);
 
-const time::milliseconds BestRouteStrategy2::RETX_SUPPRESSION_INITIAL(10);
-const time::milliseconds BestRouteStrategy2::RETX_SUPPRESSION_MAX(250);
+const time::milliseconds BestRouteStrategy::RETX_SUPPRESSION_INITIAL(10);
+const time::milliseconds BestRouteStrategy::RETX_SUPPRESSION_MAX(250);
 
-BestRouteStrategy2::BestRouteStrategy2(Forwarder& forwarder, const Name& name)
+BestRouteStrategy::BestRouteStrategy(Forwarder& forwarder, const Name& name)
   : Strategy(forwarder)
   , ProcessNackTraits(this)
   , m_retxSuppression(RETX_SUPPRESSION_INITIAL,
@@ -45,25 +45,25 @@
 {
   ParsedInstanceName parsed = parseInstanceName(name);
   if (!parsed.parameters.empty()) {
-    NDN_THROW(std::invalid_argument("BestRouteStrategy2 does not accept parameters"));
+    NDN_THROW(std::invalid_argument("BestRouteStrategy does not accept parameters"));
   }
   if (parsed.version && *parsed.version != getStrategyName()[-1].toVersion()) {
     NDN_THROW(std::invalid_argument(
-      "BestRouteStrategy2 does not support version " + to_string(*parsed.version)));
+      "BestRouteStrategy does not support version " + to_string(*parsed.version)));
   }
   this->setInstanceName(makeInstanceName(name, getStrategyName()));
 }
 
 const Name&
-BestRouteStrategy2::getStrategyName()
+BestRouteStrategy::getStrategyName()
 {
   static Name strategyName("/localhost/nfd/strategy/best-route/%FD%05");
   return strategyName;
 }
 
 void
-BestRouteStrategy2::afterReceiveInterest(const FaceEndpoint& ingress, const Interest& interest,
-                                         const shared_ptr<pit::Entry>& pitEntry)
+BestRouteStrategy::afterReceiveInterest(const FaceEndpoint& ingress, const Interest& interest,
+                                        const shared_ptr<pit::Entry>& pitEntry)
 {
   RetxSuppressionResult suppression = m_retxSuppression.decidePerPitEntry(*pitEntry);
   if (suppression == RetxSuppressionResult::SUPPRESS) {
@@ -124,8 +124,8 @@
 }
 
 void
-BestRouteStrategy2::afterReceiveNack(const FaceEndpoint& ingress, const lp::Nack& nack,
-                                     const shared_ptr<pit::Entry>& pitEntry)
+BestRouteStrategy::afterReceiveNack(const FaceEndpoint& ingress, const lp::Nack& nack,
+                                    const shared_ptr<pit::Entry>& pitEntry)
 {
   this->processNack(ingress.face, nack, pitEntry);
 }
diff --git a/daemon/fw/best-route-strategy2.hpp b/daemon/fw/best-route-strategy.hpp
similarity index 88%
rename from daemon/fw/best-route-strategy2.hpp
rename to daemon/fw/best-route-strategy.hpp
index 438ecd8..636abd2 100644
--- a/daemon/fw/best-route-strategy2.hpp
+++ b/daemon/fw/best-route-strategy.hpp
@@ -23,8 +23,8 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef NFD_DAEMON_FW_BEST_ROUTE_STRATEGY2_HPP
-#define NFD_DAEMON_FW_BEST_ROUTE_STRATEGY2_HPP
+#ifndef NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
+#define NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
 
 #include "strategy.hpp"
 #include "process-nack-traits.hpp"
@@ -50,12 +50,12 @@
  *  This strategy returns Nack to all downstreams if all upstreams have returned Nacks.
  *  The reason of the sent Nack equals the least severe reason among received Nacks.
  */
-class BestRouteStrategy2 : public Strategy
-                         , public ProcessNackTraits<BestRouteStrategy2>
+class BestRouteStrategy : public Strategy
+                        , public ProcessNackTraits<BestRouteStrategy>
 {
 public:
   explicit
-  BestRouteStrategy2(Forwarder& forwarder, const Name& name = getStrategyName());
+  BestRouteStrategy(Forwarder& forwarder, const Name& name = getStrategyName());
 
   static const Name&
   getStrategyName();
@@ -73,10 +73,10 @@
   static const time::milliseconds RETX_SUPPRESSION_MAX;
   RetxSuppressionExponential m_retxSuppression;
 
-  friend ProcessNackTraits<BestRouteStrategy2>;
+  friend ProcessNackTraits<BestRouteStrategy>;
 };
 
 } // namespace fw
 } // namespace nfd
 
-#endif // NFD_DAEMON_FW_BEST_ROUTE_STRATEGY2_HPP
+#endif // NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
diff --git a/daemon/fw/forwarder.cpp b/daemon/fw/forwarder.cpp
index 387ac0d..1938c94 100644
--- a/daemon/fw/forwarder.cpp
+++ b/daemon/fw/forwarder.cpp
@@ -26,7 +26,7 @@
 #include "forwarder.hpp"
 
 #include "algorithm.hpp"
-#include "best-route-strategy2.hpp"
+#include "best-route-strategy.hpp"
 #include "scope-prefix.hpp"
 #include "strategy.hpp"
 #include "common/global.hpp"
@@ -43,7 +43,7 @@
 static Name
 getDefaultStrategyName()
 {
-  return fw::BestRouteStrategy2::getStrategyName();
+  return fw::BestRouteStrategy::getStrategyName();
 }
 
 Forwarder::Forwarder(FaceTable& faceTable)
diff --git a/tests/daemon/fw/best-route-strategy2.t.cpp b/tests/daemon/fw/best-route-strategy.t.cpp
similarity index 86%
rename from tests/daemon/fw/best-route-strategy2.t.cpp
rename to tests/daemon/fw/best-route-strategy.t.cpp
index fa9d883..cd519b5 100644
--- a/tests/daemon/fw/best-route-strategy2.t.cpp
+++ b/tests/daemon/fw/best-route-strategy.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2019,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -23,7 +23,7 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "common/global.hpp"
 
 #include "tests/test-common.hpp"
@@ -34,15 +34,15 @@
 namespace fw {
 namespace tests {
 
-using BestRouteStrategy2Tester = StrategyTester<BestRouteStrategy2>;
-NFD_REGISTER_STRATEGY(BestRouteStrategy2Tester);
+using BestRouteStrategyTester = StrategyTester<BestRouteStrategy>;
+NFD_REGISTER_STRATEGY(BestRouteStrategyTester);
 
 BOOST_AUTO_TEST_SUITE(Fw)
 
-class BestRouteStrategy2Fixture : public GlobalIoTimeFixture
+class BestRouteStrategyFixture : public GlobalIoTimeFixture
 {
 protected:
-  BestRouteStrategy2Fixture()
+  BestRouteStrategyFixture()
     : face1(make_shared<DummyFace>())
     , face2(make_shared<DummyFace>())
     , face3(make_shared<DummyFace>())
@@ -59,7 +59,7 @@
 protected:
   FaceTable faceTable;
   Forwarder forwarder{faceTable};
-  BestRouteStrategy2Tester strategy{forwarder};
+  BestRouteStrategyTester strategy{forwarder};
   Fib& fib{forwarder.getFib()};
   Pit& pit{forwarder.getPit()};
 
@@ -70,7 +70,7 @@
   shared_ptr<DummyFace> face5;
 };
 
-BOOST_FIXTURE_TEST_SUITE(TestBestRouteStrategy2, BestRouteStrategy2Fixture)
+BOOST_FIXTURE_TEST_SUITE(TestBestRouteStrategy, BestRouteStrategyFixture)
 
 BOOST_AUTO_TEST_CASE(Forward)
 {
@@ -82,8 +82,8 @@
   shared_ptr<Interest> interest = makeInterest("ndn:/BzgFBchqA");
   shared_ptr<pit::Entry> pitEntry = pit.insert(*interest).first;
 
-  const time::nanoseconds TICK = time::duration_cast<time::nanoseconds>(
-    BestRouteStrategy2::RETX_SUPPRESSION_INITIAL * 0.1);
+  const auto TICK = time::duration_cast<time::nanoseconds>(
+                      BestRouteStrategy::RETX_SUPPRESSION_INITIAL * 0.1);
 
   // first Interest goes to nexthop with lowest FIB cost,
   // however face1 is downstream so it cannot be used
@@ -114,7 +114,7 @@
     retxFrom4Evt = getScheduler().schedule(TICK * 5, periodicalRetxFrom4);
   };
   periodicalRetxFrom4();
-  this->advanceClocks(TICK, BestRouteStrategy2::RETX_SUPPRESSION_MAX * 16);
+  this->advanceClocks(TICK, BestRouteStrategy::RETX_SUPPRESSION_MAX * 16);
   retxFrom4Evt.cancel();
 
   // nexthops for accepted retransmissions: follow FIB cost,
@@ -130,7 +130,7 @@
 
   strategy.sendInterestHistory.clear();
   for (int i = 0; i < 3; ++i) {
-    this->advanceClocks(TICK, BestRouteStrategy2::RETX_SUPPRESSION_MAX * 2);
+    this->advanceClocks(TICK, BestRouteStrategy::RETX_SUPPRESSION_MAX * 2);
     pitEntry->insertOrUpdateInRecord(*face5, *interest);
     strategy.afterReceiveInterest(FaceEndpoint(*face5, 0), *interest, pitEntry);
   }
@@ -141,7 +141,7 @@
   // face1 cannot be used because it's gone from FIB entry
 }
 
-BOOST_AUTO_TEST_SUITE_END() // TestBestRouteStrategy2
+BOOST_AUTO_TEST_SUITE_END() // TestBestRouteStrategy
 BOOST_AUTO_TEST_SUITE_END() // Fw
 
 } // namespace tests
diff --git a/tests/daemon/fw/forwarding-hint.t.cpp b/tests/daemon/fw/forwarding-hint.t.cpp
index 7e9dbdc..fe3e51c 100644
--- a/tests/daemon/fw/forwarding-hint.t.cpp
+++ b/tests/daemon/fw/forwarding-hint.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2019,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -23,7 +23,7 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 
 #include "tests/daemon/global-io-fixture.hpp"
 #include "topology-tester.hpp"
@@ -67,8 +67,8 @@
     nodeC = topo.addForwarder("click");
     nodeS = topo.addForwarder("spurs");
     nodeQ = topo.addForwarder("serverQ");
-    for (TopologyNode node : {nodeA, nodeH, nodeT, nodeP, nodeC, nodeS, nodeQ}) {
-      topo.setStrategy<BestRouteStrategy2>(node);
+    for (auto node : {nodeA, nodeH, nodeT, nodeP, nodeC, nodeS, nodeQ}) {
+      topo.setStrategy<BestRouteStrategy>(node);
     }
 
     topo.getForwarder(nodeH).getNetworkRegionTable().insert("/arizona/cs/hobo");
diff --git a/tests/daemon/fw/ad-hoc-forwarding.t.cpp b/tests/daemon/fw/strategy-ad-hoc-face.t.cpp
similarity index 90%
rename from tests/daemon/fw/ad-hoc-forwarding.t.cpp
rename to tests/daemon/fw/strategy-ad-hoc-face.t.cpp
index da696a0..bdf0cb6 100644
--- a/tests/daemon/fw/ad-hoc-forwarding.t.cpp
+++ b/tests/daemon/fw/strategy-ad-hoc-face.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2019,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -30,7 +30,7 @@
 // Strategies that can forward Interest to an ad hoc face even if it's the downstream,
 // sorted alphabetically.
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
@@ -44,10 +44,10 @@
 namespace tests {
 
 template<typename S>
-class AdHocForwardingFixture : public GlobalIoTimeFixture
+class AdHocTopologyFixture : public GlobalIoTimeFixture
 {
 protected:
-  AdHocForwardingFixture()
+  AdHocTopologyFixture()
   {
     nodeA = topo.addForwarder("A");
     nodeB = topo.addForwarder("B");
@@ -84,17 +84,17 @@
 };
 
 BOOST_AUTO_TEST_SUITE(Fw)
-BOOST_AUTO_TEST_SUITE(TestAdHocForwarding)
+BOOST_AUTO_TEST_SUITE(TestStrategyAdHocFace)
 
 using Strategies = boost::mpl::vector<
   AsfStrategy,
-  BestRouteStrategy2,
+  BestRouteStrategy,
   MulticastStrategy,
   RandomStrategy
 >;
 
-BOOST_FIXTURE_TEST_CASE_TEMPLATE(SingleNexthop, S, Strategies,
-                                 AdHocForwardingFixture<S>)
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(SingleNexthop,
+                                 S, Strategies, AdHocTopologyFixture<S>)
 {
   // +---+---+
   // A   B   C
@@ -115,8 +115,8 @@
   BOOST_CHECK_EQUAL(this->appA->getForwarderFace().getCounters().nOutData, 10);
 }
 
-BOOST_FIXTURE_TEST_CASE_TEMPLATE(SecondNexthop, S, Strategies,
-                                 AdHocForwardingFixture<S>)
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(SecondNexthop,
+                                 S, Strategies, AdHocTopologyFixture<S>)
 {
   // +---+---+
   // A   B   C
@@ -148,7 +148,7 @@
   BOOST_CHECK_GE(this->appA->getForwarderFace().getCounters().nOutData, 25);
 }
 
-BOOST_AUTO_TEST_SUITE_END() // TestAdHocForwarding
+BOOST_AUTO_TEST_SUITE_END() // TestStrategyAdHocFace
 BOOST_AUTO_TEST_SUITE_END() // Fw
 
 } // namespace tests
diff --git a/tests/daemon/fw/broadcast-medium.t.cpp b/tests/daemon/fw/strategy-broadcast-medium.t.cpp
similarity index 88%
rename from tests/daemon/fw/broadcast-medium.t.cpp
rename to tests/daemon/fw/strategy-broadcast-medium.t.cpp
index da02718..6a45b2e 100644
--- a/tests/daemon/fw/broadcast-medium.t.cpp
+++ b/tests/daemon/fw/strategy-broadcast-medium.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2019,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -23,10 +23,15 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/** \file
+ *  This test suite checks that a strategy can correctly handle a multi-access face
+ *  on a broadcast medium.
+ */
+
 // Strategies that can correctly handle multi-access faces on a broadcast medium,
 // sorted alphabetically.
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
@@ -82,16 +87,17 @@
 };
 
 BOOST_AUTO_TEST_SUITE(Fw)
-BOOST_AUTO_TEST_SUITE(TestBroadcastMedium)
+BOOST_AUTO_TEST_SUITE(TestStrategyBroadcastMedium)
 
 using Strategies = boost::mpl::vector<
   AsfStrategy,
-  BestRouteStrategy2,
+  BestRouteStrategy,
   MulticastStrategy,
   RandomStrategy
 >;
 
-BOOST_FIXTURE_TEST_CASE_TEMPLATE(SameFaceDifferentEndpoint, S, Strategies, BroadcastMediumFixture<S>)
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(SameFaceDifferentEndpoint,
+                                 S, Strategies, BroadcastMediumFixture<S>)
 {
   //   C   D   P
   //   |   |   |
@@ -116,7 +122,7 @@
   BOOST_CHECK_EQUAL(this->faceP->getCounters().nOutData, 1);
 }
 
-BOOST_AUTO_TEST_SUITE_END() // TestBroadcastMedium
+BOOST_AUTO_TEST_SUITE_END() // TestStrategyBroadcastMedium
 BOOST_AUTO_TEST_SUITE_END() // Fw
 
 } // namespace tests
diff --git a/tests/daemon/fw/strategy-instantiation.t.cpp b/tests/daemon/fw/strategy-instantiation.t.cpp
index 6bbcebb..4b319cb 100644
--- a/tests/daemon/fw/strategy-instantiation.t.cpp
+++ b/tests/daemon/fw/strategy-instantiation.t.cpp
@@ -30,7 +30,7 @@
 // All strategies, sorted alphabetically.
 #include "fw/access-strategy.hpp"
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/self-learning-strategy.hpp"
 #include "fw/random-strategy.hpp"
@@ -74,7 +74,7 @@
 using Tests = boost::mpl::vector<
   Test<AccessStrategy, false, 1>,
   Test<AsfStrategy, true, 3>,
-  Test<BestRouteStrategy2, false, 5>,
+  Test<BestRouteStrategy, false, 5>,
   Test<MulticastStrategy, false, 4>,
   Test<SelfLearningStrategy, false, 1>,
   Test<RandomStrategy, false, 1>
diff --git a/tests/daemon/fw/strategy-nack-return.t.cpp b/tests/daemon/fw/strategy-nack-return.t.cpp
index a370685..5811652 100644
--- a/tests/daemon/fw/strategy-nack-return.t.cpp
+++ b/tests/daemon/fw/strategy-nack-return.t.cpp
@@ -28,10 +28,9 @@
  */
 
 // Strategies implementing recommended Nack processing procedure, sorted alphabetically.
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
-#include "choose-strategy.hpp"
 #include "strategy-tester.hpp"
 #include "topology-tester.hpp"
 #include "tests/daemon/face/dummy-face.hpp"
@@ -42,8 +41,6 @@
 namespace fw {
 namespace tests {
 
-BOOST_AUTO_TEST_SUITE(Fw)
-
 template<typename S>
 class StrategyNackReturnFixture : public GlobalIoTimeFixture
 {
@@ -83,10 +80,11 @@
   shared_ptr<Face> face5;
 };
 
+BOOST_AUTO_TEST_SUITE(Fw)
 BOOST_AUTO_TEST_SUITE(TestStrategyNackReturn)
 
 using Strategies = boost::mpl::vector<
-  BestRouteStrategy2,
+  BestRouteStrategy,
   RandomStrategy
 >;
 
@@ -138,7 +136,7 @@
   this->fib.addOrUpdateNextHop(fibEntry, *this->face4, 20);
   this->fib.addOrUpdateNextHop(fibEntry, *this->face5, 30);
 
-  auto interest1 = makeInterest("/aS9FAyUV19", 286);
+  auto interest1 = makeInterest("/aS9FAyUV19", false, nullopt, 286);
   shared_ptr<pit::Entry> pitEntry = this->pit.insert(*interest1).first;
   pitEntry->insertOrUpdateInRecord(*this->face1, *interest1);
   pitEntry->insertOrUpdateOutRecord(*this->face3, *interest1);
@@ -317,9 +315,10 @@
   NackReasonCombination<lp::NackReason::NONE, lp::NackReason::NONE, lp::NackReason::NONE>
 >;
 
-// use BestRouteStrategy2 as a representative to test Nack reason combination
-BOOST_FIXTURE_TEST_CASE_TEMPLATE(CombineReasons, Combination, NackReasonCombinations,
-                                 StrategyNackReturnFixture<BestRouteStrategy2>)
+// use BestRouteStrategy as a representative to test Nack reason combination
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(CombineReasons,
+                                 Combination, NackReasonCombinations,
+                                 StrategyNackReturnFixture<BestRouteStrategy>)
 {
   fib::Entry& fibEntry = *fib.insert(Name()).first;
   fib.addOrUpdateNextHop(fibEntry, *face3, 10);
diff --git a/tests/daemon/fw/strategy-no-route.t.cpp b/tests/daemon/fw/strategy-no-route.t.cpp
index c5a4f89..93a6367 100644
--- a/tests/daemon/fw/strategy-no-route.t.cpp
+++ b/tests/daemon/fw/strategy-no-route.t.cpp
@@ -31,7 +31,7 @@
 // Strategies returning Nack-NoRoute when there are no usable FIB nexthops,
 // sorted alphabetically.
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
 #include "tests/test-common.hpp"
@@ -145,9 +145,9 @@
   Test<AsfStrategy, NextHopIsDownstream<AsfStrategy>>,
   Test<AsfStrategy, NextHopViolatesScope<AsfStrategy>>,
 
-  Test<BestRouteStrategy2, EmptyNextHopList<BestRouteStrategy2>>,
-  Test<BestRouteStrategy2, NextHopIsDownstream<BestRouteStrategy2>>,
-  Test<BestRouteStrategy2, NextHopViolatesScope<BestRouteStrategy2>>,
+  Test<BestRouteStrategy, EmptyNextHopList<BestRouteStrategy>>,
+  Test<BestRouteStrategy, NextHopIsDownstream<BestRouteStrategy>>,
+  Test<BestRouteStrategy, NextHopViolatesScope<BestRouteStrategy>>,
 
   Test<RandomStrategy, EmptyNextHopList<RandomStrategy>>,
   Test<RandomStrategy, NextHopIsDownstream<RandomStrategy>>,
diff --git a/tests/daemon/fw/strategy-scope-control.t.cpp b/tests/daemon/fw/strategy-scope-control.t.cpp
index 7b0a271..5c6c552 100644
--- a/tests/daemon/fw/strategy-scope-control.t.cpp
+++ b/tests/daemon/fw/strategy-scope-control.t.cpp
@@ -30,7 +30,7 @@
 // Strategies implementing namespace-based scope control, sorted alphabetically.
 #include "fw/access-strategy.hpp"
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy2.hpp"
+#include "fw/best-route-strategy.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/random-strategy.hpp"
 
@@ -112,7 +112,7 @@
 using Tests = boost::mpl::vector<
   Test<AccessStrategy, false, false, true>,
   Test<AsfStrategy, true, false, true>,
-  Test<BestRouteStrategy2, true, true, true>,
+  Test<BestRouteStrategy, true, true, true>,
   Test<MulticastStrategy, false, false, false>,
   Test<RandomStrategy, true, true, true>
 >;
diff --git a/tests/other/fw/congestion-mark-strategy.cpp b/tests/other/fw/congestion-mark-strategy.cpp
index 9543fda..672e9ef 100644
--- a/tests/other/fw/congestion-mark-strategy.cpp
+++ b/tests/other/fw/congestion-mark-strategy.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2019,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -31,11 +31,9 @@
 NFD_REGISTER_STRATEGY(CongestionMarkStrategy);
 
 CongestionMarkStrategy::CongestionMarkStrategy(Forwarder& forwarder, const Name& name)
-  // Specifying BestRouteStrategy2's own name in its constructor prevents an exception from occuring
+  // Specifying BestRouteStrategy's own name in its constructor prevents an exception from occuring
   // when specifying parameters to CongestionMarkStrategy
-  : BestRouteStrategy2(forwarder, BestRouteStrategy2::getStrategyName())
-  , m_congestionMark(1)
-  , m_shouldPreserveMark(true)
+  : BestRouteStrategy(forwarder, BestRouteStrategy::getStrategyName())
 {
   ParsedInstanceName parsed = parseInstanceName(name);
   switch (parsed.parameters.size()) {
@@ -86,10 +84,10 @@
   if (mark != m_congestionMark && (!m_shouldPreserveMark || mark == 0)) {
     Interest markedInterest(interest);
     markedInterest.setCongestionMark(m_congestionMark);
-    BestRouteStrategy2::afterReceiveInterest(ingress, markedInterest, pitEntry);
+    BestRouteStrategy::afterReceiveInterest(ingress, markedInterest, pitEntry);
   }
   else {
-    BestRouteStrategy2::afterReceiveInterest(ingress, interest, pitEntry);
+    BestRouteStrategy::afterReceiveInterest(ingress, interest, pitEntry);
   }
 }
 
diff --git a/tests/other/fw/congestion-mark-strategy.hpp b/tests/other/fw/congestion-mark-strategy.hpp
index cf78403..57c1bbe 100644
--- a/tests/other/fw/congestion-mark-strategy.hpp
+++ b/tests/other/fw/congestion-mark-strategy.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2020,  Regents of the University of California,
+ * Copyright (c) 2014-2021,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -26,21 +26,21 @@
 #ifndef NFD_TESTS_OTHER_FW_CONGESTION_MARK_STRATEGY_HPP
 #define NFD_TESTS_OTHER_FW_CONGESTION_MARK_STRATEGY_HPP
 
-#include "daemon/fw/best-route-strategy2.hpp"
+#include "daemon/fw/best-route-strategy.hpp"
 
 namespace nfd {
 namespace fw {
 
-/** \brief Congestion Mark integration testing strategy version 1
+/** \brief Congestion Mark integration testing strategy
  *
  *  This strategy adds a CongestionMark to each Interest it forwards. Otherwise, behaves like
- *  BestRouteStrategy2.
+ *  BestRouteStrategy.
  *
  *  The value of the added CongestionMark can be specified through a strategy parameter (defaults
  *  to 1). In addition, an optional boolean parameter specifies whether the strategy will preserve
  *  existing CongestionMarks (default) or replace them.
  */
-class CongestionMarkStrategy : public BestRouteStrategy2
+class CongestionMarkStrategy : public BestRouteStrategy
 {
 public:
   explicit
@@ -54,8 +54,8 @@
                        const shared_ptr<pit::Entry>& pitEntry) override;
 
 private:
-  uint64_t m_congestionMark;
-  bool m_shouldPreserveMark;
+  uint64_t m_congestionMark = 1;
+  bool m_shouldPreserveMark = true;
 };
 
 } // namespace fw
