diff --git a/api/current.txt b/api/current.txt
index c68c29c..a8dda67 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29786,6 +29786,7 @@
 
   public class ScanResult implements android.os.Parcelable {
     method public int describeContents();
+    method public int getWifiStandard();
     method public boolean is80211mcResponder();
     method public boolean isPasspointNetwork();
     method public void writeToParcel(android.os.Parcel, int);
@@ -29796,6 +29797,11 @@
     field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
     field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
     field public String SSID;
+    field public static final int WIFI_STANDARD_11AC = 5; // 0x5
+    field public static final int WIFI_STANDARD_11AX = 6; // 0x6
+    field public static final int WIFI_STANDARD_11N = 4; // 0x4
+    field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1
+    field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0
     field public String capabilities;
     field public int centerFreq0;
     field public int centerFreq1;
@@ -29997,11 +30003,6 @@
     field public static final String FREQUENCY_UNITS = "MHz";
     field public static final String LINK_SPEED_UNITS = "Mbps";
     field public static final int LINK_SPEED_UNKNOWN = -1; // 0xffffffff
-    field public static final int WIFI_STANDARD_11AC = 5; // 0x5
-    field public static final int WIFI_STANDARD_11AX = 6; // 0x6
-    field public static final int WIFI_STANDARD_11N = 4; // 0x4
-    field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1
-    field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0
   }
 
   public class WifiManager {
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index ac86778..aa895a6 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -16,11 +16,15 @@
 
 package android.net.wifi;
 
+import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.annotation.UnsupportedAppUsage;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -223,11 +227,86 @@
     */
     public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
 
-   /**
-    * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
-    * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
-    * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
-    */
+    /**
+     * Wi-Fi unknown standard
+     */
+    public static final int WIFI_STANDARD_UNKNOWN = 0;
+
+    /**
+     * Wi-Fi 802.11a/b/g
+     */
+    public static final int WIFI_STANDARD_LEGACY = 1;
+
+    /**
+     * Wi-Fi 802.11n
+     */
+    public static final int WIFI_STANDARD_11N = 4;
+
+    /**
+     * Wi-Fi 802.11ac
+     */
+    public static final int WIFI_STANDARD_11AC = 5;
+
+    /**
+     * Wi-Fi 802.11ax
+     */
+    public static final int WIFI_STANDARD_11AX = 6;
+
+    /** @hide */
+    @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
+            WIFI_STANDARD_UNKNOWN,
+            WIFI_STANDARD_LEGACY,
+            WIFI_STANDARD_11N,
+            WIFI_STANDARD_11AC,
+            WIFI_STANDARD_11AX
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface WifiStandard{}
+
+    /**
+     * AP wifi standard.
+     */
+    private @WifiStandard int mWifiStandard;
+
+    /**
+     * return the AP wifi standard.
+     */
+    public @WifiStandard int getWifiStandard() {
+        return mWifiStandard;
+    }
+
+    /**
+     * sets the AP wifi standard.
+     * @hide
+     */
+    public void setWifiStandard(@WifiStandard int standard) {
+        mWifiStandard = standard;
+    }
+
+    /**
+     * Convert Wi-Fi standard to string
+     */
+    private static @Nullable String wifiStandardToString(@WifiStandard int standard) {
+        switch(standard) {
+            case WIFI_STANDARD_LEGACY:
+                return "legacy";
+            case WIFI_STANDARD_11N:
+                return "11n";
+            case WIFI_STANDARD_11AC:
+                return "11ac";
+            case WIFI_STANDARD_11AX:
+                return "11ax";
+            case WIFI_STANDARD_UNKNOWN:
+                return "unknown";
+        }
+        return null;
+    }
+
+    /**
+     * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
+     * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
+     * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
+     */
     public int channelWidth;
 
     /**
@@ -549,6 +628,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -571,6 +651,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -600,6 +681,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -641,6 +723,7 @@
             carrierApEapType = source.carrierApEapType;
             carrierName = source.carrierName;
             radioChainInfos = source.radioChainInfos;
+            this.mWifiStandard = source.mWifiStandard;
         }
     }
 
@@ -679,6 +762,7 @@
         sb.append(", ChannelBandwidth: ").append(channelWidth);
         sb.append(", centerFreq0: ").append(centerFreq0);
         sb.append(", centerFreq1: ").append(centerFreq1);
+        sb.append(", standard: ").append(wifiStandardToString(mWifiStandard));
         sb.append(", 80211mcResponder: ");
         sb.append(((flags & FLAG_80211mc_RESPONDER) != 0) ? "is supported" : "is not supported");
         sb.append(", Carrier AP: ").append(isCarrierAp ? "yes" : "no");
@@ -714,6 +798,7 @@
         dest.writeInt(channelWidth);
         dest.writeInt(centerFreq0);
         dest.writeInt(centerFreq1);
+        dest.writeInt(mWifiStandard);
         dest.writeLong(seen);
         dest.writeInt(untrusted ? 1 : 0);
         dest.writeInt(numUsage);
@@ -796,6 +881,7 @@
                                                                fixed with flags below */
                 );
 
+                sr.mWifiStandard = in.readInt();
                 sr.seen = in.readLong();
                 sr.untrusted = in.readInt() != 0;
                 sr.numUsage = in.readInt();
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 9de39ed..86e5122 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -16,7 +16,6 @@
 
 package android.net.wifi;
 
