diff --git a/service/java/com/android/server/wifi/rtt/RttNative.java b/service/java/com/android/server/wifi/rtt/RttNative.java
index e085352..b496ec2 100644
--- a/service/java/com/android/server/wifi/rtt/RttNative.java
+++ b/service/java/com/android/server/wifi/rtt/RttNative.java
@@ -46,6 +46,7 @@
 public class RttNative extends IWifiRttControllerEventCallback.Stub {
     private static final String TAG = "RttNative";
     private static final boolean VDBG = false; // STOPSHIP if true
+    /* package */ boolean mDbg = false;
 
     private final RttServiceImpl mRttService;
     private final HalDeviceManager mHalDeviceManager;
@@ -83,7 +84,7 @@
     }
 
     private void updateController() {
-        if (VDBG) Log.v(TAG, "updateController: mIWifiRttController=" + mIWifiRttController);
+        if (mDbg) Log.v(TAG, "updateController: mIWifiRttController=" + mIWifiRttController);
 
         // only care about isStarted (Wi-Fi started) not isReady - since if not
         // ready then Wi-Fi will also be down.
@@ -124,7 +125,11 @@
      * @return Success status: true for success, false for failure.
      */
     public boolean rangeRequest(int cmdId, RangingRequest request) {
-        if (VDBG) Log.v(TAG, "rangeRequest: cmdId=" + cmdId + ", request=" + request);
+        if (mDbg) {
+            Log.v(TAG,
+                    "rangeRequest: cmdId=" + cmdId + ", # of requests=" + request.mRttPeers.size());
+        }
+        if (VDBG) Log.v(TAG, "rangeRequest: request=" + request);
         synchronized (mLock) {
             if (!isReady()) {
                 Log.e(TAG, "rangeRequest: RttController is null");
@@ -161,7 +166,7 @@
      * @return Success status: true for success, false for failure.
      */
     public boolean rangeCancel(int cmdId, ArrayList<byte[]> macAddresses) {
-        if (VDBG) Log.v(TAG, "rangeCancel: cmdId=" + cmdId);
+        if (mDbg) Log.v(TAG, "rangeCancel: cmdId=" + cmdId);
         synchronized (mLock) {
             if (!isReady()) {
                 Log.e(TAG, "rangeCancel: RttController is null");
@@ -192,7 +197,7 @@
      */
     @Override
     public void onResults(int cmdId, ArrayList<RttResult> halResults) {
-        if (VDBG) Log.v(TAG, "onResults: cmdId=" + cmdId + ", # of results=" + halResults.size());
+        if (mDbg) Log.v(TAG, "onResults: cmdId=" + cmdId + ", # of results=" + halResults.size());
         List<RangingResult> results = new ArrayList<>(halResults.size());
 
         mRttService.onRangingResults(cmdId, halResults);
diff --git a/service/java/com/android/server/wifi/rtt/RttService.java b/service/java/com/android/server/wifi/rtt/RttService.java
index afffbee..fabab89 100644
--- a/service/java/com/android/server/wifi/rtt/RttService.java
+++ b/service/java/com/android/server/wifi/rtt/RttService.java
@@ -67,7 +67,7 @@
 
             RttNative rttNative = new RttNative(mImpl, halDeviceManager);
             mImpl.start(handlerThread.getLooper(), wifiInjector.getClock(), awareBinder, rttNative,
-                    wifiPermissionsUtil);
+                    wifiPermissionsUtil, wifiInjector.getFrameworkFacade());
         }
     }
 }
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 3417f74..a83383c 100644
--- a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
+++ b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.database.ContentObserver;
 import android.hardware.wifi.V1_0.RttResult;
 import android.hardware.wifi.V1_0.RttStatus;
 import android.net.MacAddress;
@@ -42,11 +43,13 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.WorkSource;
+import android.provider.Settings;
 import android.util.Log;
 import android.util.SparseIntArray;
 
 import com.android.internal.util.WakeupMessage;
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.FrameworkFacade;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 
 import java.io.FileDescriptor;
@@ -65,6 +68,7 @@
 public class RttServiceImpl extends IWifiRttManager.Stub {
     private static final String TAG = "RttServiceImpl";
     private static final boolean VDBG = false; // STOPSHIP if true
+    private boolean mDbg = false;
 
     private final Context mContext;
     private Clock mClock;
@@ -102,10 +106,11 @@
      * @param awareBinder The Wi-Fi Aware service (binder) if supported on the system.
      * @param rttNative The Native interface to the HAL.
      * @param wifiPermissionsUtil Utility for permission checks.
+     * @param frameworkFacade Facade for framework classes, allows mocking.
      */
     public void start(Looper looper, Clock clock, IWifiAwareManager awareBinder,
-            RttNative rttNative,
-            WifiPermissionsUtil wifiPermissionsUtil) {
+            RttNative rttNative, WifiPermissionsUtil wifiPermissionsUtil,
+            FrameworkFacade frameworkFacade) {
         mClock = clock;
         mAwareBinder = awareBinder;
         mRttNative = rttNative;
@@ -120,7 +125,7 @@
             @Override
             public void onReceive(Context context, Intent intent) {
                 String action = intent.getAction();
-                if (VDBG) Log.v(TAG, "BroadcastReceiver: action=" + action);
+                if (mDbg) Log.v(TAG, "BroadcastReceiver: action=" + action);
 
                 if (PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
                     if (mPowerManager.isDeviceIdleMode()) {
@@ -132,11 +137,35 @@
             }
         }, intentFilter);
 
+        frameworkFacade.registerContentObserver(mContext,
+                Settings.Global.getUriFor(Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED), true,
+                new ContentObserver(mRttServiceSynchronized.mHandler) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        enableVerboseLogging(frameworkFacade.getIntegerSetting(mContext,
+                                Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, 0));
+                    }
+                });
+        enableVerboseLogging(frameworkFacade.getIntegerSetting(mContext,
+                Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, 0));
+
         mRttServiceSynchronized.mHandler.post(() -> {
             rttNative.start();
         });
     }
 
+    private void enableVerboseLogging(int verbose) {
+        if (verbose > 0) {
+            mDbg = true;
+        } else {
+            mDbg = false;
+        }
+        if (VDBG) {
+            mDbg = true; // just override
+        }
+        mRttNative.mDbg = mDbg;
+    }
+
     /*
      * ASYNCHRONOUS DOMAIN - can be called from different threads!
      */
@@ -230,7 +259,7 @@
         IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
             @Override
             public void binderDied() {
-                if (VDBG) Log.v(TAG, "binderDied: uid=" + uid);
+                if (mDbg) Log.v(TAG, "binderDied: uid=" + uid);
                 binder.unlinkToDeath(this, 0);
 
                 mRttServiceSynchronized.mHandler.post(() -> {
@@ -508,7 +537,7 @@
                 }
             }
 
-            if (VDBG) {
+            if (mDbg) {
                 Log.v(TAG, "isRequestorSpamming: ws=" + ws + ", someone is spamming: " + counts);
             }
             return true;
@@ -805,7 +834,7 @@
             for (ResponderConfig peer : request.mRttPeers) {
                 RttResult resultForRequest = resultEntries.get(peer.macAddress);
                 if (resultForRequest == null) {
-                    if (VDBG) {
+                    if (mDbg) {
                         Log.v(TAG, "postProcessResults: missing=" + peer.macAddress);
                     }
                     if (peer.peerHandle == null) {
diff --git a/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
index 7e71069..d42b795 100644
--- a/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
@@ -25,11 +25,13 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -67,6 +69,7 @@
 import android.util.Pair;
 
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.FrameworkFacade;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 
 import org.junit.After;
@@ -133,6 +136,9 @@
     @Mock
     public IRttCallback mockCallback;
 
+    @Mock
+    FrameworkFacade mFrameworkFacade;
+
     /**
      * Using instead of spy to avoid native crash failures - possibly due to
      * spy's copying of state.
@@ -163,6 +169,8 @@
         mMockLooper = new TestLooper();
 
         mAlarmManager = new TestAlarmManager();
+        doNothing().when(mFrameworkFacade).registerContentObserver(eq(mockContext), any(),
+                anyBoolean(), any());
         when(mockContext.getSystemService(Context.ALARM_SERVICE))
                 .thenReturn(mAlarmManager.getAlarmManager());
         mInOrder = inOrder(mAlarmManager.getAlarmManager(), mockContext);
@@ -188,7 +196,7 @@
         doAnswer(mBinderUnlinkToDeathCounter).when(mockIbinder).unlinkToDeath(any(), anyInt());
 
         mDut.start(mMockLooper.getLooper(), mockClock, mockAwareManagerBinder, mockNative,
-                mockPermissionUtil);
+                mockPermissionUtil, mFrameworkFacade);
         mMockLooper.dispatchAll();
         ArgumentCaptor<BroadcastReceiver> bcastRxCaptor = ArgumentCaptor.forClass(
                 BroadcastReceiver.class);
