diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index b804149..2d7be50 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -9999,6 +9999,7 @@
   public final class KnownNetworkConnectionStatus implements android.os.Parcelable {
     method public int describeContents();
     method @NonNull public android.os.Bundle getExtras();
+    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetwork getKnownNetwork();
     method public int getStatus();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int CONNECTION_STATUS_SAVED = 1; // 0x1
@@ -10011,6 +10012,7 @@
     ctor public KnownNetworkConnectionStatus.Builder();
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus build();
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setExtras(@NonNull android.os.Bundle);
+    method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setKnownNetwork(@NonNull android.net.wifi.sharedconnectivity.app.KnownNetwork);
     method @NonNull public android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.Builder setStatus(int);
   }
 
@@ -10079,6 +10081,7 @@
     method public int describeContents();
     method @NonNull public android.os.Bundle getExtras();
     method public int getStatus();
+    method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetwork getTetherNetwork();
     method public void writeToParcel(@NonNull android.os.Parcel, int);
     field public static final int CONNECTION_STATUS_CONNECT_TO_HOTSPOT_FAILED = 9; // 0x9
     field public static final int CONNECTION_STATUS_ENABLING_HOTSPOT = 1; // 0x1
@@ -10098,6 +10101,7 @@
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus build();
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setExtras(@NonNull android.os.Bundle);
     method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setStatus(int);
+    method @NonNull public android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.Builder setTetherNetwork(@NonNull android.net.wifi.sharedconnectivity.app.TetherNetwork);
   }
 
 }
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
index 9aad9aa..52abf33 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/DeviceInfo.java
@@ -270,12 +270,22 @@
         return 0;
     }
 
+    /**
+     * Creates a {@link DeviceInfo} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static DeviceInfo readFromParcel(@NonNull Parcel in) {
+        return new DeviceInfo(in.readInt(), in.readString(), in.readString(), in.readInt(),
+                in.readInt());
+    }
+
     @NonNull
     public static final Creator<DeviceInfo> CREATOR = new Creator<DeviceInfo>() {
         @Override
         public DeviceInfo createFromParcel(Parcel in) {
-            return new DeviceInfo(in.readInt(), in.readString(), in.readString(), in.readInt(),
-                    in.readInt());
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
index b219e86..161c83c 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetwork.java
@@ -228,15 +228,25 @@
         dest.writeInt(mNetworkSource);
         dest.writeString(mSsid);
         dest.writeIntArray(mSecurityTypes);
-        dest.writeTypedObject(mDeviceInfo, 0);
+        mDeviceInfo.writeToParcel(dest, flags);
+    }
+
+    /**
+     * Creates a {@link KnownNetwork} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static KnownNetwork readFromParcel(@NonNull Parcel in) {
+        return new KnownNetwork(in.readInt(), in.readString(), in.createIntArray(),
+                DeviceInfo.readFromParcel(in));
     }
 
     @NonNull
     public static final Creator<KnownNetwork> CREATOR = new Creator<>() {
         @Override
         public KnownNetwork createFromParcel(Parcel in) {
-            return new KnownNetwork(in.readInt(), in.readString(), in.createIntArray(),
-                    in.readTypedObject(DeviceInfo.CREATOR));
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
index 2cefb8e..b2f04ff 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatus.java
@@ -63,6 +63,7 @@
     public @interface ConnectionStatus {}
 
     @ConnectionStatus private final int mStatus;
+    private final KnownNetwork mKnownNetwork;
     private final Bundle mExtras;
 
     /**
@@ -70,6 +71,7 @@
      */
     public static final class Builder {
         @ConnectionStatus private int mStatus;
+        private KnownNetwork mKnownNetwork;
         private Bundle mExtras;
 
         public Builder() {}
@@ -86,6 +88,17 @@
         }
 
         /**
+         * Sets the {@link KnownNetwork} object of the connection.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setKnownNetwork(@NonNull KnownNetwork knownNetwork) {
+            mKnownNetwork = knownNetwork;
+            return this;
+        }
+
+        /**
          * Sets the extras bundle
          *
          * @return Returns the Builder object.
@@ -103,12 +116,14 @@
          */
         @NonNull
         public KnownNetworkConnectionStatus build() {
-            return new KnownNetworkConnectionStatus(mStatus, mExtras);
+            return new KnownNetworkConnectionStatus(mStatus, mKnownNetwork, mExtras);
         }
     }
 
