diff --git a/res/values/strings.xml b/res/values/strings.xml
index 060ff54..0a6c309 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3151,6 +3151,8 @@
 
     <!-- Setting Checkbox title whether to show options for wireless display certification -->
     <string name="wifi_display_certification">Wireless display certification</string>
+    <!-- Setting Checkbox title whether to show options for WiFi Verbose Logging -->
+    <string name="wifi_verbose_logging">Enable WiFi Verbose Logging</string>
     <!-- setting Checkbox summary whether to show options for wireless display certification  -->
     <string name="wifi_display_certification_summary">Show options for wireless display certification</string>
     <!-- Setting Checkbox title whether to allow mock locations -->
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index ef929b2..1d7d967 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -105,6 +105,11 @@
             android:key="wifi_display_certification"
             android:title="@string/wifi_display_certification"
             android:summary="@string/wifi_display_certification_summary"/>
+
+        <CheckBoxPreference
+            android:key="wifi_verbose_logging"
+            android:title="@string/wifi_verbose_logging" />
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="debug_input_category"
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index cc7a116..1cd08f3 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -34,6 +34,7 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ResolveInfo;
 import android.hardware.usb.IUsbManager;
+import android.net.wifi.WifiManager;
 import android.os.AsyncTask;
 import android.os.BatteryManager;
 import android.os.Build;
@@ -138,6 +139,7 @@
     private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category";
     private static final String DEBUG_APPLICATIONS_CATEGORY_KEY = "debug_applications_category";
     private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification";
+    private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging";
 
     private static final String OPENGL_TRACES_KEY = "enable_opengl_traces";
 
@@ -163,6 +165,7 @@
     private IBackupManager mBackupManager;
     private DevicePolicyManager mDpm;
     private UserManager mUm;
+    private WifiManager mWifiManager;
 
     private SwitchBar mSwitchBar;
     private Switch mEnabledSwitch;
@@ -185,6 +188,7 @@
     private CheckBoxPreference mWaitForDebugger;
     private CheckBoxPreference mVerifyAppsOverUsb;
     private CheckBoxPreference mWifiDisplayCertification;
+    private CheckBoxPreference mWifiVerboseLogging;
 
     private CheckBoxPreference mStrictMode;
     private CheckBoxPreference mPointerLocation;
@@ -244,6 +248,8 @@
         mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
 
+        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+
         if (android.os.Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER
                 || mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
             mUnavailable = true;
@@ -313,6 +319,7 @@
         mForceRtlLayout = findAndInitCheckboxPref(FORCE_RTL_LAYOUT_KEY);
         mDebugHwOverdraw = addListPreference(DEBUG_HW_OVERDRAW_KEY);
         mWifiDisplayCertification = findAndInitCheckboxPref(WIFI_DISPLAY_CERTIFICATION_KEY);
+        mWifiVerboseLogging = findAndInitCheckboxPref(WIFI_VERBOSE_LOGGING_KEY);
         mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
         mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
         mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY);
@@ -517,6 +524,7 @@
         updateBugreportOptions();
         updateForceRtlOptions();
         updateWifiDisplayCertificationOptions();
+        updateWifiVerboseLoggingOptions();
         updateSimulateColorSpace();
         updateUseNuplayerOptions();
     }
@@ -1023,6 +1031,15 @@
                 mWifiDisplayCertification.isChecked() ? 1 : 0);
     }
 
