diff --git a/net/netlink_manager.cpp b/net/netlink_manager.cpp
index 22154a7..64db5d8 100644
--- a/net/netlink_manager.cpp
+++ b/net/netlink_manager.cpp
@@ -48,7 +48,7 @@
 // netlink.h suggests NLMSG_GOODSIZE to be at most 8192 bytes.
 constexpr int kReceiveBufferSize = 8 * 1024;
 constexpr uint32_t kBroadcastSequenceNumber = 0;
-constexpr int kMaximumNetlinkMessageWaitMilliSeconds = 300;
+constexpr int kMaximumNetlinkMessageWaitMilliSeconds = 1000;
 uint8_t ReceiveBuffer[kReceiveBufferSize];
 
 void AppendPacket(vector<unique_ptr<const NL80211Packet>>* vec,
@@ -99,7 +99,8 @@
 void NetlinkManager::ReceivePacketAndRunHandler(int fd) {
   ssize_t len = read(fd, ReceiveBuffer, kReceiveBufferSize);
   if (len == -1) {
-    LOG(ERROR) << "Failed to read packet from buffer";
+    LOG(ERROR) << "Failed to read packet from buffer on fd: " << fd;
+    perror(" netlink error ");
     return;
   }
   if (len == 0) {
@@ -307,7 +308,7 @@
                            time_remaining);
 
     if (poll_return == 0) {
-      LOG(ERROR) << "Failed to poll netlink fd: time out ";
+      LOG(ERROR) << "Failed to poll netlink fd:" << sync_netlink_fd_.get() << "time out ";
       message_handlers_.erase(sequence);
       return false;
     } else if (poll_return == -1) {
diff --git a/net/netlink_utils.cpp b/net/netlink_utils.cpp
index 73901ca..dc2e4be 100644
--- a/net/netlink_utils.cpp
+++ b/net/netlink_utils.cpp
@@ -135,8 +135,9 @@
       netlink_manager_->GetSequenceNumber(),
       getpid());
   get_wiphy.AddFlag(NLM_F_DUMP);
+  int ifindex;
   if (!iface_name.empty()) {
-    int ifindex = if_nametoindex(iface_name.c_str());
+    ifindex = if_nametoindex(iface_name.c_str());
     if (ifindex == 0) {
       PLOG(ERROR) << "Can't get " << iface_name << " index";
       return false;
@@ -145,7 +146,8 @@
   }
   vector<unique_ptr<const NL80211Packet>> response;
   if (!netlink_manager_->SendMessageAndGetResponses(get_wiphy, &response))  {
-    LOG(ERROR) << "NL80211_CMD_GET_WIPHY dump failed";
+    LOG(ERROR) << "NL80211_CMD_GET_WIPHY dump failed, ifindex: "
+               << ifindex << " and name: " << iface_name.c_str();
     return false;
   }
   if (response.empty()) {
diff --git a/scanning/scanner_impl.cpp b/scanning/scanner_impl.cpp
index bba3417..c7857df 100644
--- a/scanning/scanner_impl.cpp
+++ b/scanning/scanner_impl.cpp
@@ -225,6 +225,18 @@
   vector<vector<uint8_t>> skipped_match_ssids;
   std::set<int32_t> unique_frequencies;
   int num_networks_no_freqs = 0;
+  // Get the list of supported frequencies
+  const auto band_2g = client_interface_->GetBandInfo().band_2g;
+  const auto band_5g = client_interface_->GetBandInfo().band_5g;
+  const auto band_dfs = client_interface_->GetBandInfo().band_dfs;
+  const auto band_6g = client_interface_->GetBandInfo().band_6g;
+  const auto band_60g = client_interface_->GetBandInfo().band_60g;
+  std::set<uint32_t> all_freqs;
+  all_freqs.insert(band_2g.begin(), band_2g.end());
+  all_freqs.insert(band_5g.begin(), band_5g.end());
+  all_freqs.insert(band_dfs.begin(), band_dfs.end());
+  all_freqs.insert(band_6g.begin(), band_6g.end());
+  all_freqs.insert(band_60g.begin(), band_60g.end());
   for (auto& network : pno_settings.pno_networks_) {
     // Add hidden network ssid.
     if (network.is_hidden_) {
@@ -245,7 +257,11 @@
 
     // build the set of unique frequencies to scan for.
     for (const auto& frequency : network.frequencies_) {
-      unique_frequencies.insert(frequency);
+      if (all_freqs.find(frequency) != all_freqs.end()) {
+        unique_frequencies.insert(frequency);
+      } else {
+        LOG(INFO) << "filtered out invalid frequency " << frequency;
+      }
     }
     if (network.frequencies_.empty()) {
       num_networks_no_freqs++;
@@ -256,14 +272,12 @@
   // networks don't have frequency data.
   if (num_networks_no_freqs * 100 > kPercentNetworksWithFreq * match_ssids->size()) {
     // Filter out frequencies not supported by chip.
-    const auto band_2g = client_interface_->GetBandInfo().band_2g;
     for (const auto frequency : kPnoScanDefaultFreqs2G) {
       if (std::find(band_2g.begin(), band_2g.end(), frequency) != band_2g.end()) {
         unique_frequencies.insert(frequency);
       }
     }
     // Note: kPnoScanDefaultFreqs5G doesn't contain DFS frequencies.
-    const auto band_5g = client_interface_->GetBandInfo().band_5g;
     for (const auto frequency : kPnoScanDefaultFreqs5G) {
       if (std::find(band_5g.begin(), band_5g.end(), frequency) != band_5g.end()) {
         unique_frequencies.insert(frequency);
diff --git a/server.cpp b/server.cpp
index 1c40185..1fd10dd 100644
--- a/server.cpp
+++ b/server.cpp
@@ -488,12 +488,19 @@
 }
 
 void Server::OnRegDomainChanged(uint32_t wiphy_index, std::string& country_code) {
+  string current_country_code;
   if (country_code.empty()) {
-    LOG(INFO) << "Regulatory domain changed";
+    LOG(DEBUG) << "Regulatory domain changed with empty country code (world mode?)";
+    if (!netlink_utils_->GetCountryCode(&current_country_code)) {
+        LOG(ERROR) << "Fail to get country code on wiphy_index:" << wiphy_index;
+    }
   } else {
-    LOG(INFO) << "Regulatory domain changed to country: " << country_code
-              << " on wiphy_index: " << wiphy_index;
-    BroadcastRegDomainChanged(country_code);
+      current_country_code = country_code;
+  }
+  if (!current_country_code.empty()) {
+      LOG(INFO) << "Regulatory domain changed to country: " << current_country_code
+                << " on wiphy_index: " << wiphy_index;
+      BroadcastRegDomainChanged(current_country_code);
   }
   // Sometimes lower layer sends stale wiphy index when there are no
   // interfaces. So update band - wiphy index mapping only if an
