diff --git a/service/Android.mk b/service/Android.mk
index ab00586..b396214 100644
--- a/service/Android.mk
+++ b/service/Android.mk
@@ -48,8 +48,7 @@
 	android.hardware.wifi.supplicant-V1.2-java \
 	wifi_service_proto \
 	ksoap2 \
-	libnanohttpd \
-	gsf-client
+	libnanohttpd
 
 LOCAL_REQUIRED_MODULES := \
 	services \
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 292e902..a18760c 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -959,8 +959,6 @@
                 mWifiMetrics.getHandler());
         mWifiMonitor.registerHandler(mInterfaceName, CMD_TARGET_BSSID,
                 mWifiMetrics.getHandler());
-        mWifiMonitor.registerHandler(mInterfaceName, WifiMonitor.NETWORK_CONNECTION_EVENT,
-                mWifiInjector.getWifiLastResortWatchdog().getHandler());
     }
 
     private void setMulticastFilter(boolean enabled) {
@@ -4294,7 +4292,6 @@
                     }
 
                     if (mWifiNative.connectToNetwork(mInterfaceName, config)) {
-                        mWifiInjector.getWifiLastResortWatchdog().noteStartConnectTime();
                         mWifiMetrics.logStaEvent(StaEvent.TYPE_CMD_START_CONNECT, config);
                         mLastConnectAttemptTimestamp = mClock.getWallClockMillis();
                         mTargetWifiConfiguration = config;
diff --git a/service/java/com/android/server/wifi/GservicesFacade.java b/service/java/com/android/server/wifi/GservicesFacade.java
deleted file mode 100644
index a629a58..0000000
--- a/service/java/com/android/server/wifi/GservicesFacade.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wifi;
-
-import android.content.Context;
-
-import com.google.android.gsf.Gservices;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * This class allows getting all configurable flags from Gservices.
- */
-public class GservicesFacade {
-    private static final int DEFAULT_ABNORMAL_CONNECTION_DURATION_MS =
-            (int) TimeUnit.SECONDS.toMillis(30);
-    private static final String G_PREFIX = "android.wifi.";
-    private Context mContext;
-
-    public GservicesFacade(Context context) {
-        mContext = context;
-    }
-
-    /**
-     * Gets the feature flag for reporting abnormally long connections.
-     */
-    public boolean isAbnormalConnectionBugreportEnabled() {
-        return Gservices.getBoolean(mContext.getContentResolver(),
-                G_PREFIX + "abnormal_connection_bugreport_enabled", false);
-    }
-
-    /**
-     * Gets the threshold for classifying abnormally long connections.
-     */
-    public int getAbnormalConnectionDurationMs() {
-        return Gservices.getInt(mContext.getContentResolver(),
-                G_PREFIX + "abnormal_connection_duration_ms",
-                DEFAULT_ABNORMAL_CONNECTION_DURATION_MS);
-    }
-}
diff --git a/service/java/com/android/server/wifi/HostapdHal.java b/service/java/com/android/server/wifi/HostapdHal.java
index 69c787f..ee96fb2 100644
--- a/service/java/com/android/server/wifi/HostapdHal.java
+++ b/service/java/com/android/server/wifi/HostapdHal.java
@@ -39,6 +39,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import javax.annotation.concurrent.ThreadSafe;
 
@@ -51,6 +54,8 @@
     private static final String TAG = "HostapdHal";
     @VisibleForTesting
     public static final String HAL_INSTANCE_NAME = "default";
+    @VisibleForTesting
+    public static final long WAIT_FOR_DEATH_TIMEOUT_MS = 50L;
 
     private final Object mLock = new Object();
     private boolean mVerboseLoggingEnabled = false;
@@ -230,11 +235,11 @@
      * Link to death for IHostapd object.
      * @return true on success, false otherwise.
      */
-    private boolean linkToHostapdDeath() {
+    private boolean linkToHostapdDeath(HwRemoteBinder.DeathRecipient deathRecipient, long cookie) {
         synchronized (mLock) {
             if (mIHostapd == null) return false;
             try {
-                if (!mIHostapd.linkToDeath(mHostapdDeathRecipient, ++mDeathRecipientCookie)) {
+                if (!mIHostapd.linkToDeath(deathRecipient, cookie)) {
                     Log.wtf(TAG, "Error on linkToDeath on IHostapd");
                     hostapdServiceDiedHandler(mDeathRecipientCookie);
                     return false;
@@ -282,7 +287,7 @@
                 Log.e(TAG, "Got null IHostapd service. Stopping hostapd HIDL startup");
                 return false;
             }
-            if (!linkToHostapdDeath()) {
+            if (!linkToHostapdDeath(mHostapdDeathRecipient, ++mDeathRecipientCookie)) {
                 mIHostapd = null;
                 return false;
             }
@@ -486,10 +491,19 @@
     }
 
     /**
-     * Terminate the hostapd daemon.
+     * Terminate the hostapd daemon & wait for it's death.
      */
     public void terminate() {
         synchronized (mLock) {
+            // Register for a new death listener to block until hostapd is dead.
+            final long waitForDeathCookie = new Random().nextLong();
+            final CountDownLatch waitForDeathLatch = new CountDownLatch(1);
+            linkToHostapdDeath((cookie) -> {
+                Log.d(TAG, "IHostapd died: cookie=" + cookie);
+                if (cookie != waitForDeathCookie) return;
+                waitForDeathLatch.countDown();
+            }, waitForDeathCookie);
+
             final String methodStr = "terminate";
             if (!checkHostapdAndLogFailure(methodStr)) return;
             try {
@@ -497,6 +511,15 @@
             } catch (RemoteException e) {
                 handleRemoteException(e, methodStr);
             }
+
+            // Now wait for death listener callback to confirm that it's dead.
+            try {
+                if (!waitForDeathLatch.await(WAIT_FOR_DEATH_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+                    Log.w(TAG, "Timed out waiting for confirmation of hostapd death");
+                }
+            } catch (InterruptedException e) {
+                Log.w(TAG, "Failed to wait for hostapd death");
+            }
         }
     }
 
diff --git a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
index bed66d9..86518c7 100644
--- a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
+++ b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
@@ -86,6 +86,9 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Objects;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -108,6 +111,8 @@
     public static final String INIT_STOP_PROPERTY = "ctl.stop";
     @VisibleForTesting
     public static final String INIT_SERVICE_NAME = "wpa_supplicant";
+    @VisibleForTesting
+    public static final long WAIT_FOR_DEATH_TIMEOUT_MS = 50L;
     /**
      * Regex pattern for extracting the wps device type bytes.
      * Matches a strings like the following: "<categ>-<OUI>-<subcateg>";
@@ -262,11 +267,12 @@
         }
     }
 
-    private boolean linkToSupplicantDeath() {
+    private boolean linkToSupplicantDeath(
+            HwRemoteBinder.DeathRecipient deathRecipient, long cookie) {
         synchronized (mLock) {
             if (mISupplicant == null) return false;
             try {
-                if (!mISupplicant.linkToDeath(mSupplicantDeathRecipient, ++mDeathRecipientCookie)) {
+                if (!mISupplicant.linkToDeath(deathRecipient, cookie)) {
                     Log.wtf(TAG, "Error on linkToDeath on ISupplicant");
                     supplicantServiceDiedHandler(mDeathRecipientCookie);
                     return false;
@@ -294,7 +300,7 @@
                 Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup");
                 return false;
             }
-            if (!linkToSupplicantDeath()) {
+            if (!linkToSupplicantDeath(mSupplicantDeathRecipient, ++mDeathRecipientCookie)) {
                 return false;
             }
         }
@@ -645,10 +651,19 @@
     }
 
     /**
-     * Terminate the supplicant daemon.
+     * Terminate the supplicant daemon & wait for it's death.
      */
     public void terminate() {
         synchronized (mLock) {
+            // Register for a new death listener to block until supplicant is dead.
+            final long waitForDeathCookie = new Random().nextLong();
+            final CountDownLatch waitForDeathLatch = new CountDownLatch(1);
+            linkToSupplicantDeath((cookie) -> {
+                Log.d(TAG, "ISupplicant died: cookie=" + cookie);
+                if (cookie != waitForDeathCookie) return;
+                waitForDeathLatch.countDown();
+            }, waitForDeathCookie);
+
             if (isV1_1()) {
                 Log.i(TAG, "Terminating supplicant using HIDL");
                 terminate_V1_1();
@@ -656,6 +671,15 @@
                 Log.i(TAG, "Terminating supplicant using init");
                 mPropertyService.set(INIT_STOP_PROPERTY, INIT_SERVICE_NAME);
             }
+
+            // Now wait for death listener callback to confirm that it's dead.
+            try {
+                if (!waitForDeathLatch.await(WAIT_FOR_DEATH_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+                    Log.w(TAG, "Timed out waiting for confirmation of supplicant death");
+                }
+            } catch (InterruptedException e) {
+                Log.w(TAG, "Failed to wait for supplicant death");
+            }
         }
     }
 
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index a449ef3..f33c7cf 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -82,7 +82,6 @@
 
     private final Context mContext;
     private final FrameworkFacade mFrameworkFacade = new FrameworkFacade();
-    private final GservicesFacade mGservicesFacade;
     private final HandlerThread mWifiServiceHandlerThread;
     private final HandlerThread mWifiCoreHandlerThread;
     private final HandlerThread mWifiP2pServiceHandlerThread;
@@ -169,7 +168,6 @@
         sWifiInjector = this;
 
         mContext = context;
-        mGservicesFacade = new GservicesFacade(mContext);
         mWifiScoreCard = new WifiScoreCard(mClock,
                 Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID));
         mSettingsStore = new WifiSettingsStore(mContext);
@@ -607,9 +605,8 @@
                 mWifiCoreHandlerThread.getLooper(), mFrameworkFacade, mClock, mWifiMetrics,
                 mWifiConfigManager, mWifiConfigStore, clientModeImpl,
                 new ConnectToNetworkNotificationBuilder(mContext, mFrameworkFacade));
-        mWifiLastResortWatchdog = new WifiLastResortWatchdog(this, mContext, mClock,
-                mWifiMetrics, clientModeImpl, clientModeImpl.getHandler().getLooper(),
-                mGservicesFacade);
+        mWifiLastResortWatchdog = new WifiLastResortWatchdog(this, mClock,
+                mWifiMetrics, clientModeImpl, clientModeImpl.getHandler().getLooper());
         return new WifiConnectivityManager(mContext, getScoringParams(),
                 clientModeImpl, this,
                 mWifiConfigManager, clientModeImpl.getWifiInfo(),
diff --git a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
index 868a3e9..6889b50 100644
--- a/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
+++ b/service/java/com/android/server/wifi/WifiLastResortWatchdog.java
@@ -16,15 +16,10 @@
 
 package com.android.server.wifi;
 
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiConfiguration;
 import android.os.Handler;
 import android.os.Looper;
-import android.os.Message;
 import android.text.TextUtils;
 import android.util.LocalLog;
 import android.util.Log;
@@ -32,8 +27,6 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 
-import com.google.android.gsf.Gservices;
-
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.HashMap;
@@ -82,10 +75,6 @@
     @VisibleForTesting
     public static final long LAST_TRIGGER_TIMEOUT_MILLIS = 2 * 3600 * 1000; // 2 hours
 
-    private int mAbnormalConnectionDurationMs;
-    private boolean mAbnormalConnectionBugreportEnabled;
-
-
     /**
      * Cached WifiConfigurations of available networks seen within MAX_BSSID_AGE scan results
      * Key:BSSID, Value:Counters of failure types
@@ -113,98 +102,22 @@
     private Looper mClientModeImplLooper;
     private double mBugReportProbability = PROB_TAKE_BUGREPORT_DEFAULT;
     private Clock mClock;
-    private Context mContext;
-    private GservicesFacade mGservicesFacade;
     // If any connection failure happened after watchdog triggering restart then assume watchdog
     // did not fix the problem
     private boolean mWatchdogFixedWifi = true;
-    private long mLastStartConnectTime = 0;
-    private Handler mHandler;
 
     /**
      * Local log used for debugging any WifiLastResortWatchdog issues.
      */
     private final LocalLog mLocalLog = new LocalLog(100);
 
-    WifiLastResortWatchdog(WifiInjector wifiInjector, Context context, Clock clock,
-            WifiMetrics wifiMetrics, ClientModeImpl clientModeImpl, Looper clientModeImplLooper,
-            GservicesFacade gservicesFacade) {
+    WifiLastResortWatchdog(WifiInjector wifiInjector, Clock clock, WifiMetrics wifiMetrics,
+            ClientModeImpl clientModeImpl, Looper clientModeImplLooper) {
         mWifiInjector = wifiInjector;
         mClock = clock;
         mWifiMetrics = wifiMetrics;
         mClientModeImpl = clientModeImpl;
         mClientModeImplLooper = clientModeImplLooper;
-        mContext = context;
-        mGservicesFacade = gservicesFacade;
-        updateGServicesFlags();
-        mHandler = new Handler(clientModeImplLooper) {
-            public void handleMessage(Message msg) {
-                processMessage(msg);
-            }
-        };
-        // Registers a broadcast receiver to change update G service flags
-        mContext.registerReceiver(
-                new BroadcastReceiver() {
-                    @Override
-                    public void onReceive(Context context, Intent intent) {
-                        mHandler.post(() -> {
-                            updateGServicesFlags();
-                        });
-                    }
-                },
-                new IntentFilter(Gservices.CHANGED_ACTION));
-    }
-
-    private void updateGServicesFlags() {
-        mAbnormalConnectionBugreportEnabled =
-                mGservicesFacade.isAbnormalConnectionBugreportEnabled();
-        mAbnormalConnectionDurationMs =
-                mGservicesFacade.getAbnormalConnectionDurationMs();
-        logv("updateGServicesFlags: mAbnormalConnectionDurationMs = "
-                + mAbnormalConnectionDurationMs
-                + ", mAbnormalConnectionBugreportEnabled = "
-                + mAbnormalConnectionBugreportEnabled);
-    }
-
-    /**
-     * Returns handler for L2 events from supplicant.
-     * @return Handler
-     */
-    public Handler getHandler() {
-        return mHandler;
-    }
-
-    /**
-     * Refreshes when the last CMD_START_CONNECT is triggered.
-     */
-    public void noteStartConnectTime() {
-        mLastStartConnectTime = mClock.getElapsedSinceBootMillis();
-    }
-
-    private void processMessage(Message msg) {
-        switch (msg.what) {
-            case WifiMonitor.NETWORK_CONNECTION_EVENT:
-                // Trigger bugreport for successful connections that take abnormally long
-                if (mAbnormalConnectionBugreportEnabled && mLastStartConnectTime > 0) {
-                    long durationMs = mClock.getElapsedSinceBootMillis() - mLastStartConnectTime;
-                    if (durationMs > mAbnormalConnectionDurationMs) {
-                        final String bugTitle = "Wi-Fi Bugreport: Abnormal connection time";
-                        final String bugDetail = "Expected connection to take less than "
-                                + mAbnormalConnectionDurationMs + " milliseconds. "
-                                + "Actually took " + durationMs + " milliseconds.";
-                        logv("Triggering bug report for abnormal connection time.");
-                        mWifiInjector.getClientModeImplHandler().post(() -> {
-                            mClientModeImpl.takeBugReport(bugTitle, bugDetail);
-                        });
-                    }
-                }
-                // Should reset last connection time after each connection regardless if bugreport
-                // is enabled or not.
-                mLastStartConnectTime = 0;
-                break;
-            default:
-                return;
-        }
     }
 
     /**
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java b/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
index 1117339..9ae3826 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiLastResortWatchdogTest.java
@@ -21,24 +21,16 @@
 import static org.mockito.Mockito.*;
 import static org.mockito.MockitoAnnotations.*;
 
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.IntentFilter;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiSsid;
-import android.os.Handler;
 import android.os.test.TestLooper;
 import android.util.Pair;
 
 import androidx.test.filters.SmallTest;
 
-import com.google.android.gsf.Gservices;
-
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.ArgumentMatcher;
 import org.mockito.Mock;
 
 import java.util.ArrayList;
@@ -50,8 +42,6 @@
  */
 @SmallTest
 public class WifiLastResortWatchdogTest {
-    final ArgumentCaptor<BroadcastReceiver> mBroadcastReceiverCaptor =
-            ArgumentCaptor.forClass(BroadcastReceiver.class);
     WifiLastResortWatchdog mLastResortWatchdog;
     @Mock WifiInjector mWifiInjector;
     @Mock WifiMetrics mWifiMetrics;
@@ -59,8 +49,6 @@
     @Mock ClientModeImpl mClientModeImpl;
     @Mock Clock mClock;
     @Mock WifiInfo mWifiInfo;
-    @Mock Context mContext;
-    @Mock GservicesFacade mGservicesFacade;
 
     private String[] mSsids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""};
     private String[] mBssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
@@ -73,22 +61,17 @@
     private boolean[] mHasEverConnected = {false, false, false, false};
     private TestLooper mLooper;
     private static final String TEST_NETWORK_SSID = "\"test_ssid\"";
-    private static final int DEFAULT_ABNORMAL_CONNECTION_DURATION_MS = 30000;
 
     @Before
     public void setUp() throws Exception {
         initMocks(this);
         mLooper = new TestLooper();
         when(mWifiInjector.getSelfRecovery()).thenReturn(mSelfRecovery);
-        when(mGservicesFacade.isAbnormalConnectionBugreportEnabled()).thenReturn(true);
-        when(mGservicesFacade.getAbnormalConnectionDurationMs()).thenReturn(
-                        DEFAULT_ABNORMAL_CONNECTION_DURATION_MS);
-        mLastResortWatchdog = new WifiLastResortWatchdog(mWifiInjector, mContext, mClock,
-                mWifiMetrics, mClientModeImpl, mLooper.getLooper(), mGservicesFacade);
+        mLastResortWatchdog = new WifiLastResortWatchdog(mWifiInjector, mClock, mWifiMetrics,
+                mClientModeImpl, mLooper.getLooper());
         mLastResortWatchdog.setBugReportProbability(1);
         when(mClientModeImpl.getWifiInfo()).thenReturn(mWifiInfo);
         when(mWifiInfo.getSSID()).thenReturn(TEST_NETWORK_SSID);
-        when(mWifiInjector.getClientModeImplHandler()).thenReturn(mLastResortWatchdog.getHandler());
     }
 
     private List<Pair<ScanDetail, WifiConfiguration>> createFilteredQnsCandidates(String[] ssids,
@@ -2169,98 +2152,4 @@
         verify(mWifiMetrics, times(1)).incrementNumLastResortWatchdogSuccesses();
     }
 
-    /**
-     * Verifies that when a connection takes too long (time difference between
-     * StaEvent.TYPE_CMD_START_CONNECT and StaEvent.TYPE_NETWORK_CONNECTION_EVENT) a bugreport is
-     * taken.
-     */
-    @Test
-    public void testAbnormalConnectionTimeTriggersBugreport() throws Exception {
-        // first verifies that bugreports are not taken when connection takes less than
-        // DEFAULT_ABNORMAL_CONNECTION_DURATION_MS
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(1L);
-        mLastResortWatchdog.noteStartConnectTime();
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(
-                (long) DEFAULT_ABNORMAL_CONNECTION_DURATION_MS);
-        Handler handler = mLastResortWatchdog.getHandler();
-        handler.sendMessage(
-                handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
-        mLooper.dispatchAll();
-        verify(mClientModeImpl, never()).takeBugReport(anyString(), anyString());
-
-        // Now verify that bugreport is taken
-        mLastResortWatchdog.noteStartConnectTime();
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(
-                2L * DEFAULT_ABNORMAL_CONNECTION_DURATION_MS + 1);
-        handler.sendMessage(
-                handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
-        mLooper.dispatchAll();
-        verify(mClientModeImpl).takeBugReport(anyString(), anyString());
-
-        // Verify additional connections (without more TYPE_CMD_START_CONNECT) don't trigger more
-        // bugreports.
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(
-                4L * DEFAULT_ABNORMAL_CONNECTION_DURATION_MS);
-        handler.sendMessage(
-                handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
-        mLooper.dispatchAll();
-        verify(mClientModeImpl).takeBugReport(anyString(), anyString());
-    }
-
-    /**
-     * Changes |mAbnormalConnectionDurationMs| to a new value, and then verify that a bugreport is
-     * taken for a connection that takes longer than the new threshold.
-     * @throws Exception
-     */
-    @Test
-    public void testGServicesSetDuration() throws Exception {
-        final int testDurationMs = 10 * 1000; // 10 seconds
-        // changes the abnormal connection duration to |testDurationMs|.
-        when(mGservicesFacade.getAbnormalConnectionDurationMs()).thenReturn(testDurationMs);
-        verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
-                (IntentFilter) argThat(new IntentFilterMatcher()));
-        mBroadcastReceiverCaptor.getValue().onReceive(mContext, null);
-
-        // verifies that bugreport is taken for connections that take longer than |testDurationMs|.
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(1L);
-        mLastResortWatchdog.noteStartConnectTime();
-        when(mClock.getElapsedSinceBootMillis()).thenReturn((long) testDurationMs + 2);
-        Handler handler = mLastResortWatchdog.getHandler();
-        handler.sendMessage(
-                handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
-        mLooper.dispatchAll();
-        verify(mClientModeImpl).takeBugReport(anyString(), anyString());
-    }
-
-    /**
-     * Verifies that bugreports are not triggered even when conditions are met after the
-     * |mAbnormalConnectionBugreportEnabled| flag is changed to false.
-     * @throws Exception
-     */
-    @Test
-    public void testGServicesFlagDisable() throws Exception {
-        // changes |mAbnormalConnectionBugreportEnabled| to false.
-        when(mGservicesFacade.isAbnormalConnectionBugreportEnabled()).thenReturn(false);
-        verify(mContext).registerReceiver(mBroadcastReceiverCaptor.capture(),
-                (IntentFilter) argThat(new IntentFilterMatcher()));
-        mBroadcastReceiverCaptor.getValue().onReceive(mContext, null);
-
-        // verifies that bugreports are not taken.
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(1L);
-        mLastResortWatchdog.noteStartConnectTime();
-        when(mClock.getElapsedSinceBootMillis()).thenReturn(
-                (long) DEFAULT_ABNORMAL_CONNECTION_DURATION_MS + 2);
-        Handler handler = mLastResortWatchdog.getHandler();
-        handler.sendMessage(
-                handler.obtainMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, 0, 0, null));
-        mLooper.dispatchAll();
-        verify(mClientModeImpl, never()).takeBugReport(anyString(), anyString());
-    }
-
-    private class IntentFilterMatcher implements ArgumentMatcher<IntentFilter> {
-        @Override
-        public boolean matches(IntentFilter filter) {
-            return filter.hasAction(Gservices.CHANGED_ACTION);
-        }
-    }
 }