+    private void updateWifiVerboseLoggingOptions() {
+        boolean enabled = mWifiManager.getVerboseLoggingLevel() > 0;
+        updateCheckBox(mWifiVerboseLogging, enabled);
+    }
+
+    private void writeWifiVerboseLoggingOptions() {
+        mWifiManager.enableVerboseLogging(mWifiVerboseLogging.isChecked() ? 1 : 0);
+    }
+
     private void updateLowPowerModeOptions() {
         updateCheckBox(mLowPowerMode, Settings.Global.getInt(getActivity().getContentResolver(),
                 Settings.Global.LOW_POWER_MODE, 0) != 0);
@@ -1339,6 +1356,8 @@
             writeForceRtlOptions();
         } else if (preference == mWifiDisplayCertification) {
             writeWifiDisplayCertificationOptions();
+        } else if (preference == mWifiVerboseLogging) {
+            writeWifiVerboseLoggingOptions();
         } else if (preference == mUseNuplayer) {
             writeUseNuplayerOptions();
         } else {
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index 81706c9..688fc63 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -69,6 +69,8 @@
     /* package */ScanResult mScanResult;
 
     private int mRssi = Integer.MAX_VALUE;
+    private long mSeen = 0;
+
     private WifiInfo mInfo;
     private DetailedState mState;
 
@@ -262,6 +264,9 @@
     }
 
     boolean update(ScanResult result) {
+        if (result.seen > mSeen) {
+            mSeen = result.seen;
+        }
         if (ssid.equals(result.SSID) && security == getSecurity(result)) {
             if (WifiManager.compareSignalLevel(result.level, mRssi) > 0) {
                 int oldLevel = getLevel();
@@ -333,29 +338,57 @@
         return "\"" + string + "\"";
     }
 
+    /** visibility status of the WifiConfiguration
+     * @return RSSI and update indicator
+     * TODO: indicate both 2.4 and 5GHz RSSI as well as number of results
+     * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"]
+     * For instance [-40,5/-30,2]
+     */
+    private String getVisibilityStatus() {
+        String visibility ;
+        long now = System.currentTimeMillis();
+        long age = (now - mSeen);
+        if (age < 1000000) {
+            //show age in seconds, in the form xx
+            visibility = Long.toString((age / 1000) % 1000);
+        } else {
+            //not seen for more than 1000 seconds
+            visibility = "!";
+        }
+        if (mRssi != Integer.MAX_VALUE) {
+            visibility = visibility + ", " + Integer.toString(mRssi);
+        }
+        return visibility;
+    }
+
     /** Updates the title and summary; may indirectly call notifyChanged()  */
     private void refresh() {
         setTitle(ssid);
+        StringBuilder summary = new StringBuilder();
 
         Context context = getContext();
-        if (mConfig != null && mConfig.status == WifiConfiguration.Status.DISABLED) {
-            switch (mConfig.disableReason) {
-                case WifiConfiguration.DISABLED_AUTH_FAILURE:
-                    setSummary(context.getString(R.string.wifi_disabled_password_failure));
-                    break;
-                case WifiConfiguration.DISABLED_DHCP_FAILURE:
-                case WifiConfiguration.DISABLED_DNS_FAILURE:
-                    setSummary(context.getString(R.string.wifi_disabled_network_failure));
-                    break;
-                case WifiConfiguration.DISABLED_UNKNOWN_REASON:
-                    setSummary(context.getString(R.string.wifi_disabled_generic));
+        if (mConfig != null && (mConfig.status == WifiConfiguration.Status.DISABLED
+                || mConfig.autoJoinStatus != WifiConfiguration.AUTO_JOIN_ENABLED)) {
+            if (mConfig.autoJoinStatus != WifiConfiguration.AUTO_JOIN_ENABLED) {
+                summary.append(context.getString(R.string.wifi_disabled_password_failure));
+            } else {
+                switch (mConfig.disableReason) {
+                    case WifiConfiguration.DISABLED_AUTH_FAILURE:
+                        summary.append(context.getString(R.string.wifi_disabled_password_failure));
+                        break;
+                    case WifiConfiguration.DISABLED_DHCP_FAILURE:
+                    case WifiConfiguration.DISABLED_DNS_FAILURE:
+                        summary.append(context.getString(R.string.wifi_disabled_network_failure));
+                        break;
+                    case WifiConfiguration.DISABLED_UNKNOWN_REASON:
+                        summary.append(context.getString(R.string.wifi_disabled_generic));
+                }
             }
         } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range
-            setSummary(context.getString(R.string.wifi_not_in_range));
+            summary.append(context.getString(R.string.wifi_not_in_range));
         } else if (mState != null) { // This is the active connection
-            setSummary(Summary.get(context, mState));
+            summary.append(Summary.get(context, mState));
         } else { // In range, not disabled.
-            StringBuilder summary = new StringBuilder();
             if (mConfig != null) { // Is saved network
                 summary.append(context.getString(R.string.wifi_remembered));
             }
@@ -377,8 +410,13 @@
                     summary.append(context.getString(R.string.wifi_wps_available_second_item));
                 }
             }
-            setSummary(summary.toString());
         }
+        if (WifiSettings.mVerboseLogging > 0) {
+            //add RSSI/band information for this config, what was seen up to 6 seconds ago
+            //verbose WiFi Logging is only turned on thru developers settings
+            summary.append(" " + getVisibilityStatus());
+        }
+        setSummary(summary.toString());
     }
 
     /**
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 00a5b90..604275a 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -712,6 +712,8 @@
         return super.onCreateDialog(dialogId);
     }
 
+    /** verbose logging flag is set only thru developer debugging options */
+    public static int mVerboseLogging = 0;
     /**
      * Shows the latest access points available with supplimental information like
      * the strength of network and the security for it.
@@ -726,6 +728,9 @@
         }
         final int wifiState = mWifiManager.getWifiState();
 
+        //check if verbose logging has been turned on or off
+        mVerboseLogging = mWifiManager.getVerboseLoggingLevel();
+
         switch (wifiState) {
             case WifiManager.WIFI_STATE_ENABLED:
                 // AccessPoints are automatically sorted with TreeSet.
