diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java
index 9a8b304..0b2c051 100644
--- a/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/src/com/android/server/connectivity/NetworkMonitor.java
@@ -24,6 +24,9 @@
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.ConnectivityManager.TYPE_WIFI;
 import static android.net.DnsResolver.FLAG_EMPTY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
 import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTP;
@@ -93,6 +96,7 @@
 import android.net.util.Stopwatch;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Message;
 import android.os.RemoteException;
@@ -286,6 +290,7 @@
 
     private final Context mContext;
     private final INetworkMonitorCallbacks mCallback;
+    private final int mCallbackVersion;
     private final Network mCleartextDnsNetwork;
     private final Network mNetwork;
     private final TelephonyManager mTelephonyManager;
@@ -355,6 +360,17 @@
     private boolean mAcceptPartialConnectivity = false;
     private final EvaluationState mEvaluationState = new EvaluationState();
 
+    private int getCallbackVersion(INetworkMonitorCallbacks cb) {
+        int version;
+        try {
+            version = cb.getInterfaceVersion();
+        } catch (RemoteException e) {
+            version = 0;
+        }
+        if (version == Build.VERSION_CODES.CUR_DEVELOPMENT) version = 0;
+        return version;
+    }
+
     public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
             SharedLog validationLog) {
         this(context, cb, network, new IpConnectivityLog(), validationLog,
@@ -376,6 +392,7 @@
         mMetricsLog = logger;
         mValidationLogs = validationLogs;
         mCallback = cb;
+        mCallbackVersion = getCallbackVersion(cb);
         mDependencies = deps;
         mDetectionStatsUtils = detectionStatsUtils;
         mNetwork = network;
@@ -2113,6 +2130,15 @@
         }
 
         protected int getNetworkTestResult() {
+            if (mCallbackVersion < 3) {
+                if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_VALID) != 0) {
+                    return NETWORK_TEST_RESULT_VALID;
+                }
+                if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_PARTIAL) != 0) {
+                    return NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+                }
+                return NETWORK_TEST_RESULT_INVALID;
+            }
             return mEvaluationResult | mProbeResults;
         }
     }
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
index 287d598..c0d9427 100644
--- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -286,7 +286,7 @@
     private FakeDns mFakeDns;
 
     @Before
-    public void setUp() throws IOException {
+    public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
         when(mDependencies.getPrivateDnsBypassNetwork(any())).thenReturn(mCleartextDnsNetwork);
         when(mDependencies.getDnsResolver()).thenReturn(mDnsResolver);
@@ -354,6 +354,8 @@
             return null;
         }).when(mContext).unregisterReceiver(any());
 
+        resetCallbacks();
+
         setMinDataStallEvaluateInterval(500);
         setDataStallEvaluationType(DATA_STALL_EVALUATION_TYPE_DNS);
         setValidDataStallDnsTimeThreshold(500);
@@ -381,6 +383,17 @@
                 0, mRegisteredReceivers.size());
     }
 
+    private void resetCallbacks() {
+        reset(mCallbacks);
+        // TODO: make this a parameterized test.
+        try {
+            when(mCallbacks.getInterfaceVersion()).thenReturn(3);
+        } catch (RemoteException e) {
+            // Can't happen as mCallbacks is a mock
+            fail("Error mocking getInterfaceVersion" + e);
+        }
+    }
+
     private class WrappedNetworkMonitor extends NetworkMonitor {
         private long mProbeTime = 0;
         private final ConditionVariable mQuitCv = new ConditionVariable(false);
@@ -727,7 +740,7 @@
         setStatus(mHttpsConnection, 204);
         setStatus(mHttpConnection, 204);
 
-        reset(mCallbacks);
+        resetCallbacks();
         nm.notifyCaptivePortalAppFinished(APP_RETURN_DISMISSED);
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
                 .notifyNetworkTested(eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP
@@ -765,7 +778,7 @@
                         eq(null));
 
         // Fix DNS and retry, expect validation to succeed.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setAnswer("dns.google", new String[]{"2001:db8::1"});
 
         wnm.forceReevaluation(Process.myUid());
@@ -774,7 +787,7 @@
                         eq(null));
 
         // Change configuration to an invalid DNS name, expect validation to fail.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setAnswer("dns.bad", new String[0]);
         wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.bad", new InetAddress[0]));
         // Strict mode hostname resolve fail. Expect only notification for evaluation fail. No probe
@@ -785,7 +798,7 @@
 
         // Change configuration back to working again, but make private DNS not work.
         // Expect validation to fail.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setNonBypassPrivateDnsWorking(false);
         wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.google",
                 new InetAddress[0]));
@@ -795,7 +808,7 @@
                         eq(null));
 
         // Make private DNS work again. Expect validation to succeed.
-        reset(mCallbacks);
+        resetCallbacks();
         mFakeDns.setNonBypassPrivateDnsWorking(true);
         wnm.forceReevaluation(Process.myUid());
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
@@ -863,7 +876,7 @@
         // Expect to send HTTP, HTTPS, FALLBACK probe and evaluation result notifications to CS.
         final NetworkMonitor nm = runNetworkTest(VALIDATION_RESULT_PARTIAL);
 
-        reset(mCallbacks);
+        resetCallbacks();
         nm.setAcceptPartialConnectivity();
         // Expect to update evaluation result notifications to CS.
         verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)).notifyNetworkTested(
@@ -877,7 +890,7 @@
         setStatus(mFallbackConnection, 500);
         runPartialConnectivityNetworkTest(VALIDATION_RESULT_PARTIAL);
 
-        reset(mCallbacks);
+        resetCallbacks();
         setStatus(mHttpsConnection, 500);
         setStatus(mHttpConnection, 500);
         setStatus(mFallbackConnection, 204);
@@ -930,7 +943,7 @@
         final NetworkMonitor nm = runValidatedNetworkTest();
         // Verify forceReevalution will not reset the validation result but only probe result until
         // getting the validation result.
-        reset(mCallbacks);
+        resetCallbacks();
         setSslException(mHttpsConnection);
         setStatus(mHttpConnection, 500);
         setStatus(mFallbackConnection, 204);
@@ -955,7 +968,7 @@
     public void testEvaluationState_reportProbeResult() throws Exception {
         final NetworkMonitor nm = runValidatedNetworkTest();
 
-        reset(mCallbacks);
+        resetCallbacks();
 
         nm.reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, CaptivePortalProbeResult.SUCCESS);
         // Verify result should be appended and notifyNetworkTested callback is triggered once.
