diff --git a/service/java/com/android/server/wifi/DummyWifiLogger.java b/service/java/com/android/server/wifi/DummyWifiLogger.java
new file mode 100644
index 0000000..2727b8c
--- /dev/null
+++ b/service/java/com/android/server/wifi/DummyWifiLogger.java
@@ -0,0 +1,29 @@
+
+package com.android.server.wifi;
+
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+class DummyWifiLogger {
+
+    public DummyWifiLogger() { }
+
+    public synchronized void startLogging(boolean verboseEnabled) { }
+
+    public synchronized void startPacketLog() { }
+
+    public synchronized void stopPacketLog() { }
+
+    public synchronized void stopLogging() { }
+
+    public synchronized void captureBugReportData(int reason) { }
+
+    public synchronized void captureAlertData(int errorCode, byte[] alertData) { }
+
+    public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("*** firmware logging disabled, no debug data ****");
+        pw.println("set config_wifi_enable_wifi_firmware_debugging to enable");
+    }
+}
\ No newline at end of file
diff --git a/service/java/com/android/server/wifi/WifiLogger.java b/service/java/com/android/server/wifi/WifiLogger.java
index 8add779..c3f6510 100644
--- a/service/java/com/android/server/wifi/WifiLogger.java
+++ b/service/java/com/android/server/wifi/WifiLogger.java
@@ -35,7 +35,7 @@
 /**
  * Tracks various logs for framework
  */
-class WifiLogger  {
+class WifiLogger extends DummyWifiLogger  {
 
     private static final String TAG = "WifiLogger";
     private static final boolean DBG = false;
@@ -92,6 +92,7 @@
         mWifiStateMachine = wifiStateMachine;
     }
 
+    @Override
     public synchronized void startLogging(boolean verboseEnabled) {
         mFirmwareVersion = WifiNative.getFirmwareVersion();
         mDriverVersion = WifiNative.getDriverVersion();
@@ -112,6 +113,7 @@
         }
     }
 
+    @Override
     public synchronized void startPacketLog() {
         if (mPerPacketRingBuffer != null) {
             startLoggingRingBuffer(mPerPacketRingBuffer);
@@ -120,6 +122,7 @@
         }
     }
 
+    @Override
     public synchronized void stopPacketLog() {
         if (mPerPacketRingBuffer != null) {
             stopLoggingRingBuffer(mPerPacketRingBuffer);
@@ -128,6 +131,7 @@
         }
     }
 
+    @Override
     public synchronized void stopLogging() {
         if (mLogLevel != VERBOSE_NO_LOG) {
             //resetLogHandler only can be used when you terminate all logging since all handler will
@@ -143,17 +147,20 @@
         }
     }
 
+    @Override
     public synchronized void captureBugReportData(int reason) {
         BugReport report = captureBugreport(reason, true);
         mLastBugReports.addLast(report);
     }
 
+    @Override
     public synchronized void captureAlertData(int errorCode, byte[] alertData) {
         BugReport report = captureBugreport(errorCode, /* captureFWDump = */ true);
         report.alertData = alertData;
         mLastAlerts.addLast(report);
     }
 
+    @Override
     public synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("Chipset information :-----------------------------------------------");
         pw.println("FW Version is: " + mFirmwareVersion);
@@ -236,7 +243,7 @@
         }
     }
 
-    static class LimitedCircularArray<E> {
+    private static class LimitedCircularArray<E> {
         private CircularArray<E> mArray;
         private int mMax;
         LimitedCircularArray(int max) {
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index 355a634..87ed29c 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -194,7 +194,7 @@
     private WifiAutoJoinController mWifiAutoJoinController;
     private INetworkManagementService mNwService;
     private ConnectivityManager mCm;
-    private WifiLogger mWifiLogger;
+    private DummyWifiLogger mWifiLogger;
     private WifiApConfigStore mWifiApConfigStore;
     private final boolean mP2pSupported;
     private final AtomicBoolean mP2pConnected = new AtomicBoolean(false);
@@ -1124,7 +1124,15 @@
         mWifiAutoJoinController = new WifiAutoJoinController(context, this,
                 mWifiConfigStore, mWifiConnectionStatistics, mWifiNative);
         mWifiMonitor = new WifiMonitor(this, mWifiNative);
-        mWifiLogger = new WifiLogger(this);
+
+        boolean enableFirmwareLogs = mContext.getResources().getBoolean(
+                R.bool.config_wifi_enable_wifi_firmware_debugging);
+
+        if (enableFirmwareLogs) {
+            mWifiLogger = new WifiLogger(this);
+        } else {
+            mWifiLogger = new DummyWifiLogger();
+        }
 
         mWifiInfo = new WifiInfo();
         mSupplicantStateTracker = new SupplicantStateTracker(context, this, mWifiConfigStore,
@@ -8477,6 +8485,13 @@
                     }
                     return NOT_HANDLED;
                 case WifiMonitor.NETWORK_CONNECTION_EVENT:
+                    mWifiInfo.setBSSID((String) message.obj);
+                    mLastNetworkId = message.arg1;
+                    mWifiInfo.setNetworkId(mLastNetworkId);
+                    if(!mLastBssid.equals((String) message.obj)) {
+                        mLastBssid = (String) message.obj;
+                        sendNetworkStateChangeBroadcast(mLastBssid);
+                    }
                     break;
                 case CMD_RSSI_POLL:
                     if (message.arg1 == mRssiPollToken) {
