diff --git a/libweave/include/weave/test/mock_task_runner.h b/libweave/include/weave/test/mock_task_runner.h
index 0aa3186..5fee077 100644
--- a/libweave/include/weave/test/mock_task_runner.h
+++ b/libweave/include/weave/test/mock_task_runner.h
@@ -30,7 +30,6 @@
 
   bool RunOnce();
   void Run();
-  void Break();
   base::Clock* GetClock();
 
  private:
@@ -46,7 +45,6 @@
     }
   };
 
-  bool break_{false};
   size_t counter_{0};  // Keeps order of tasks with the same time.
 
   class TestClock;
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index cce7994..c7d8c24 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -76,7 +76,6 @@
     return true;
   }
 
-  // TODO(vitalybuka): Remove error.
   bool GetName(std::string* name, ErrorPtr* error) const override {
     *name = device_->GetConfig().name();
     return true;
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index 6dd044d..5a32419 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -16,6 +16,12 @@
 namespace weave {
 namespace privet {
 
+namespace {
+const int kConnectTimeoutMinutes = 3;
+const int kBootstrapTimeoutMinutes = 10;
+const int kMonitorTimeoutMinutes = 2;
+}
+
 WifiBootstrapManager::WifiBootstrapManager(
     const std::string& last_configured_ssid,
     const std::string& test_privet_ssid,
@@ -75,7 +81,7 @@
     task_runner_->PostDelayedTask(
         FROM_HERE, base::Bind(&WifiBootstrapManager::OnBootstrapTimeout,
                               tasks_weak_factory_.GetWeakPtr()),
-        base::TimeDelta::FromMinutes(10));
+        base::TimeDelta::FromMinutes(kBootstrapTimeoutMinutes));
   }
   // TODO(vitalybuka): Add SSID probing.
   privet_ssid_ = GenerateSsid();
@@ -98,7 +104,7 @@
   task_runner_->PostDelayedTask(
       FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
                             tasks_weak_factory_.GetWeakPtr()),
-      base::TimeDelta::FromMinutes(3));
+      base::TimeDelta::FromMinutes(kConnectTimeoutMinutes));
   network_->ConnectToService(ssid, passphrase,
                              base::Bind(&WifiBootstrapManager::OnConnectSuccess,
                                         tasks_weak_factory_.GetWeakPtr(), ssid),
@@ -113,19 +119,6 @@
   // We already have a callback in place with |network_| to update our
   // connectivity state.  See OnConnectivityChange().
   UpdateState(State::kMonitoring);
-
-  if (network_->GetConnectionState() == NetworkState::kConnected) {
-    monitor_until_ = base::Time::Max();
-  } else {
-    if (monitor_until_ == base::Time::Max())
-      monitor_until_ = base::Time::Now() + base::TimeDelta::FromMinutes(2);
-
-    // Schedule timeout timer taking into account already offline time.
-    task_runner_->PostDelayedTask(
-        FROM_HERE, base::Bind(&WifiBootstrapManager::OnMonitorTimeout,
-                              tasks_weak_factory_.GetWeakPtr()),
-        monitor_until_ - base::Time::Now());
-  }
 }
 
 void WifiBootstrapManager::EndMonitoring() {
@@ -241,9 +234,22 @@
   VLOG(3) << "ConnectivityChanged: " << is_connected;
   UpdateConnectionState();
 
-  if (state_ == State::kMonitoring ||  // Reset monitoring timeout.
-      (state_ == State::kDisabled && is_connected)) {
+  if (state_ == State::kBootstrapping && is_connected) {
     StartMonitoring();
+    return;
+  }
+  if (state_ == State::kMonitoring) {
+    if (is_connected) {
+      tasks_weak_factory_.InvalidateWeakPtrs();
+    } else {
+      // Tasks queue may have more than one OnMonitorTimeout enqueued. The
+      // first one could be executed as it would change the state and abort the
+      // rest.
+      task_runner_->PostDelayedTask(
+          FROM_HERE, base::Bind(&WifiBootstrapManager::OnMonitorTimeout,
+                                tasks_weak_factory_.GetWeakPtr()),
+          base::TimeDelta::FromMinutes(kMonitorTimeoutMinutes));
+    }
   }
 }
 
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index c0052a0..f622c77 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -101,7 +101,6 @@
   TaskRunner* task_runner_{nullptr};
   Network* network_{nullptr};
   WifiSsidGenerator ssid_generator_;
-  base::Time monitor_until_;
 
   std::vector<StateListener> state_listeners_;
   bool currently_online_{false};
diff --git a/libweave/src/test/mock_task_runner.cc b/libweave/src/test/mock_task_runner.cc
index a78b4e1..da9246a 100644
--- a/libweave/src/test/mock_task_runner.cc
+++ b/libweave/src/test/mock_task_runner.cc
@@ -40,15 +40,10 @@
 }
 
 void MockTaskRunner::Run() {
-  break_ = false;
-  while (!break_ && RunOnce()) {
+  while (RunOnce()) {
   }
 }
 
-void MockTaskRunner::Break() {
-  break_ = true;
-}
-
 base::Clock* MockTaskRunner::GetClock() {
   return test_clock_.get();
 }
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index 0629dac..7b3bbdb 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -221,18 +221,11 @@
 
   void InitNetwork() {
     EXPECT_CALL(network_, AddOnConnectionChangedCallback(_))
-        .WillRepeatedly(
-            Invoke([this](const Network::OnConnectionChangedCallback& cb) {
-              network_callbacks_.push_back(cb);
-            }));
+        .WillRepeatedly(Return());
     EXPECT_CALL(network_, GetConnectionState())
         .WillRepeatedly(Return(NetworkState::kOffline));
-  }
-
-  void IgnoreMdns() {
-    EXPECT_CALL(mdns_, GetId()).WillRepeatedly(Return("TEST_ID"));
-    EXPECT_CALL(mdns_, PublishService(_, _, _)).WillRepeatedly(Return());
-    EXPECT_CALL(mdns_, StopPublishing("_privet._tcp")).WillOnce(Return());
+    EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
+        .WillOnce(Return());
   }
 
   void InitMdns() {
@@ -279,16 +272,12 @@
             }));
   }
 
