diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index 1c44204..0c95a23 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -33,6 +33,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.State;
+import android.net.NetworkInfo.DetailedState;
 import android.net.Uri;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -93,26 +94,7 @@
         mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
 
         final boolean isWifiEnabled = isWifiEnabled();
-
-        final IconCompat icon = IconCompat.createWithResource(mContext,
-                R.drawable.ic_settings_wireless);
-        final String title = mContext.getString(R.string.wifi_settings);
-        final CharSequence summary = getSummary();
-        final PendingIntent toggleAction = getBroadcastIntent(mContext);
-        final PendingIntent primaryAction = getPrimaryAction();
-        final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
-                ListBuilder.ICON_IMAGE, title);
-        final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
-                null /* actionTitle */, isWifiEnabled);
-
-        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
-                .setAccentColor(COLOR_NOT_TINTED)
-                .addRow(new ListBuilder.RowBuilder()
-                        .setTitle(title)
-                        .setSubtitle(summary)
-                        .addEndItem(toggleSliceAction)
-                        .setPrimaryAction(primarySliceAction));
-
+        ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* accessPoint */);
         if (!isWifiEnabled) {
             return listBuilder.build();
         }
@@ -137,7 +119,12 @@
         final CharSequence placeholder = mContext.getText(R.string.summary_placeholder);
         for (int i = 0; i < DEFAULT_EXPANDED_ROW_COUNT; i++) {
             if (i < apCount) {
-                listBuilder.addRow(getAccessPointRow(results.get(i)));
+                final AccessPoint accessPoint = results.get(i);
+                if (accessPoint.isActive()) {
+                    // update summary
+                    listBuilder = getListBuilder(isWifiEnabled, accessPoint);
+                }
+                listBuilder.addRow(getAccessPointRow(accessPoint));
             } else if (needLoadingRow) {
                 listBuilder.addRow(getLoadingRow());
                 needLoadingRow = false;
@@ -149,6 +136,27 @@
         return listBuilder.build();
     }
 
+    private ListBuilder getListBuilder(boolean isWifiEnabled, AccessPoint accessPoint) {
+        final IconCompat icon = IconCompat.createWithResource(mContext,
+                R.drawable.ic_settings_wireless);
+        final String title = mContext.getString(R.string.wifi_settings);
+        final CharSequence summary = getSummary(accessPoint);
+        final PendingIntent toggleAction = getBroadcastIntent(mContext);
+        final PendingIntent primaryAction = getPrimaryAction();
+        final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
+                ListBuilder.ICON_IMAGE, title);
+        final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
+                null /* actionTitle */, isWifiEnabled);
+
+        return new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
+                .setAccentColor(COLOR_NOT_TINTED)
+                .addRow(new ListBuilder.RowBuilder()
+                        .setTitle(title)
+                        .setSubtitle(summary)
+                        .addEndItem(toggleSliceAction)
+                        .setPrimaryAction(primarySliceAction));
+    }
+
     private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) {
         final CharSequence title = getAccessPointName(accessPoint);
         final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint);
@@ -167,7 +175,7 @@
     }
 
     private CharSequence getAccessPointName(AccessPoint accessPoint) {
-        final CharSequence name = accessPoint.getConfigName();
+        final CharSequence name = accessPoint.getTitle();
         final Spannable span = new SpannableString(name);
         @ColorInt final int color = Utils.getColorAttrDefaultColor(mContext,
                 android.R.attr.textColorPrimary);
@@ -306,6 +314,32 @@
         }
     }
 
+    private CharSequence getSummary(AccessPoint accessPoint) {
+        if (accessPoint == null) {
+            return getSummary();
+        }
+
+        final NetworkInfo networkInfo = accessPoint.getNetworkInfo();
+        if (networkInfo == null) {
+            return getSummary();
+        }
+
+        final State state = networkInfo.getState();
+        DetailedState detailedState;
+        if (state == State.CONNECTING) {
+            detailedState = DetailedState.CONNECTING;
+        } else if (state == State.CONNECTED) {
+            detailedState = DetailedState.CONNECTED;
+        } else {
+            return getSummary();
+        }
+
+        final String[] formats = mContext.getResources().getStringArray(
+                R.array.wifi_status_with_ssid);
+        final int index = detailedState.ordinal();
+        return String.format(formats[index], accessPoint.getTitle());
+    }
+
     private PendingIntent getPrimaryAction() {
         final Intent intent = getIntent();
         return PendingIntent.getActivity(mContext, 0 /* requestCode */,
