diff --git a/wifi/api/current.txt b/wifi/api/current.txt
index 1ece79a374592a595322509bd012ed5816612f07..c6be9bf1af7fc03c8bb965ea1d70ba7e9ff809c7 100644
--- a/wifi/api/current.txt
+++ b/wifi/api/current.txt
@@ -270,7 +270,7 @@ package android.net.wifi {
     field public static final int SIM = 5; // 0x5
   }
 
-  public class WifiInfo implements android.os.Parcelable {
+  public class WifiInfo implements android.os.Parcelable android.net.TransportInfo {
     method public int describeContents();
     method public String getBSSID();
     method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState);
@@ -322,7 +322,7 @@ package android.net.wifi {
     method @Deprecated public boolean disconnect();
     method @Deprecated public boolean enableNetwork(int, boolean);
     method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
-    method public android.net.wifi.WifiInfo getConnectionInfo();
+    method @Deprecated public android.net.wifi.WifiInfo getConnectionInfo();
     method public android.net.DhcpInfo getDhcpInfo();
     method public int getMaxNumberOfNetworkSuggestionsPerApp();
     method @IntRange(from=0) public int getMaxSignalLevel();
diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt
index 257f9d53e59f143529415280ff11b9e49554685b..b7a1e4a84d92a779a37ce34aaa25f305e92b49dc 100644
--- a/wifi/api/system-current.txt
+++ b/wifi/api/system-current.txt
@@ -441,7 +441,7 @@ package android.net.wifi {
     method public static void registerServiceWrappers();
   }
 
-  public class WifiInfo implements android.os.Parcelable {
+  public class WifiInfo implements android.os.Parcelable android.net.TransportInfo {
     method public double getLostTxPacketsPerSecond();
     method @Nullable public String getRequestingPackageName();
     method public double getRetriedTxPacketsPerSecond();
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 6bd1ce54dc5b1d661a53ec0dbe03193badfa4b59..39a5a7d93b5bcaae63b978b8b4632077ddabcbf8 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.net.NetworkInfo.DetailedState;
+import android.net.TransportInfo;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -40,8 +41,17 @@ import java.util.Locale;
 /**
  * Describes the state of any Wi-Fi connection that is active or
  * is in the process of being set up.
+ *
+ * In the connected state, access to location sensitive fields requires
+ * the same permissions as {@link WifiManager#getScanResults}. If such access is not allowed,
+ * {@link #getSSID} will return {@link WifiManager#UNKNOWN_SSID} and
+ * {@link #getBSSID} will return {@code "02:00:00:00:00:00"}.
+ * {@link #getNetworkId()} will return {@code -1}.
+ * {@link #getPasspointFqdn()} will return null.
+ * {@link #getPasspointProviderFriendlyName()} will return null.
  */
-public class WifiInfo implements Parcelable {
+public class WifiInfo implements TransportInfo, Parcelable {
+    // TODO(b/162602799): Implement equals/hahscode methods.
     private static final String TAG = "WifiInfo";
     /**
      * This is the map described in the Javadoc comment above. The positions
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 6496cc7a3ba316b11e0fc9354dd06b7bf2d391da..c25e18623900e59fba89f1245c1351506e74c482 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -35,9 +35,11 @@ import android.app.ActivityManager;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
 import android.net.DhcpInfo;
 import android.net.MacAddress;
 import android.net.Network;
+import android.net.NetworkCapabilities;
 import android.net.NetworkStack;
 import android.net.wifi.hotspot2.IProvisioningCallback;
 import android.net.wifi.hotspot2.OsuProvider;
@@ -2858,15 +2860,53 @@ public class WifiManager {
     /**
      * Return dynamic information about the current Wi-Fi connection, if any is active.
      * <p>
-     * In the connected state, access to the SSID and BSSID requires
-     * the same permissions as {@link #getScanResults}. If such access is not allowed,
-     * {@link WifiInfo#getSSID} will return {@link #UNKNOWN_SSID} and
-     * {@link WifiInfo#getBSSID} will return {@code "02:00:00:00:00:00"}.
-     * {@link WifiInfo#getPasspointFqdn()} will return null.
-     * {@link WifiInfo#getPasspointProviderFriendlyName()} will return null.
      *
      * @return the Wi-Fi information, contained in {@link WifiInfo}.
+     *
+     * @deprecated Starting with {@link Build.VERSION_CODES#S}, WifiInfo retrieval is moved to
+     * {@link ConnectivityManager} API surface. WifiInfo is attached in
+     * {@link NetworkCapabilities#getTransportInfo()} which is available via callback in
+     * {@link NetworkCallback#onCapabilitiesChanged(Network, NetworkCapabilities)} or on-demand from
+     * {@link ConnectivityManager#getNetworkCapabilities(Network)}.
+     *
+     *</p>
+     * Usage example:
+     * <pre>{@code
+     * final NetworkRequest request =
+     *      new NetworkRequest.Builder()
+     *      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+     *      .build();
+     * final ConnectivityManager connectivityManager =
+     *      context.getSystemService(ConnectivityManager.class);
+     * final NetworkCallback networkCallback = new NetworkCallback() {
+     *      ...
+     *      {@literal @}Override
+     *      void onAvailable(Network network) {}
+     *
+     *      {@literal @}Override
+     *      void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
+     *          WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
+     *      }
+     *      // etc.
+     * };
+     * connectivityManager.requestNetwork(request, networkCallback); // For request
+     * connectivityManager.registerNetworkCallback(request, networkCallback); // For listen
+     * }</pre>
+     * <p>
+     * <b>Compatibility Note:</b>
+     * <li>Apps can continue using this API, however newer features
+     * such as ability to mask out location sensitive data in WifiInfo will not be supported
+     * via this API. </li>
+     * <li>On devices supporting concurrent connections (indicated via
+     * {@link #isMultiStaConcurrencySupported()}), this API will return the details
+     * of the internet providing connection (if any) to all apps, except for the apps that triggered
+     * the creation of the concurrent connection. For such apps, this API will return the details of
+     * the connection they created. For ex: apps using {@link WifiNetworkSpecifier} will
+     * will trigger a concurrent connection on supported devices and hence this API will provide
+     * details of their peer to peer connection (not the internet providing connection). </li>
+     * </p>
      */
+    @Deprecated
     public WifiInfo getConnectionInfo() {
         try {
             return mService.getConnectionInfo(mContext.getOpPackageName(),