-  void InitDefaultExpectations() {
+  void StartDevice() {
     InitConfigStore();
     InitNetwork();
-    EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
-        .WillOnce(Return());
     InitHttpServer();
     InitMdns();
-  }
 
-  void StartDevice() {
     weave::Device::Options options;
     options.xmpp_enabled = false;
 
@@ -322,8 +311,6 @@
   StrictMock<test::MockMdns> mdns_;
   StrictMock<test::MockHttpServer> http_server_;
 
-  std::vector<Network::OnConnectionChangedCallback> network_callbacks_;
-
   weave::Cloud* cloud_{nullptr};
 
   std::unique_ptr<weave::Device> device_;
@@ -344,19 +331,11 @@
                  &network_, nullptr, nullptr);
 }
 
-class WeaveBasicTest : public WeaveTest {
- public:
-  void SetUp() override {
-    WeaveTest::SetUp();
-    InitDefaultExpectations();
-  }
-};
-
-TEST_F(WeaveBasicTest, Start) {
+TEST_F(WeaveTest, Start) {
   StartDevice();
 }
 
-TEST_F(WeaveBasicTest, Register) {
+TEST_F(WeaveTest, Register) {
   StartDevice();
 
   auto draft = CreateDictionaryValue(kDeviceResource);
@@ -384,94 +363,4 @@
   EXPECT_EQ("DEVICE_ID", cloud_->RegisterDevice("TEST_ID", nullptr));
 }
 
-class WeaveWiFiSetupTest : public WeaveTest {
- public:
-  void SetUp() override {
-    WeaveTest::SetUp();
-
-    InitConfigStore();
-    InitHttpServer();
-    InitNetwork();
-    IgnoreMdns();
-
-    EXPECT_CALL(network_, GetConnectionState())
-        .WillRepeatedly(Return(NetworkState::kConnected));
-  }
-};
-
-TEST_F(WeaveWiFiSetupTest, StartOnlineNoPrevSsid) {
-  StartDevice();
-
-  // Short disconnect.
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(NetworkState::kOffline));
-  for (const auto& cb : network_callbacks_) {
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(cb, false), {});
-  }
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(NetworkState::kConnected));
-  for (const auto& cb : network_callbacks_) {
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(cb, true),
-                                 base::TimeDelta::FromSeconds(10));
-  }
-  task_runner_.Run();
-
-  // Long disconnect.
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(NetworkState::kOffline));
-  for (const auto& cb : network_callbacks_) {
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(cb, false), {});
-  }
-  auto offline_from = task_runner_.GetClock()->Now();
-  EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
-      .WillOnce(InvokeWithoutArgs([this, offline_from]() {
-        EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
-                  base::TimeDelta::FromMinutes(1));
-      }));
-  task_runner_.Run();
-}
-
-// If device has previously configured WiFi it will run AP for limited time
-// after which it will try to re-connect.
-TEST_F(WeaveWiFiSetupTest, StartOnlineWithPrevSsid) {
-  EXPECT_CALL(config_store_, LoadSettings())
-      .WillRepeatedly(Return(R"({"last_configured_ssid": "TEST_ssid"})"));
-  StartDevice();
-
-  // Long disconnect.
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(NetworkState::kOffline));
-  for (const auto& cb : network_callbacks_) {
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(cb, false), {});
-  }
-
-  for (int i = 0; i < 5; ++i) {
-    auto offline_from = task_runner_.GetClock()->Now();
-    // Temporarily offline mode.
-    EXPECT_CALL(network_, EnableAccessPoint(MatchesRegex("DEVICE_NAME.*prv")))
-        .WillOnce(InvokeWithoutArgs([this, &offline_from]() {
-          EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
-                    base::TimeDelta::FromMinutes(1));
-          task_runner_.Break();
-        }));
-    task_runner_.Run();
-
-    // Try to reconnect again.
-    offline_from = task_runner_.GetClock()->Now();
-    EXPECT_CALL(network_, DisableAccessPoint())
-        .WillOnce(InvokeWithoutArgs([this, offline_from]() {
-          EXPECT_GT(task_runner_.GetClock()->Now() - offline_from,
-                    base::TimeDelta::FromMinutes(5));
-          task_runner_.Break();
-        }));
-    task_runner_.Run();
-  }
-
-  EXPECT_CALL(network_, GetConnectionState())
-      .WillRepeatedly(Return(NetworkState::kConnected));
-  for (const auto& cb : network_callbacks_)
-    task_runner_.PostDelayedTask(FROM_HERE, base::Bind(cb, true), {});
-  task_runner_.Run();
-}
-
 }  // namespace weave
