diff --git a/src/connectivity/weave/adaptation/BUILD.gn b/src/connectivity/weave/adaptation/BUILD.gn
index c39c886..eb3e478 100644
--- a/src/connectivity/weave/adaptation/BUILD.gn
+++ b/src/connectivity/weave/adaptation/BUILD.gn
@@ -63,7 +63,6 @@
     "//sdk/lib/sys/cpp",
     "//sdk/lib/sys/inspect/cpp",
     "//sdk/lib/syslog/cpp:backend_legacy",
-    "//src/lib/backoff",
     "//src/lib/files",
     "//src/lib/fsl",
     "//src/lib/json_parser",
diff --git a/src/connectivity/weave/adaptation/connectivity_manager_delegate_impl.cpp b/src/connectivity/weave/adaptation/connectivity_manager_delegate_impl.cpp
index e77c65a..9e60f62 100644
--- a/src/connectivity/weave/adaptation/connectivity_manager_delegate_impl.cpp
+++ b/src/connectivity/weave/adaptation/connectivity_manager_delegate_impl.cpp
@@ -317,18 +317,13 @@
           [](intptr_t) { Warm::WiFiInterfaceStateChange(Warm::kInterfaceStateUp); }, 0);
     }
 
-    // The thread interface ID is recorded, but WARM is explicitly not signaled.
-    // This is deferred to the ThreadStackManager, which notifies WARM when the
-    // fuchsia.lowpan.device FIDL service reports that a new device was added.
-    // This distinction is required as LoWPAN may create a network device and
-    // trigger this interface update before it registers the LoWPAN device for
-    // it's clients, resulting in an inconsistent state where WARM believes the
-    // interface is up, but LoWPAN claims it is unaware of the device.
     if (thread_interface_id_ == 0 && properties.has_name() &&
         properties.name() == ThreadStackMgrImpl().GetInterfaceName()) {
       thread_interface_id_ = properties.id();
       FX_LOGS(INFO) << "Identifying interface \"" << properties.name()
                     << "\" as the Thread interface.";
+      PlatformMgr().ScheduleWork(
+          [](intptr_t) { Warm::ThreadInterfaceStateChange(Warm::kInterfaceStateUp); }, 0);
     }
   } else if (event.is_removed()) {
     routable_v4_interfaces.erase(event.removed());
@@ -345,9 +340,11 @@
           },
           reinterpret_cast<intptr_t>(this));
     } else if (event.removed() == thread_interface_id_) {
+      FX_LOGS(INFO) << "Thread iface removed, informing WARM of Thread down.";
       PlatformMgr().ScheduleWork(
           [](intptr_t context) {
             auto self = reinterpret_cast<ConnectivityManagerDelegateImpl*>(context);
+            Warm::ThreadInterfaceStateChange(Warm::kInterfaceStateDown);
             self->thread_interface_id_ = 0;
           },
           reinterpret_cast<intptr_t>(this));
@@ -377,8 +374,7 @@
     return kThreadMode_NotSupported;
   }
 
-  return ((ThreadStackMgrImpl()._IsThreadEnabled()) ? (kThreadMode_Enabled)
-                                                    : (kThreadMode_Disabled));
+  return ((ThreadStackMgrImpl()._IsThreadEnabled()) ? (kThreadMode_Enabled) : (kThreadMode_Disabled));
 }
 
 }  // namespace DeviceLayer
diff --git a/src/connectivity/weave/adaptation/tests/thread_stack_manager_unittests.cpp b/src/connectivity/weave/adaptation/tests/thread_stack_manager_unittests.cpp
index 95c6b92..03859f3 100644
--- a/src/connectivity/weave/adaptation/tests/thread_stack_manager_unittests.cpp
+++ b/src/connectivity/weave/adaptation/tests/thread_stack_manager_unittests.cpp
@@ -22,7 +22,6 @@
 #include <Weave/DeviceLayer/internal/WeaveDeviceLayerInternal.h>
 #include <Weave/DeviceLayer/internal/DeviceNetworkInfo.h>
 #include <Weave/DeviceLayer/ThreadStackManager.h>