-    private KnownNetworkConnectionStatus(@ConnectionStatus int status, Bundle extras) {
+    private KnownNetworkConnectionStatus(@ConnectionStatus int status, KnownNetwork knownNetwork,
+            Bundle extras) {
         mStatus = status;
+        mKnownNetwork = knownNetwork;
         mExtras = extras;
     }
 
@@ -123,6 +138,16 @@
     }
 
     /**
+     * Gets the {@link KnownNetwork} object of the connection.
+     *
+     * @return Returns a KnownNetwork object.
+     */
+    @NonNull
+    public KnownNetwork getKnownNetwork() {
+        return mKnownNetwork;
+    }
+
+    /**
      * Gets the extras Bundle.
      *
      * @return Returns a Bundle object.
@@ -136,12 +161,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof KnownNetworkConnectionStatus)) return false;
         KnownNetworkConnectionStatus other = (KnownNetworkConnectionStatus) obj;
-        return mStatus == other.getStatus();
+        return mStatus == other.getStatus()
+                && Objects.equals(mKnownNetwork, other.getKnownNetwork());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mStatus);
+        return Objects.hash(mStatus, mKnownNetwork);
     }
 
     @Override
@@ -152,15 +178,27 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeInt(mStatus);
+        mKnownNetwork.writeToParcel(dest, flags);
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link KnownNetworkConnectionStatus} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static KnownNetworkConnectionStatus readFromParcel(@NonNull Parcel in) {
+        return new KnownNetworkConnectionStatus(in.readInt(),
+                KnownNetwork.readFromParcel(in),
+                in.readBundle());
+    }
+
     @NonNull
     public static final Creator<KnownNetworkConnectionStatus> CREATOR = new Creator<>() {
                 @Override
                 public KnownNetworkConnectionStatus createFromParcel(Parcel in) {
-                    return new KnownNetworkConnectionStatus(in.readInt(),
-                            in.readBundle(getClass().getClassLoader()));
+                    return readFromParcel(in);
                 }
 
                 @Override
@@ -173,6 +211,7 @@
     public String toString() {
         return new StringBuilder("KnownNetworkConnectionStatus[")
                 .append("status=").append(mStatus)
+                .append("known network=").append(mKnownNetwork.toString())
                 .append("extras=").append(mExtras.toString())
                 .append("]").toString();
     }
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
index 87f5efd..4809bef 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/SharedConnectivitySettingsState.java
@@ -128,12 +128,22 @@
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link SharedConnectivitySettingsState} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static SharedConnectivitySettingsState readFromParcel(@NonNull Parcel in) {
+        return new SharedConnectivitySettingsState(in.readBoolean(),
+                in.readBundle());
+    }
+
     @NonNull
     public static final Creator<SharedConnectivitySettingsState> CREATOR = new Creator<>() {
                 @Override
                 public SharedConnectivitySettingsState createFromParcel(Parcel in) {
-                    return new SharedConnectivitySettingsState(in.readBoolean(),
-                            in.readBundle(getClass().getClassLoader()));
+                    return readFromParcel(in);
                 }
 
                 @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
index 3eff724..af4fd4a 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetwork.java
@@ -328,7 +328,7 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeLong(mDeviceId);
-        dest.writeTypedObject(mDeviceInfo, 0);
+        mDeviceInfo.writeToParcel(dest, flags);
         dest.writeInt(mNetworkType);
         dest.writeString(mNetworkName);
         dest.writeString(mHotspotSsid);
@@ -336,14 +336,23 @@
         dest.writeIntArray(mHotspotSecurityTypes);
     }
 
+    /**
+     * Creates a {@link TetherNetwork} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static TetherNetwork readFromParcel(@NonNull Parcel in) {
+        return new TetherNetwork(in.readLong(), DeviceInfo.readFromParcel(in),
+                in.readInt(), in.readString(), in.readString(), in.readString(),
+                in.createIntArray());
+    }
+
     @NonNull
     public static final Creator<TetherNetwork> CREATOR = new Creator<>() {
         @Override
         public TetherNetwork createFromParcel(Parcel in) {
-            return new TetherNetwork(in.readLong(), in.readTypedObject(
-                    android.net.wifi.sharedconnectivity.app.DeviceInfo.CREATOR),
-                    in.readInt(), in.readString(), in.readString(), in.readString(),
-                    in.createIntArray());
+            return readFromParcel(in);
         }
 
         @Override
diff --git a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
index 86202bb..3cf44ed 100644
--- a/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
+++ b/wifi/java/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatus.java
@@ -105,6 +105,7 @@
     public @interface ConnectionStatus {}
 
     @ConnectionStatus private final int mStatus;
+    private final TetherNetwork mTetherNetwork;
     private final Bundle mExtras;
 
     /**
@@ -112,6 +113,7 @@
      */
     public static final class Builder {
         @ConnectionStatus private int mStatus;
+        private TetherNetwork mTetherNetwork;
         private Bundle mExtras;
 
         public Builder() {}
@@ -128,6 +130,17 @@
         }
 
         /**
+         * Sets the {@link TetherNetwork} object of the connection.
+         *
+         * @return Returns the Builder object.
+         */
+        @NonNull
+        public Builder setTetherNetwork(@NonNull TetherNetwork tetherNetwork) {
+            mTetherNetwork = tetherNetwork;
+            return this;
+        }
+
+        /**
          * Sets the extras bundle
          *
          * @return Returns the Builder object.
@@ -145,12 +158,14 @@
          */
         @NonNull
         public TetherNetworkConnectionStatus build() {
-            return new TetherNetworkConnectionStatus(mStatus, mExtras);
+            return new TetherNetworkConnectionStatus(mStatus, mTetherNetwork, mExtras);
         }
     }
 