-import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
@@ -28,8 +27,6 @@
 import android.os.Parcelable;
 import android.text.TextUtils;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -99,45 +96,9 @@
     private int mRssi;
 
     /**
-     * Wi-Fi unknown standard
-     */
-    public static final int WIFI_STANDARD_UNKNOWN = 0;
-
-    /**
-     * Wi-Fi 802.11a/b/g
-     */
-    public static final int WIFI_STANDARD_LEGACY = 1;
-
-    /**
-     * Wi-Fi 802.11n
-     */
-    public static final int WIFI_STANDARD_11N = 4;
-
-    /**
-     * Wi-Fi 802.11ac
-     */
-    public static final int WIFI_STANDARD_11AC = 5;
-
-    /**
-     * Wi-Fi 802.11ax
-     */
-    public static final int WIFI_STANDARD_11AX = 6;
-
-    /** @hide */
-    @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
-            WIFI_STANDARD_UNKNOWN,
-            WIFI_STANDARD_LEGACY,
-            WIFI_STANDARD_11N,
-            WIFI_STANDARD_11AC,
-            WIFI_STANDARD_11AX
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiStandard{}
-
-    /**
      * Wi-Fi standard for the connection
      */
-    private @WifiStandard int mWifiStandard;
+    private @ScanResult.WifiStandard int mWifiStandard;
 
     /**
      * The unit in which links speeds are expressed.
@@ -422,7 +383,7 @@
      * Sets the Wi-Fi standard
      * @hide
      */
-    public void setWifiStandard(@WifiStandard int wifiStandard) {
+    public void setWifiStandard(@ScanResult.WifiStandard int wifiStandard) {
         mWifiStandard = wifiStandard;
     }
 
@@ -430,7 +391,7 @@
      * Get connection Wi-Fi standard
      * @return the connection Wi-Fi standard
      */
-    public @WifiStandard int getWifiStandard() {
+    public @ScanResult.WifiStandard int getWifiStandard() {
         return mWifiStandard;
     }
 
diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java
index 4973c4c..b5c74d1 100644
--- a/wifi/tests/src/android/net/wifi/ScanResultTest.java
+++ b/wifi/tests/src/android/net/wifi/ScanResultTest.java
@@ -42,6 +42,8 @@
     public static final int TEST_LEVEL = -56;
     public static final int TEST_FREQUENCY = 2412;
     public static final long TEST_TSF = 04660l;
+    public static final @ScanResult.WifiStandard int TEST_WIFI_STANDARD =
+            ScanResult.WIFI_STANDARD_11AC;
 
     /**
      * Setup before tests.
@@ -149,12 +151,14 @@
     @Test
     public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception {
         ScanResult scanResult = createScanResult();
-        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
-                "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
-                "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
-                "80211mcResponder: is not supported, Carrier AP: no, " +
-                "Carrier AP EAP Type: 0, Carrier name: null, " +
-                "Radio Chain Infos: null", scanResult.toString());
+        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+                + "level: -56, frequency: 2412, timestamp: 2480, "
+                + "distance: 0(cm), distanceSd: 0(cm), "
+                + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+                + "standard: 11ac, "
+                + "80211mcResponder: is not supported, Carrier AP: no, "
+                + "Carrier AP EAP Type: 0, Carrier name: null, "
+                + "Radio Chain Infos: null", scanResult.toString());
     }
 
     /**
@@ -170,13 +174,15 @@
         scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
         scanResult.radioChainInfos[1].id = 1;
         scanResult.radioChainInfos[1].level = -54;
-        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
-                "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
-                "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
-                "80211mcResponder: is not supported, Carrier AP: no, " +
-                "Carrier AP EAP Type: 0, Carrier name: null, " +
-                "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, " +
-                "RadioChainInfo: id=1, level=-54]", scanResult.toString());
+        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+                + "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), "
+                + "distanceSd: 0(cm), "
+                + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+                + "standard: 11ac, "
+                + "80211mcResponder: is not supported, Carrier AP: no, "
+                + "Carrier AP EAP Type: 0, Carrier name: null, "
+                + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
+                + "RadioChainInfo: id=1, level=-54]", scanResult.toString());
     }
 
     /**
@@ -197,6 +203,7 @@
         result.level = TEST_LEVEL;
         result.frequency = TEST_FREQUENCY;
         result.timestamp = TEST_TSF;
+        result.setWifiStandard(TEST_WIFI_STANDARD);
         return result;
     }
 
@@ -207,6 +214,7 @@
         assertEquals(expected.level, actual.level);
         assertEquals(expected.frequency, actual.frequency);
         assertEquals(expected.timestamp, actual.timestamp);
+        assertEquals(expected.getWifiStandard(), actual.getWifiStandard());
         assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos);
         assertArrayEquals(expected.informationElements, actual.informationElements);
     }
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index b98cdc3..22a5faa 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -38,7 +38,7 @@
     private static final String TEST_PACKAGE_NAME = "com.test.example";
     private static final String TEST_FQDN = "test.com";
     private static final String TEST_PROVIDER_NAME = "test";
-    private static final int TEST_WIFI_STANDARD = WifiInfo.WIFI_STANDARD_11AC;
+    private static final int TEST_WIFI_STANDARD = ScanResult.WIFI_STANDARD_11AC;
 
     /**
      *  Verify parcel write/read with WifiInfo.
