diff --git a/daemon/fw/access-strategy.hpp b/daemon/fw/access-strategy.hpp
index a766239..d6688fc 100644
--- a/daemon/fw/access-strategy.hpp
+++ b/daemon/fw/access-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,
@@ -34,7 +34,7 @@
 namespace nfd {
 namespace fw {
 
-/** \brief Access Router Strategy version 1
+/** \brief Access Router strategy
  *
  *  This strategy is designed for the last hop on the NDN testbed,
  *  where each nexthop connects to a laptop, links are lossy, and FIB is mostly correct.
diff --git a/daemon/fw/algorithm.cpp b/daemon/fw/algorithm.cpp
index 7dada21..a5d692f 100644
--- a/daemon/fw/algorithm.cpp
+++ b/daemon/fw/algorithm.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,
@@ -24,6 +24,7 @@
  */
 
 #include "algorithm.hpp"
+#include "scope-prefix.hpp"
 
 namespace nfd {
 namespace fw {
@@ -50,30 +51,6 @@
   return false;
 }
 
-bool
-canForwardToLegacy(const pit::Entry& pitEntry, const Face& face)
-{
-  time::steady_clock::TimePoint now = time::steady_clock::now();
-
-  bool hasUnexpiredOutRecord = std::any_of(pitEntry.out_begin(), pitEntry.out_end(),
-    [&face, &now] (const pit::OutRecord& outRecord) {
-      return &outRecord.getFace() == &face && outRecord.getExpiry() >= now;
-    });
-  if (hasUnexpiredOutRecord) {
-    return false;
-  }
-
-  bool hasUnexpiredOtherInRecord = std::any_of(pitEntry.in_begin(), pitEntry.in_end(),
-    [&face, &now] (const pit::InRecord& inRecord) {
-      return &inRecord.getFace() != &face && inRecord.getExpiry() >= now;
-    });
-  if (!hasUnexpiredOtherInRecord) {
-    return false;
-  }
-
-  return true;
-}
-
 int
 findDuplicateNonce(const pit::Entry& pitEntry, Interest::Nonce nonce, const Face& face)
 {
diff --git a/daemon/fw/algorithm.hpp b/daemon/fw/algorithm.hpp
index 8a6b849..b37d540 100644
--- a/daemon/fw/algorithm.hpp
+++ b/daemon/fw/algorithm.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,8 +26,7 @@
 #ifndef NFD_DAEMON_FW_ALGORITHM_HPP
 #define NFD_DAEMON_FW_ALGORITHM_HPP
 
-#include "fw/scope-prefix.hpp"
-#include "table/fib.hpp"
+#include "table/fib-entry.hpp"
 #include "table/pit-entry.hpp"
 
 /** \file
@@ -43,19 +42,6 @@
 bool
 wouldViolateScope(const Face& inFace, const Interest& interest, const Face& outFace);
 
-/** \brief decide whether Interest can be forwarded to face
- *
- *  \return true if out-record of this face does not exist or has expired,
- *          and there is an in-record not of this face
- *
- *  \note This algorithm has a weakness that it does not permit consumer retransmissions
- *        before out-record expires. Therefore, it's not recommended to use this function
- *        in new strategies.
- *  \todo find a better name for this function
- */
-bool
-canForwardToLegacy(const pit::Entry& pitEntry, const Face& face);
-
 /** \brief indicates where duplicate Nonces are found
  */
 enum DuplicateNonceWhere {
@@ -63,7 +49,7 @@
   DUPLICATE_NONCE_IN_SAME   = (1 << 0), ///< in-record of same face
   DUPLICATE_NONCE_IN_OTHER  = (1 << 1), ///< in-record of other face
   DUPLICATE_NONCE_OUT_SAME  = (1 << 2), ///< out-record of same face
-  DUPLICATE_NONCE_OUT_OTHER = (1 << 3)  ///< out-record of other face
+  DUPLICATE_NONCE_OUT_OTHER = (1 << 3), ///< out-record of other face
 };
 
 /** \brief determine whether \p pitEntry has duplicate Nonce \p nonce
diff --git a/daemon/fw/best-route-strategy.cpp b/daemon/fw/best-route-strategy.cpp
deleted file mode 100644
index 82a3f56..0000000
--- a/daemon/fw/best-route-strategy.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2020,  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 "best-route-strategy.hpp"
-#include "algorithm.hpp"
-
-namespace nfd {
-namespace fw {
-
-BestRouteStrategyBase::BestRouteStrategyBase(Forwarder& forwarder)
-  : Strategy(forwarder)
-{
-}
-
-void
-BestRouteStrategyBase::afterReceiveInterest(const FaceEndpoint& ingress, const Interest& interest,
-                                            const shared_ptr<pit::Entry>& pitEntry)
-{
-  if (hasPendingOutRecords(*pitEntry)) {
-    // not a new Interest, don't forward
-    return;
-  }
-
-  const fib::Entry& fibEntry = this->lookupFib(*pitEntry);
-  for (const auto& nexthop : fibEntry.getNextHops()) {
-    Face& outFace = nexthop.getFace();
-    if (!wouldViolateScope(ingress.face, interest, outFace) &&
-        canForwardToLegacy(*pitEntry, outFace)) {
-      this->sendInterest(pitEntry, outFace, interest);
-      return;
-    }
-  }
-
-  this->rejectPendingInterest(pitEntry);
-}
-
-NFD_REGISTER_STRATEGY(BestRouteStrategy);
-
-BestRouteStrategy::BestRouteStrategy(Forwarder& forwarder, const Name& name)
-  : BestRouteStrategyBase(forwarder)
-{
-  ParsedInstanceName parsed = parseInstanceName(name);
-  if (!parsed.parameters.empty()) {
-    NDN_THROW(std::invalid_argument("BestRouteStrategy does not accept parameters"));
-  }
-  if (parsed.version && *parsed.version != getStrategyName()[-1].toVersion()) {
-    NDN_THROW(std::invalid_argument(
-      "BestRouteStrategy does not support version " + to_string(*parsed.version)));
-  }
-  this->setInstanceName(makeInstanceName(name, getStrategyName()));
-}
-
-const Name&
-BestRouteStrategy::getStrategyName()
-{
-  static Name strategyName("/localhost/nfd/strategy/best-route/%FD%01");
-  return strategyName;
-}
-
-} // namespace fw
-} // namespace nfd
diff --git a/daemon/fw/best-route-strategy.hpp b/daemon/fw/best-route-strategy.hpp
deleted file mode 100644
index 2c5be36..0000000
--- a/daemon/fw/best-route-strategy.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2020,  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/>.
- */
-
-#ifndef NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
-#define NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
-
-#include "strategy.hpp"
-
-namespace nfd {
-namespace fw {
-
-class BestRouteStrategyBase : public Strategy
-{
-public:
-  void
-  afterReceiveInterest(const FaceEndpoint& ingress, const Interest& interest,
-                       const shared_ptr<pit::Entry>& pitEntry) override;
-
-protected:
-  BestRouteStrategyBase(Forwarder& forwarder);
-};
-
-/** \brief Best Route strategy version 1
- *
- *  This strategy forwards a new Interest to the lowest-cost nexthop
- *  that is not same as the downstream, and does not violate scope.
- *  Subsequent similar Interests or consumer retransmissions are suppressed
- *  until after InterestLifetime expiry.
- *
- *  \note This strategy is superceded by Best Route strategy version 2,
- *        which allows consumer retransmissions. This version is kept for
- *        comparison purposes and is not recommended for general usage.
- */
-class BestRouteStrategy : public BestRouteStrategyBase
-{
-public:
-  explicit
-  BestRouteStrategy(Forwarder& forwarder, const Name& name = getStrategyName());
-
-  static const Name&
-  getStrategyName();
-};
-
-} // namespace fw
-} // namespace nfd
-
-#endif // NFD_DAEMON_FW_BEST_ROUTE_STRATEGY_HPP
diff --git a/daemon/fw/best-route-strategy2.hpp b/daemon/fw/best-route-strategy2.hpp
index 79c6c0d..438ecd8 100644
--- a/daemon/fw/best-route-strategy2.hpp
+++ b/daemon/fw/best-route-strategy2.hpp
@@ -33,7 +33,7 @@
 namespace nfd {
 namespace fw {
 
-/** \brief Best Route strategy version 4
+/** \brief Best Route strategy
  *
  *  This strategy forwards a new Interest to the lowest-cost nexthop (except downstream).
  *  After that, if consumer retransmits the Interest (and is not suppressed according to
diff --git a/daemon/fw/forwarder.cpp b/daemon/fw/forwarder.cpp
index e5c0c20..387ac0d 100644
--- a/daemon/fw/forwarder.cpp
+++ b/daemon/fw/forwarder.cpp
@@ -27,6 +27,7 @@
 
 #include "algorithm.hpp"
 #include "best-route-strategy2.hpp"
+#include "scope-prefix.hpp"
 #include "strategy.hpp"
 #include "common/global.hpp"
 #include "common/logger.hpp"
diff --git a/tests/daemon/fw/algorithm.t.cpp b/tests/daemon/fw/algorithm.t.cpp
index 903a4aa..b998ec2 100644
--- a/tests/daemon/fw/algorithm.t.cpp
+++ b/tests/daemon/fw/algorithm.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,
@@ -90,27 +90,6 @@
 
 BOOST_AUTO_TEST_SUITE_END() // WouldViolateScope
 
-BOOST_AUTO_TEST_CASE(CanForwardToLegacy)
-{
-  auto interest = makeInterest("ndn:/WDsuBLIMG");
-  pit::Entry entry(*interest);
-
-  auto face1 = make_shared<DummyFace>();
-  auto face2 = make_shared<DummyFace>();
-
-  entry.insertOrUpdateInRecord(*face1, *interest);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face1), false);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face2), true);
-
-  entry.insertOrUpdateInRecord(*face2, *interest);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face1), true);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face2), true);
-
-  entry.insertOrUpdateOutRecord(*face1, *interest);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face1), false);
-  BOOST_CHECK_EQUAL(canForwardToLegacy(entry, *face2), true);
-}
-
 BOOST_AUTO_TEST_CASE(Nonce)
 {
   auto face1 = make_shared<DummyFace>();
diff --git a/tests/daemon/fw/best-route-strategy.t.cpp b/tests/daemon/fw/best-route-strategy.t.cpp
deleted file mode 100644
index b11cdae..0000000
--- a/tests/daemon/fw/best-route-strategy.t.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2014-2019,  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 "fw/best-route-strategy.hpp"
-
-#include "tests/test-common.hpp"
-#include "strategy-tester.hpp"
-
-namespace nfd {
-namespace fw {
-namespace tests {
-
-// The tester is unused in this file, but it's used in various templated test suites.
-using BestRouteStrategyTester = StrategyTester<BestRouteStrategy>;
-NFD_REGISTER_STRATEGY(BestRouteStrategyTester);
-
-} // namespace tests
-} // namespace fw
-} // namespace nfd
diff --git a/tests/daemon/fw/strategy-instantiation.t.cpp b/tests/daemon/fw/strategy-instantiation.t.cpp
index cd057bc..6bbcebb 100644
--- a/tests/daemon/fw/strategy-instantiation.t.cpp
+++ b/tests/daemon/fw/strategy-instantiation.t.cpp
@@ -30,7 +30,6 @@
 // All strategies, sorted alphabetically.
 #include "fw/access-strategy.hpp"
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy.hpp"
 #include "fw/best-route-strategy2.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/self-learning-strategy.hpp"
@@ -75,7 +74,6 @@
 using Tests = boost::mpl::vector<
   Test<AccessStrategy, false, 1>,
   Test<AsfStrategy, true, 3>,
-  Test<BestRouteStrategy, false, 1>,
   Test<BestRouteStrategy2, false, 5>,
   Test<MulticastStrategy, false, 4>,
   Test<SelfLearningStrategy, false, 1>,
diff --git a/tests/daemon/fw/strategy-no-route.t.cpp b/tests/daemon/fw/strategy-no-route.t.cpp
index 2952259..c5a4f89 100644
--- a/tests/daemon/fw/strategy-no-route.t.cpp
+++ b/tests/daemon/fw/strategy-no-route.t.cpp
@@ -24,11 +24,11 @@
  */
 
 /** \file
- *  This test suite checks that a strategy returns Nack-NoRoute
- *  when there is no usable FIB nexthop.
+ *  This test suite checks that a strategy returns Nack-NoRoute when there are
+ *  no usable FIB nexthops.
  */
 
-// Strategies returning Nack-NoRoute when there is no usable FIB nexthop,
+// Strategies returning Nack-NoRoute when there are no usable FIB nexthops,
 // sorted alphabetically.
 #include "fw/asf-strategy.hpp"
 #include "fw/best-route-strategy2.hpp"
@@ -39,7 +39,6 @@
 #include "choose-strategy.hpp"
 #include "strategy-tester.hpp"
 
-#include <boost/mpl/copy_if.hpp>
 #include <boost/mpl/vector.hpp>
 
 namespace nfd {
@@ -155,8 +154,8 @@
   Test<RandomStrategy, NextHopViolatesScope<RandomStrategy>>
 >;
 
-BOOST_FIXTURE_TEST_CASE_TEMPLATE(IncomingInterest, T, Tests,
-                                 StrategyNoRouteFixture<typename T::Strategy>)
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(IncomingInterest,
+                                 T, Tests, StrategyNoRouteFixture<typename T::Strategy>)
 {
   typename T::Case scenario;
   scenario.insertFibEntry(this);
diff --git a/tests/daemon/fw/strategy-scope-control.t.cpp b/tests/daemon/fw/strategy-scope-control.t.cpp
index a707a46..7b0a271 100644
--- a/tests/daemon/fw/strategy-scope-control.t.cpp
+++ b/tests/daemon/fw/strategy-scope-control.t.cpp
@@ -30,7 +30,6 @@
 // Strategies implementing namespace-based scope control, sorted alphabetically.
 #include "fw/access-strategy.hpp"
 #include "fw/asf-strategy.hpp"
-#include "fw/best-route-strategy.hpp"
 #include "fw/best-route-strategy2.hpp"
 #include "fw/multicast-strategy.hpp"
 #include "fw/random-strategy.hpp"
@@ -113,7 +112,6 @@
 using Tests = boost::mpl::vector<
   Test<AccessStrategy, false, false, true>,
   Test<AsfStrategy, true, false, true>,
-  Test<BestRouteStrategy, false, false, true>,
   Test<BestRouteStrategy2, true, true, true>,
   Test<MulticastStrategy, false, false, false>,
   Test<RandomStrategy, true, true, true>
diff --git a/tests/daemon/fw/strategy-tester.hpp b/tests/daemon/fw/strategy-tester.hpp
index eab4069..b9ed2ff 100644
--- a/tests/daemon/fw/strategy-tester.hpp
+++ b/tests/daemon/fw/strategy-tester.hpp
@@ -53,11 +53,7 @@
 class StrategyTester : public S
 {
 public:
-  explicit
-  StrategyTester(Forwarder& forwarder, const Name& name = getStrategyName())
-    : S(forwarder, name)
-  {
-  }
+  using S::S;
 
   static Name
   getStrategyName()
@@ -76,7 +72,7 @@
     return name;
   }
 
-  /** \brief signal emitted after each Action
+  /** \brief Signal emitted after each action
    */
   signal::Signal<StrategyTester<S>> afterAction;
 
@@ -95,11 +91,11 @@
       ++nActions;
     });
 
-    f();
+    std::forward<F>(f)();
 
     if (nActions < nExpectedActions) {
       // If strategy doesn't forward anything (e.g., decides not to forward an Interest), the number
-      // of expected actions should be 0; otherwise the test will stuck.
+      // of expected actions should be 0; otherwise the test will get stuck.
       return limitedIo.run(nExpectedActions - nActions, LimitedIo::UNLIMITED_TIME) == LimitedIo::EXCEED_OPS;
     }
     return nActions == nExpectedActions;
diff --git a/tests/daemon/mgmt/tables-config-section.t.cpp b/tests/daemon/mgmt/tables-config-section.t.cpp
index dfce51e..789d64f 100644
--- a/tests/daemon/mgmt/tables-config-section.t.cpp
+++ b/tests/daemon/mgmt/tables-config-section.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,
@@ -403,7 +403,7 @@
     {
       strategy_choice
       {
-        / /localhost/nfd/strategy/best-route/%FD%01/param
+        / /localhost/nfd/strategy/best-route/%FD%05/param
       }
     }
   )CONFIG";