-#include <Warm/Warm.h>
 #pragma GCC diagnostic pop
 // clang-format on
 
@@ -490,13 +489,6 @@
 
   void GetDevices(GetDevicesCallback callback) override { callback({kFakeInterfaceName}); }
 
-  void WatchDevices(WatchDevicesCallback callback) override {
-    if (!watch_devices_once_) {
-      callback({.added = {kFakeInterfaceName}});
-      watch_devices_once_ = true;
-    }
-  }
-
   void LookupDevice(std::string name, Protocols protocols, LookupDeviceCallback callback) override {
     Lookup_LookupDevice_Result result;
     if (name != kFakeInterfaceName) {
@@ -530,10 +522,13 @@
   }
 
   fidl::InterfaceRequestHandler<Lookup> GetHandler(async_dispatcher_t* dispatcher) {
-    return bindings_.GetHandler(this, dispatcher);
+    dispatcher_ = dispatcher;
+    device_.set_dispatcher(dispatcher);
+    return [this](fidl::InterfaceRequest<Lookup> request) {
+      binding_.Bind(std::move(request), dispatcher_);
+    };
   }
 
-  void set_dispatcher(async_dispatcher_t* dispatcher) { dispatcher_ = dispatcher; }
   FakeLowpanDevice& device() { return device_; }
   FakeThreadLegacy& thread_legacy() { return thread_legacy_; }
   FakeCounters& counters() { return counters_; }
@@ -542,13 +537,12 @@
   FakeLowpanDevice device_;
   FakeThreadLegacy thread_legacy_;
   FakeCounters counters_;
-  bool watch_devices_once_ = false;
   fidl::BindingSet<Device> device_bindings_;
   fidl::BindingSet<DeviceExtra> device_extra_bindings_;
   fidl::BindingSet<LegacyJoining> thread_legacy_bindings_;
   fidl::BindingSet<Counters> counters_bindings_;
   async_dispatcher_t* dispatcher_;
-  fidl::BindingSet<Lookup> bindings_;
+  fidl::Binding<Lookup> binding_{this};
 };
 
 class FakeNetRoutes : public fuchsia::net::routes::testing::State_TestBase {
@@ -696,16 +690,6 @@
         fake_lookup_.GetHandler(dispatcher()));
     context_provider_.service_directory_provider()->AddService(
         fake_routes_.GetHandler(dispatcher()));
-    fake_lookup_.set_dispatcher(dispatcher());
-    fake_lookup_.device().set_dispatcher(dispatcher());
-
-    // TODO(fxbug.dev/90188): This test currently depends on WARM, which does
-    // not have a delegate interface in openweave-core. As a consequence, while
-    // this test does not need WARM, we must still initialize it and ensure that
-    // the fabric state is consistent, so that it does not attempt to add
-    // addresses during this test. The associated bug tracks the refactor to
-    // create that delegate interface and remove this test dependency.
-    fabric_state_.FabricId = kFabricIdNotSpecified;
   }
 
   void ResetConfigMgr() {
@@ -716,8 +700,6 @@
   void SetUp() override {
     WeaveTestFixture<>::SetUp();
     PlatformMgrImpl().SetComponentContextForProcess(context_provider_.TakeContext());
-    PlatformMgrImpl().SetDispatcher(dispatcher());
-    Warm::Init(fabric_state_);
     RunFixtureLoop();
     ResetConfigMgr();
     ConfigurationMgr().StorePairingCode(kFakePairingCode, sizeof(kFakePairingCode));
@@ -736,7 +718,6 @@
     WeaveTestFixture<>::TearDown();
     ThreadStackMgrImpl().SetDelegate(nullptr);
     ConfigurationMgrImpl().SetDelegate(nullptr);
-    Warm::Shutdown(fabric_state_);
   }
 
  protected:
@@ -744,7 +725,6 @@
     return *reinterpret_cast<TestConfigurationManager*>(ConfigurationMgrImpl().GetDelegate());
   }
 
