diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 02b35ee..fe673d9 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -812,7 +812,8 @@
     public List<WifiConfiguration> getConfiguredNetworks() {
         enforceAccessPermission();
         if (mWifiStateMachineChannel != null) {
-            return mWifiStateMachine.syncGetConfiguredNetworks(mWifiStateMachineChannel);
+            return mWifiStateMachine.syncGetConfiguredNetworks(Binder.getCallingUid(),
+                    mWifiStateMachineChannel);
         } else {
             Slog.e(TAG, "mWifiStateMachineChannel is not initialized");
             return null;
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index a533ca7..4536c41 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -526,6 +526,8 @@
     int roamWatchdogCount = 0;
     /* Roam state watchdog */
     static final int CMD_ROAM_WATCHDOG_TIMER    = BASE + 94;
+    /* Screen change intent handling */
+    static final int CMD_SCREEN_STATE_CHANGED              = BASE + 95;
 
     int disconnectingWatchdogCount = 0;
     static final int DISCONNECTING_GUARD_TIMER_MSEC = 5000;
@@ -806,6 +808,9 @@
 
     private String mTcpBufferSizes = null;
 
+    // Used for debug and stats gathering
+    private static int sScanAlarmIntentCount = 0;
+
     public WifiStateMachine(Context context, String wlanInterface,
             WifiTrafficPoller trafficPoller){
         super("WifiStateMachine");
@@ -896,6 +901,7 @@
                 new BroadcastReceiver() {
                     @Override
                     public void onReceive(Context context, Intent intent) {
+                        sScanAlarmIntentCount++;
                         startScan(SCAN_ALARM_SOURCE, null, null);
                         if (VDBG)
                             loge("WiFiStateMachine SCAN ALARM");
@@ -914,9 +920,9 @@
                         String action = intent.getAction();
 
                         if (action.equals(Intent.ACTION_SCREEN_ON)) {
-                            handleScreenStateChanged(true);
+                            sendMessage(CMD_SCREEN_STATE_CHANGED, 1);
                         } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
-                            handleScreenStateChanged(false);
+                            sendMessage(CMD_SCREEN_STATE_CHANGED, 0);
                         } else if (action.equals(ACTION_REFRESH_BATCHED_SCAN)) {
                             startNextBatchedScanAsync();
                         }
@@ -1824,8 +1830,8 @@
      * @return
      */
 
-    public List<WifiConfiguration> syncGetConfiguredNetworks(AsyncChannel channel) {
-        Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS);
+    public List<WifiConfiguration> syncGetConfiguredNetworks(int uuid, AsyncChannel channel) {
+        Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS, uuid);
         List<WifiConfiguration> result = (List<WifiConfiguration>) resultMsg.obj;
         resultMsg.recycle();
         return result;
@@ -2157,6 +2163,8 @@
                 sb.append(Integer.toString(msg.arg1));
                 sb.append(" ");
                 sb.append(Integer.toString(msg.arg2));
+                sb.append(" ");
+                sb.append(Integer.toString(sScanAlarmIntentCount));
                 if (mIsScanOngoing) sb.append(" onGoing");
                 if (mIsFullScanOngoing) sb.append(" full");
                 if (lastStartScanTimeStamp != 0) {
@@ -4010,6 +4018,9 @@
                 case CMD_START_NEXT_BATCHED_SCAN:
                     startNextBatchedScan();
                     break;
+                case CMD_SCREEN_STATE_CHANGED:
+                    handleScreenStateChanged(message.arg1 != 0);
+                    break;
                     /* Discard */
                 case CMD_START_SCAN:
                 case CMD_START_SUPPLICANT:
@@ -5306,6 +5317,9 @@
             case CMD_ROAM_WATCHDOG_TIMER:
                 s = "CMD_ROAM_WATCHDOG_TIMER";
                 break;
+            case CMD_SCREEN_STATE_CHANGED:
+                s = "CMD_SCREEN_STATE_CHANGED";
+                break;
             default:
                 s = "what:" + Integer.toString(what);
                 break;
@@ -5715,11 +5729,11 @@
                                 log("Reconfiguring proxy on connection");
                                 updateLinkProperties(CMD_UPDATE_LINKPROPERTIES);
                             }
-                            replyToMessage(message, WifiManager.SAVE_NETWORK_SUCCEEDED);
-                            if (VDBG) {
-                                loge("Success save network nid="
+                        }
+                        replyToMessage(message, WifiManager.SAVE_NETWORK_SUCCEEDED);
+                        if (VDBG) {
+                           loge("Success save network nid="
                                         + Integer.toString(result.getNetworkId()));
-                            }
                         }
 
                         /**
