diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
index 8a24bc9..0f702b2 100644
--- a/src/com/android/settings/wifi/AccessPointPreference.java
+++ b/src/com/android/settings/wifi/AccessPointPreference.java
@@ -36,11 +36,14 @@
 
     private TextView mSummaryView;
     private boolean showSummary = true;
+    private boolean mForSavedNetworks = false;
     private AccessPoint mAccessPoint;
 
-    public AccessPointPreference(AccessPoint accessPoint, Context context) {
+    public AccessPointPreference(AccessPoint accessPoint, Context context,
+                                 boolean forSavedNetworks) {
         super(context);
         mAccessPoint = accessPoint;
+        mForSavedNetworks = forSavedNetworks;
         mAccessPoint.setTag(this);
         refresh();
     }
@@ -104,7 +107,10 @@
      * Updates the title and summary; may indirectly call notifyChanged().
      */
     public void refresh() {
-        setTitle(mAccessPoint.getSsid());
+        if (mForSavedNetworks)
+            setTitle(mAccessPoint.getConfigName());
+        else
+            setTitle(mAccessPoint.getSsid());
 
         final Context context = getContext();
         updateIcon(mAccessPoint.getLevel(), context);
@@ -112,7 +118,9 @@
         // Force new summary
         setSummary(null);
 
-        String summary = mAccessPoint.getSummary();
+        String summary = mForSavedNetworks ? mAccessPoint.getSavedNetworkSummary()
+                : mAccessPoint.getSettingsSummary();
+
         if (summary.length() > 0) {
             setSummary(summary);
             setShowSummary(true);
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index 04094b3..04d2107 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -96,7 +96,7 @@
         final Context context = getActivity();
 
         final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context, true,
-                false);
+                false, true);
 
         preferenceScreen.removeAll();
 
@@ -106,7 +106,7 @@
         final int accessPointsSize = accessPoints.size();
         for (int i = 0; i < accessPointsSize; ++i){
             AccessPointPreference preference = new AccessPointPreference(accessPoints.get(i),
-                    context);
+                    context, true);
             WifiConfiguration config = accessPoints.get(i).getConfig();
             if (config != null) {
                 int userId = UserHandle.getUserId(config.creatorUid);
@@ -222,7 +222,7 @@
 
                 // Add available Wi-Fi access points
                 final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context,
-                        true, false);
+                        true, false, true);
 
                 final int accessPointsSize = accessPoints.size();
                 for (int i = 0; i < accessPointsSize; ++i){
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index ee53887..8988495 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -250,8 +250,15 @@
                     mConfigUi.setSubmitButton(res.getString(R.string.wifi_connect));
                 } else {
                     if (state != null) {
-                        addRow(group, R.string.wifi_status, AccessPoint.getSummary(
-                                mConfigUi.getContext(), state, !mAccessPoint.isSaved()));
+                        WifiConfiguration config = mAccessPoint.getConfig();
+                        boolean isEphimeral = mAccessPoint.isSaved() == false;
+                        String providerFriendlyName = null;
+                        if (config != null && config.isPasspoint()) {
+                            providerFriendlyName = config.providerFriendlyName;
+                        }
+                        String summary = AccessPoint.getSummary(
+                                mConfigUi.getContext(), state, isEphimeral, providerFriendlyName);
+                        addRow(group, R.string.wifi_status, summary);
                     }
 
                     if (signalLevel != null) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 80a56bd..e5adaf0 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -156,7 +156,7 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
-        mWifiTracker = new WifiTracker(getActivity(), this, true, true);
+        mWifiTracker = new WifiTracker(getActivity(), this, true, true, false);
         mWifiManager = mWifiTracker.getManager();
 
         mConnectListener = new WifiManager.ActionListener() {
@@ -629,7 +629,7 @@
                     if (accessPoint.getLevel() != -1) {
                         hasAvailableAccessPoints = true;
                         AccessPointPreference preference = new AccessPointPreference(accessPoint,
-                                getActivity());
+                                getActivity(), false);
 
                         getPreferenceScreen().addPreference(preference);
                         accessPoint.setListener(this);
@@ -891,7 +891,7 @@
 
                 // Add saved Wi-Fi access points
                 final Collection<AccessPoint> accessPoints =
-                        WifiTracker.getCurrentAccessPoints(context, true, false);
+                        WifiTracker.getCurrentAccessPoints(context, true, false, false);
                 for (AccessPoint accessPoint : accessPoints) {
                     data = new SearchIndexableRaw(context);
                     data.title = accessPoint.getSsid();
diff --git a/src/com/android/settings/wifi/WifiStatusTest.java b/src/com/android/settings/wifi/WifiStatusTest.java
index 269058c..9789327 100644
--- a/src/com/android/settings/wifi/WifiStatusTest.java
+++ b/src/com/android/settings/wifi/WifiStatusTest.java
@@ -300,7 +300,7 @@
             WifiInfo info = mWifiManager.getConnectionInfo();
             String summary = AccessPoint.getSummary(this, info.getSSID(),
                     networkInfo.getDetailedState(),
-                    info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
+                    info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID, null);
             mNetworkState.setText(summary);
         }
     }