-  WeaveFabricState fabric_state_;
   FakeLowpanLookup fake_lookup_;
   FakeNetRoutes fake_routes_;
   MockedEventLoggingThreadStackManagerDelegateImpl* tsm_delegate_;
diff --git a/src/connectivity/weave/adaptation/tests/warm_unittests.cpp b/src/connectivity/weave/adaptation/tests/warm_unittests.cpp
index 147d443..46347ee 100644
--- a/src/connectivity/weave/adaptation/tests/warm_unittests.cpp
+++ b/src/connectivity/weave/adaptation/tests/warm_unittests.cpp
@@ -552,6 +552,28 @@
   EXPECT_FALSE(fake_lowpan_lookup().device_route().ContainsSubnetForAddress(addr));
 }
 
+TEST_F(WarmTest, AddAddressThreadUnprovisioned) {
+  constexpr char kSubnetIp[] = "2001:0DB8:0042::";
+  constexpr uint8_t kPrefixLength = 48;
+  Inet::IPAddress addr;
+
+  // Fake unprovisioned TSM.
+  thread_delegate().set_is_thread_provisioned(false);
+
+  // Sanity check - no addresses assigned.
+  OwnedInterface& lowpan = GetThreadInterface();
+  EXPECT_EQ(lowpan.ipv6addrs.size(), 0u);
+
+  // Attempt to add the address.
+  ASSERT_TRUE(Inet::IPAddress::FromString(kSubnetIp, addr));
+  auto result = AddRemoveHostAddress(kInterfaceTypeThread, addr, kPrefixLength, /*add*/ true);
+  EXPECT_EQ(result, kPlatformResultFailure);
+
+  // Confirm that nothing was changed.
+  EXPECT_EQ(lowpan.ipv6addrs.size(), 0u);
+  EXPECT_FALSE(fake_lowpan_lookup().device_route().ContainsSubnetForAddress(addr));
+}
+
 TEST_F(WarmTest, AddRemoveAddressTunnel) {
   constexpr char kSubnetIp[] = "2001:0DB8:0042::";
   constexpr uint8_t kPrefixLength = 48;
@@ -613,12 +635,10 @@
   OwnedInterface& lowpan = GetThreadInterface();
   EXPECT_EQ(lowpan.ipv6addrs.size(), 0u);
 
-  // Attempt to remove the address, expecting success - if the interface isn't
-  // available, assume it's removed. WARM may invoke us after the interface is
-  // down. This is distinct from the 'add' case, where it represents a failure.
+  // Attempt to remove the address, expecting failure.
   ASSERT_TRUE(Inet::IPAddress::FromString(kSubnetIp, addr));
   auto result = AddRemoveHostAddress(kInterfaceTypeThread, addr, kPrefixLength, /*add*/ false);
-  EXPECT_EQ(result, kPlatformResultSuccess);
+  EXPECT_EQ(result, kPlatformResultFailure);
 
   // Sanity check - still no addresses assigned.
   EXPECT_EQ(lowpan.ipv6addrs.size(), 0u);
@@ -634,12 +654,10 @@
   OwnedInterface& weave_tun = GetTunnelInterface();
   EXPECT_EQ(weave_tun.ipv6addrs.size(), 0u);
 
-  // Attempt to remove the address, expecting success - if the interface isn't
-  // available, assume it's removed. WARM may invoke us after the interface is
-  // down. This is distinct from the 'add' case, where it represents a failure.
+  // Attempt to remove the address, expecting failure.
   ASSERT_TRUE(Inet::IPAddress::FromString(kSubnetIp, addr));
   auto result = AddRemoveHostAddress(kInterfaceTypeTunnel, addr, kPrefixLength, /*add*/ false);
-  EXPECT_EQ(result, kPlatformResultSuccess);
+  EXPECT_EQ(result, kPlatformResultFailure);
 
   // Sanity check - still no addresses assigned.
   EXPECT_EQ(weave_tun.ipv6addrs.size(), 0u);
@@ -654,12 +672,10 @@
   OwnedInterface& wlan = GetWiFiInterface();
   EXPECT_EQ(wlan.ipv6addrs.size(), 0u);
 
-  // Attempt to remove the address, expecting success - if the interface isn't
-  // available, assume it's removed. WARM may invoke us after the interface is
-  // down. This is distinct from the 'add' case, where it represents a failure.
+  // Attempt to remove the address, expecting failure.
   ASSERT_TRUE(Inet::IPAddress::FromString(kSubnetIp, addr));
   auto result = AddRemoveHostAddress(kInterfaceTypeWiFi, addr, kPrefixLength, /*add*/ false);
-  EXPECT_EQ(result, kPlatformResultSuccess);
+  EXPECT_EQ(result, kPlatformResultFailure);
 
   // Sanity check - still no addresses assigned.
   EXPECT_EQ(wlan.ipv6addrs.size(), 0u);
diff --git a/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.cpp b/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.cpp
index 124a73f..f377af9 100644
--- a/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.cpp
+++ b/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.cpp
@@ -12,7 +12,6 @@
 #include <Weave/DeviceLayer/PlatformManager.h>
 #include <Weave/DeviceLayer/ThreadStackManager.h>
 #include <Weave/Support/TraitEventUtils.h>
-#include <Warm/Warm.h>
 // clang-format on
 
 #include "thread_stack_manager_delegate_impl.h"
@@ -96,11 +95,6 @@
 // synchronously within the Device Layer, these functions all use SyncPtrs for
 // interfacing with the LoWPAN FIDL protocols.
 
-ThreadStackManagerDelegateImpl::ThreadStackManagerDelegateImpl()
-    : lookup_watcher_backoff_(zx::duration(zx_duration_from_sec(5)) /*initial_delay*/,
-                              2 /*retry_factor*/,
-                              zx::duration(zx_duration_from_sec(60)) /*max_delay*/) {}
-
 WEAVE_ERROR ThreadStackManagerDelegateImpl::InitThreadStack() {
   // See note at top to explain these SyncPtrs.
   LookupSyncPtr lookup;
@@ -180,62 +174,13 @@
 
   is_thread_supported_ = true;
 
-  WatchLowpanDeviceChange();
   if (!IsThreadProvisioned()) {
     return StartThreadJoining();
   }
+
   return WEAVE_NO_ERROR;
 }
 
-void ThreadStackManagerDelegateImpl::WatchLowpanDeviceChange() {
-  auto svc = PlatformMgrImpl().GetComponentContextForProcess()->svc();
-  zx_status_t status;
-
-  FX_LOGS(INFO) << "Begin watching for LoWPAN device changes.";
-  auto restart_callback = [this](zx_status_t error_status) {
-    if (error_status != ZX_OK) {
-      FX_LOGS(ERROR) << "Disconnected from fuchsia.lowpan.device, reconnecting: "
-                     << zx_status_get_string(error_status);
-      lookup_watcher_delayed_task_.set_handler([this]() { WatchLowpanDeviceChange(); });
-      lookup_watcher_delayed_task_.PostDelayed(PlatformMgrImpl().GetDispatcher(),
-                                               lookup_watcher_backoff_.GetNext());
-    }
-  };
-
-  status = svc->Connect(lookup_watcher_.NewRequest());
-  if (status != ZX_OK) {
-    restart_callback(status);
-    return;
-  }
-
-  lookup_watcher_.set_error_handler(restart_callback);
-  lookup_watcher_->WatchDevices(
-      fit::bind_member(this, &ThreadStackManagerDelegateImpl::OnLowpanDeviceChange));
-}
-
-void ThreadStackManagerDelegateImpl::OnLowpanDeviceChange(
-    fuchsia::lowpan::device::DeviceChanges changes) {
-  auto device_added = std::find(changes.added.begin(), changes.added.end(), interface_name_);
-  auto device_removed = std::find(changes.removed.begin(), changes.removed.end(), interface_name_);
-
-  bool added = device_added != changes.added.end();
-  bool removed = device_removed != changes.removed.end();
-
-  lookup_watcher_backoff_.Reset();
-  if (added) {
-    FX_LOGS(INFO) << "LoWPAN device added, notifying WARM.";
-    PlatformMgr().ScheduleWork(
-        [](intptr_t) { Warm::ThreadInterfaceStateChange(Warm::kInterfaceStateUp); });
-  } else if (removed) {
-    FX_LOGS(INFO) << "LoWPAN device removed, notifying WARM.";
-    PlatformMgr().ScheduleWork(
-        [](intptr_t) { Warm::ThreadInterfaceStateChange(Warm::kInterfaceStateDown); });
-  }
-
-  lookup_watcher_->WatchDevices(
-      fit::bind_member(this, &ThreadStackManagerDelegateImpl::OnLowpanDeviceChange));
-}
-
 bool ThreadStackManagerDelegateImpl::HaveRouteToAddress(const IPAddress& destAddr) {
   fuchsia::net::routes::StateSyncPtr routes;
   State_Resolve_Result result;
diff --git a/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.h b/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.h
index fa9675f8..e8c5803 100644
--- a/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.h
+++ b/src/connectivity/weave/adaptation/thread_stack_manager_delegate_impl.h
@@ -18,15 +18,13 @@
 #pragma GCC diagnostic pop
 // clang-format on
 
-#include "src/lib/backoff/exponential_backoff.h"
-
 namespace nl {
 namespace Weave {
 namespace DeviceLayer {
 
 class NL_DLL_EXPORT ThreadStackManagerDelegateImpl : public ThreadStackManagerImpl::Delegate {
  public:
-  ThreadStackManagerDelegateImpl();
+  ThreadStackManagerDelegateImpl() = default;
 
   // ThreadStackManager implementations.
 
@@ -59,10 +57,6 @@
   std::string interface_name_;
   bool is_thread_supported_ = false;
 
-  // Handle events from fuchsia.lowpan.device to maintain Thread state.
-  void WatchLowpanDeviceChange();
-  void OnLowpanDeviceChange(fuchsia::lowpan::device::DeviceChanges changes);
-
   zx_status_t GetProtocols(fuchsia::lowpan::device::Protocols protocols);
   zx_status_t GetDevice(fuchsia::lowpan::device::DeviceSyncPtr& device);
   zx_status_t GetDeviceState(fuchsia::lowpan::device::DeviceState& device_state);
@@ -83,14 +77,9 @@
   void HandleProvisioningProgress(
       fuchsia::lowpan::device::ProvisioningMonitor_WatchProgress_Result);
 
-  async::TaskClosure lookup_watcher_delayed_task_;
-  backoff::ExponentialBackoff lookup_watcher_backoff_;
-  fuchsia::lowpan::device::LookupPtr lookup_watcher_;
-
   async::TaskClosure joining_timeout_;
   async::TaskClosure joining_retry_delay_;
   fuchsia::lowpan::device::ProvisioningMonitorPtr provisioning_monitor_;
-
   bool joining_in_progress_ = false;
   bool joining_timeout_expired_ = false;
 };
diff --git a/src/connectivity/weave/adaptation/warm_support.cpp b/src/connectivity/weave/adaptation/warm_support.cpp
index 983f6ea..94d558e 100644
--- a/src/connectivity/weave/adaptation/warm_support.cpp
+++ b/src/connectivity/weave/adaptation/warm_support.cpp
@@ -31,9 +31,6 @@
 // Fixed name for tunnel interface.
 constexpr char kTunInterfaceName[] = "weav-tun0";
 
-// Prefix length for Thread addresses.
-constexpr uint8_t kThreadPrefixLength = 64;
-
 // Route metric values for primary and backup tunnels. Higher priority tunnels
 // have lower metric values so that they are prioritized in the routing table.
 constexpr uint32_t kRouteMetric_HighPriority = 0;
@@ -104,12 +101,29 @@
   return 0;
 }
 
-// Add or remove an address attached to the Thread or WLAN interfaces.
-PlatformResult AddRemoveAddressInternal(InterfaceType interface_type,
-                                        const Inet::IPAddress &address, uint8_t prefix_length,
-                                        bool add) {
+}  // namespace
+
+WEAVE_ERROR Init(WarmFabricStateDelegate *inFabricStateDelegate) { return WEAVE_NO_ERROR; }
+
+NL_DLL_EXPORT
+void CriticalSectionEnter(void) {}
+
+NL_DLL_EXPORT
+void CriticalSectionExit(void) {}
+
+NL_DLL_EXPORT
+void RequestInvokeActions(void) { ::nl::Weave::Warm::InvokeActions(); }
+
+// Add or remove address on tunnel interface.
+PlatformResult AddRemoveHostAddress(InterfaceType interface_type, const Inet::IPAddress &address,
+                                    uint8_t prefix_length, bool add) {
   auto svc = nl::Weave::DeviceLayer::PlatformMgrImpl().GetComponentContextForProcess()->svc();
 
+  if (interface_type == InterfaceType::kInterfaceTypeThread && !ConnectivityMgrImpl().IsThreadProvisioned()) {
+    FX_LOGS(WARNING) << "Not adding address when Thread is not provisioned.";
+    return kPlatformResultFailure;
+  }
+
   // Determine interface name to add/remove from.
   std::optional<std::string> interface_name = GetInterfaceName(interface_type);
   if (!interface_name) {
@@ -151,17 +165,13 @@
     FX_LOGS(ERROR) << "Failed to configure interface address to interface id "
                    << interface_id.value() << ": " << zx_status_get_string(status);
     return kPlatformResultFailure;
-  } else if (result.status == fuchsia::netstack::Status::UNKNOWN_ERROR) {
-    FX_LOGS(INFO) << "Interface address already configured on interface id "
-                  << interface_id.value();
-    return kPlatformResultSuccess;
   } else if (result.status != fuchsia::netstack::Status::OK) {
     FX_LOGS(ERROR) << "Unable to configure interface address to interface id "
                    << interface_id.value() << ": " << result.message;
     return kPlatformResultFailure;
   }
 
-  FX_LOGS(INFO) << (add ? "Added" : "Removed") << " address from interface id "
+  FX_LOGS(INFO) << (add ? "Added" : "Removed") << " host address from interface id "
                 << interface_id.value();
 
   // If this is not a Thread interface, adding the host address is sufficient.
@@ -216,8 +226,8 @@
 }
 
 // Add or remove route to/from forwarding table.
-PlatformResult AddRemoveRouteInternal(InterfaceType interface_type, const Inet::IPPrefix &prefix,
-                                      RoutePriority priority, bool add) {
+PlatformResult AddRemoveHostRoute(InterfaceType interface_type, const Inet::IPPrefix &prefix,
+                                  RoutePriority priority, bool add) {
   auto svc = nl::Weave::DeviceLayer::PlatformMgrImpl().GetComponentContextForProcess()->svc();
 
   // Determine interface name to add to/remove from.
@@ -295,7 +305,7 @@
     return kPlatformResultFailure;
   }
 
-  FX_LOGS(INFO) << (add ? "Added" : "Removed") << " route to/from interface id "
+  FX_LOGS(INFO) << (add ? "Added" : "Removed") << " host route to/from interface id "
                 << interface_id.value();
 
 #if WARM_CONFIG_SUPPORT_BORDER_ROUTING
@@ -337,55 +347,32 @@
   return kPlatformResultSuccess;
 }
 
-}  // namespace
-
-WEAVE_ERROR Init(WarmFabricStateDelegate *inFabricStateDelegate) { return WEAVE_NO_ERROR; }
-
-NL_DLL_EXPORT
-void CriticalSectionEnter(void) {}
-
-NL_DLL_EXPORT
-void CriticalSectionExit(void) {}
-
-// Add or remove a host address attached to the Thread or WLAN interfaces.
-PlatformResult AddRemoveHostAddress(InterfaceType interface_type, const Inet::IPAddress &address,
-                                    uint8_t prefix_length, bool add) {
-  return AddRemoveAddressInternal(interface_type, address, prefix_length, add);
-}
-
-// Add or remove a host route attached to the Thread or WLAN interfaces.
-PlatformResult AddRemoveHostRoute(InterfaceType interface_type, const Inet::IPPrefix &prefix,
-                                  RoutePriority priority, bool add) {
-  return AddRemoveRouteInternal(interface_type, prefix, priority, add);
-}
-
-NL_DLL_EXPORT
-void RequestInvokeActions(void) { ::nl::Weave::Warm::InvokeActions(); }
-
 #if WARM_CONFIG_SUPPORT_THREAD
-PlatformResult AddRemoveThreadAddress(InterfaceType interface_type, const Inet::IPAddress &address,
-                                      bool add) {
-  return AddRemoveAddressInternal(interface_type, address, kThreadPrefixLength, add);
+PlatformResult AddRemoveThreadAddress(InterfaceType inInterfaceType,
+                                      const Inet::IPAddress &inAddress, bool inAdd) {
+  // This will be handled during the subsequent AddRemoveHostAddress from WARM.
+  return kPlatformResultSuccess;
 }
 #endif  // WARM_CONFIG_SUPPORT_THREAD
 
 #if WARM_CONFIG_SUPPORT_THREAD_ROUTING
-PlatformResult StartStopThreadAdvertisement(InterfaceType interface_type,
-                                            const Inet::IPPrefix &prefix, bool start) {
+PlatformResult StartStopThreadAdvertisement(InterfaceType inInterfaceType,
+                                            const Inet::IPPrefix &inPrefix, bool inStart) {
   // This is handled by the LoWPAN service, nothing to do here.
   return kPlatformResultSuccess;
 }
 #endif  // WARM_CONFIG_SUPPORT_THREAD_ROUTING
 
 #if WARM_CONFIG_SUPPORT_BORDER_ROUTING
-PlatformResult AddRemoveThreadRoute(InterfaceType interface_type, const Inet::IPPrefix &prefix,
-                                    RoutePriority priority, bool add) {
-  return AddRemoveRouteInternal(interface_type, prefix, priority, add);
+PlatformResult AddRemoveThreadRoute(InterfaceType inInterfaceType, const Inet::IPPrefix &inPrefix,
+                                    RoutePriority inPriority, bool inAdd) {
+  // This will be handled during the subsequent AddRemoveHostAddress from WARM.
+  return kPlatformResultSuccess;
 }
 
-PlatformResult SetThreadRoutePriority(InterfaceType interface_type, const Inet::IPPrefix &prefix,
-                                      RoutePriority priority) {
-  // This will be handled during the AddRemoveThreadRoute from WARM.
+PlatformResult SetThreadRoutePriority(InterfaceType inInterfaceType, const Inet::IPPrefix &inPrefix,
+                                      RoutePriority inPriority) {
+  // This will be handled during the subsequent AddRemoveHostAddress from WARM.
   return kPlatformResultSuccess;
 }
 #endif  // WARM_CONFIG_SUPPORT_BORDER_ROUTING