-    private TetherNetworkConnectionStatus(@ConnectionStatus int status, Bundle extras) {
+    private TetherNetworkConnectionStatus(@ConnectionStatus int status, TetherNetwork tetherNetwork,
+            Bundle extras) {
         mStatus = status;
+        mTetherNetwork = tetherNetwork;
         mExtras = extras;
     }
 
@@ -165,6 +180,16 @@
     }
 
     /**
+     * Gets the {@link TetherNetwork} object of the connection.
+     *
+     * @return Returns a TetherNetwork object.
+     */
+    @NonNull
+    public TetherNetwork getTetherNetwork() {
+        return mTetherNetwork;
+    }
+
+    /**
      * Gets the extras Bundle.
      *
      * @return Returns a Bundle object.
@@ -178,12 +203,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof TetherNetworkConnectionStatus)) return false;
         TetherNetworkConnectionStatus other = (TetherNetworkConnectionStatus) obj;
-        return mStatus == other.getStatus();
+        return mStatus == other.getStatus()
+                && Objects.equals(mTetherNetwork, other.getTetherNetwork());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(mStatus);
+        return Objects.hash(mStatus, mTetherNetwork);
     }
 
     @Override
@@ -194,27 +220,39 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeInt(mStatus);
+        mTetherNetwork.writeToParcel(dest, flags);
         dest.writeBundle(mExtras);
     }
 
+    /**
+     * Creates a {@link TetherNetworkConnectionStatus} object from a parcel.
+     *
+     * @hide
+     */
+    @NonNull
+    public static TetherNetworkConnectionStatus readFromParcel(@NonNull Parcel in) {
+        return new TetherNetworkConnectionStatus(in.readInt(),
+                TetherNetwork.readFromParcel(in), in.readBundle());
+    }
+
     @NonNull
     public static final Creator<TetherNetworkConnectionStatus> CREATOR = new Creator<>() {
-                @Override
-                public TetherNetworkConnectionStatus createFromParcel(Parcel in) {
-                    return new TetherNetworkConnectionStatus(in.readInt(),
-                            in.readBundle(getClass().getClassLoader()));
-                }
+        @Override
+        public TetherNetworkConnectionStatus createFromParcel(Parcel in) {
+            return readFromParcel(in);
+        }
 
-                @Override
-                public TetherNetworkConnectionStatus[] newArray(int size) {
-                    return new TetherNetworkConnectionStatus[size];
-                }
-            };
+        @Override
+        public TetherNetworkConnectionStatus[] newArray(int size) {
+            return new TetherNetworkConnectionStatus[size];
+        }
+    };
 
     @Override
     public String toString() {
         return new StringBuilder("TetherNetworkConnectionStatus[")
                 .append("status=").append(mStatus)
+                .append("tether network=").append(mTetherNetwork.toString())
                 .append("extras=").append(mExtras.toString())
                 .append("]").toString();
     }
diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java
new file mode 100644
index 0000000..37dca8d
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/KnownNetworkConnectionStatusTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2023 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 android.net.wifi.sharedconnectivity.app;
+
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP;
+import static android.net.wifi.sharedconnectivity.app.DeviceInfo.DEVICE_TYPE_TABLET;
+import static android.net.wifi.sharedconnectivity.app.KnownNetwork.NETWORK_SOURCE_NEARBY_SELF;
+import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVED;
+import static android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus.CONNECTION_STATUS_SAVE_FAILED;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Bundle;
+import android.os.Parcel;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link android.net.wifi.sharedconnectivity.app.KnownNetworkConnectionStatus}.
+ */
+@SmallTest
+public class KnownNetworkConnectionStatusTest {
+    private static final int NETWORK_SOURCE = NETWORK_SOURCE_NEARBY_SELF;
+    private static final String SSID = "TEST_SSID";
+    private static final int[] SECURITY_TYPES = {SECURITY_TYPE_WEP};
+    private static final DeviceInfo DEVICE_INFO = new DeviceInfo.Builder()
+            .setDeviceType(DEVICE_TYPE_TABLET).setDeviceName("TEST_NAME").setModelName("TEST_MODEL")
+            .setConnectionStrength(2).setBatteryPercentage(50).build();
+    private static final String SSID_1 = "TEST_SSID1";
+    private static final String BUNDLE_KEY = "INT-KEY";
+
+    /**
+     * Verifies parcel serialization/deserialization.
+     */
+    @Test
+    public void testParcelOperation() {
+        KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+
+        Parcel parcelW = Parcel.obtain();
+        status.writeToParcel(parcelW, 0);
+        byte[] bytes = parcelW.marshall();
+        parcelW.recycle();
+
+        Parcel parcelR = Parcel.obtain();
+        parcelR.unmarshall(bytes, 0, bytes.length);
+        parcelR.setDataPosition(0);
+        KnownNetworkConnectionStatus fromParcel =
+                KnownNetworkConnectionStatus.CREATOR.createFromParcel(parcelR);
+
+        assertEquals(status, fromParcel);
+        assertEquals(status.hashCode(), fromParcel.hashCode());
+    }
+
+    /**
+     * Verifies the Equals operation
+     */
+    @Test
+    public void testEqualsOperation() {
+        KnownNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build();
+        KnownNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build();
+        assertEquals(status2, status2);
+
+        KnownNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder()
+                .setStatus(CONNECTION_STATUS_SAVE_FAILED);
+        assertNotEquals(status1, builder.build());
+
+        builder = buildConnectionStatusBuilder()
+                .setKnownNetwork(buildKnownNetworkBuilder().setSsid(SSID_1).build());
+        assertNotEquals(status1, builder.build());
+    }
+
+    /**
+     * Verifies the get methods return the expected data.
+     */
+    @Test
+    public void testGetMethods() {
+        KnownNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+        assertEquals(status.getStatus(), CONNECTION_STATUS_SAVED);
+        assertEquals(status.getKnownNetwork(), buildKnownNetworkBuilder().build());
+        assertEquals(status.getExtras().getInt(BUNDLE_KEY), buildBundle().getInt(BUNDLE_KEY));
+    }
+
+    private KnownNetworkConnectionStatus.Builder buildConnectionStatusBuilder() {
+        return new KnownNetworkConnectionStatus.Builder()
+                .setStatus(CONNECTION_STATUS_SAVED)
+                .setKnownNetwork(buildKnownNetworkBuilder().build())
+                .setExtras(buildBundle());
+    }
+
+    private Bundle buildBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putInt(BUNDLE_KEY, 1);
+        return bundle;
+    }
+
+    private KnownNetwork.Builder buildKnownNetworkBuilder() {
+        return new KnownNetwork.Builder().setNetworkSource(NETWORK_SOURCE).setSsid(SSID)
+                .setSecurityTypes(SECURITY_TYPES).setDeviceInfo(DEVICE_INFO);
+    }
+
+}
diff --git a/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java
new file mode 100644
index 0000000..1d9c2e6
--- /dev/null
+++ b/wifi/tests/src/android/net/wifi/sharedconnectivity/app/TetherNetworkConnectionStatusTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2023 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 android.net.wifi.sharedconnectivity.app;
+
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_EAP;
+import static android.net.wifi.WifiInfo.SECURITY_TYPE_WEP;
+import static android.net.wifi.sharedconnectivity.app.DeviceInfo.DEVICE_TYPE_TABLET;
+import static android.net.wifi.sharedconnectivity.app.TetherNetwork.NETWORK_TYPE_CELLULAR;
+import static android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.CONNECTION_STATUS_ENABLING_HOTSPOT;
+import static android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus.CONNECTION_STATUS_TETHERING_TIMEOUT;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.os.Bundle;
+import android.os.Parcel;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for {@link android.net.wifi.sharedconnectivity.app.TetherNetworkConnectionStatus}.
+ */
+@SmallTest
+public class TetherNetworkConnectionStatusTest {
+    private static final long DEVICE_ID = 11L;
+    private static final DeviceInfo DEVICE_INFO = new DeviceInfo.Builder()
+            .setDeviceType(DEVICE_TYPE_TABLET).setDeviceName("TEST_NAME").setModelName("TEST_MODEL")
+            .setConnectionStrength(2).setBatteryPercentage(50).build();
+    private static final int NETWORK_TYPE = NETWORK_TYPE_CELLULAR;
+    private static final String NETWORK_NAME = "TEST_NETWORK";
+    private static final String HOTSPOT_SSID = "TEST_SSID";
+    private static final String HOTSPOT_BSSID = "TEST _BSSID";
+    private static final int[] HOTSPOT_SECURITY_TYPES = {SECURITY_TYPE_WEP, SECURITY_TYPE_EAP};
+    private static final long DEVICE_ID_1 = 111L;
+    private static final String BUNDLE_KEY = "INT-KEY";
+
+    /**
+     * Verifies parcel serialization/deserialization.
+     */
+    @Test
+    public void testParcelOperation() {
+        TetherNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+
+        Parcel parcelW = Parcel.obtain();
+        status.writeToParcel(parcelW, 0);
+        byte[] bytes = parcelW.marshall();
+        parcelW.recycle();
+
+        Parcel parcelR = Parcel.obtain();
+        parcelR.unmarshall(bytes, 0, bytes.length);
+        parcelR.setDataPosition(0);
+        TetherNetworkConnectionStatus fromParcel =
+                TetherNetworkConnectionStatus.CREATOR.createFromParcel(parcelR);
+
+        assertEquals(status, fromParcel);
+        assertEquals(status.hashCode(), fromParcel.hashCode());
+    }
+
+    /**
+     * Verifies the Equals operation
+     */
+    @Test
+    public void testEqualsOperation() {
+        TetherNetworkConnectionStatus status1 = buildConnectionStatusBuilder().build();
+        TetherNetworkConnectionStatus status2 = buildConnectionStatusBuilder().build();
+        assertEquals(status2, status2);
+
+        TetherNetworkConnectionStatus.Builder builder = buildConnectionStatusBuilder()
+                .setStatus(CONNECTION_STATUS_TETHERING_TIMEOUT);
+        assertNotEquals(status1, builder.build());
+
+        builder = buildConnectionStatusBuilder()
+                .setTetherNetwork(buildTetherNetworkBuilder().setDeviceId(DEVICE_ID_1).build());
+        assertNotEquals(status1, builder.build());
+    }
+
+    /**
+     * Verifies the get methods return the expected data.
+     */
+    @Test
+    public void testGetMethods() {
+        TetherNetworkConnectionStatus status = buildConnectionStatusBuilder().build();
+        assertEquals(status.getStatus(), CONNECTION_STATUS_ENABLING_HOTSPOT);
+        assertEquals(status.getTetherNetwork(), buildTetherNetworkBuilder().build());
+        assertEquals(status.getExtras().getInt(BUNDLE_KEY), buildBundle().getInt(BUNDLE_KEY));
+    }
+
+    private TetherNetworkConnectionStatus.Builder buildConnectionStatusBuilder() {
+
+        return new TetherNetworkConnectionStatus.Builder()
+                .setStatus(CONNECTION_STATUS_ENABLING_HOTSPOT)
+                .setTetherNetwork(buildTetherNetworkBuilder().build())
+                .setExtras(buildBundle());
+    }
+
+    private Bundle buildBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putInt(BUNDLE_KEY, 1);
+        return bundle;
+    }
+
+    private TetherNetwork.Builder buildTetherNetworkBuilder() {
+        return new TetherNetwork.Builder()
+                .setDeviceId(DEVICE_ID)
+                .setDeviceInfo(DEVICE_INFO)
+                .setNetworkType(NETWORK_TYPE)
+                .setNetworkName(NETWORK_NAME)
+                .setHotspotSsid(HOTSPOT_SSID)
+                .setHotspotBssid(HOTSPOT_BSSID)
+                .setHotspotSecurityTypes(HOTSPOT_SECURITY_TYPES);
+    }
+}
