diff --git a/src/com/android/phone/NetworkOperators.java b/src/com/android/phone/NetworkOperators.java
index babd283..44af267 100644
--- a/src/com/android/phone/NetworkOperators.java
+++ b/src/com/android/phone/NetworkOperators.java
@@ -88,9 +88,9 @@
         mChooseNetwork = findPreference(BUTTON_CHOOSE_NETWORK_KEY);
         mNetworkSelect = (NetworkSelectListPreference) findPreference(BUTTON_NETWORK_SELECT_KEY);
         if (mEnableNewManualSelectNetworkUI) {
-            this.removePreference(mNetworkSelect);
+            removePreference(mNetworkSelect);
         } else {
-            this.removePreference(mChooseNetwork);
+            removePreference(mChooseNetwork);
         }
         mProgressDialog = new ProgressDialog(getContext());
     }
@@ -113,7 +113,7 @@
             if (mChooseNetwork != null) {
                 TelephonyManager telephonyManager = (TelephonyManager)
                         getContext().getSystemService(Context.TELEPHONY_SERVICE);
-                logd("data connection status " + telephonyManager.getDataState());
+                if (DBG) logd("data connection status " + telephonyManager.getDataState());
                 if (telephonyManager.getDataState() == telephonyManager.DATA_CONNECTED) {
                     mChooseNetwork.setSummary(telephonyManager.getNetworkOperatorName());
                 } else {
@@ -139,7 +139,7 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mAutoSelect) {
             boolean autoSelect = (Boolean) newValue;
-            logd("onPreferenceChange autoSelect: " + String.valueOf(autoSelect));
+            if (DBG) logd("onPreferenceChange autoSelect: " + String.valueOf(autoSelect));
             selectNetworkAutomatic(autoSelect);
             MetricsLogger.action(getContext(),
                     MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE, autoSelect);
@@ -196,7 +196,6 @@
                         }
                     }
             }
-
             return;
         }
     };
@@ -241,7 +240,7 @@
     }
 
     private void selectNetworkAutomatic(boolean autoSelect) {
-        logd("selectNetworkAutomatic: " + String.valueOf(autoSelect));
+        if (DBG) logd("selectNetworkAutomatic: " + String.valueOf(autoSelect));
         if (mEnableNewManualSelectNetworkUI) {
             if (mChooseNetwork != null) {
                 mChooseNetwork.setEnabled(!autoSelect);
@@ -309,7 +308,7 @@
 
     protected boolean preferenceTreeClick(Preference preference) {
         if (mEnableNewManualSelectNetworkUI) {
-            logd("enable New AutoSelectNetwork UI");
+            if (DBG) logd("enable New AutoSelectNetwork UI");
             if (preference == mChooseNetwork) {
                 openChooseNetworkPage();
             }
diff --git a/src/com/android/phone/NetworkSelectListPreference.java b/src/com/android/phone/NetworkSelectListPreference.java
index a8f29c9..4bb03b0 100644
--- a/src/com/android/phone/NetworkSelectListPreference.java
+++ b/src/com/android/phone/NetworkSelectListPreference.java
@@ -33,11 +33,6 @@
 import android.telephony.CellInfoGsm;
 import android.telephony.CellInfoLte;
 import android.telephony.CellInfoWcdma;
-import android.telephony.CellSignalStrengthCdma;
-import android.telephony.CellSignalStrengthGsm;
-import android.telephony.CellSignalStrengthLte;
-import android.telephony.CellSignalStrengthWcdma;
-import android.telephony.NetworkScan;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.BidiFormatter;
@@ -70,8 +65,7 @@
 
     private static final int EVENT_NETWORK_SELECTION_DONE = 1;
     private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
-    private static final int EVENT_NETWORK_SCAN_ERROR = 3;
-    private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
+    private static final int EVENT_NETWORK_SCAN_COMPLETED = 3;
 
     //dialog ids
     private static final int DIALOG_NETWORK_SELECTION = 100;
@@ -83,7 +77,6 @@
 
     private int mSubId;
     private NetworkOperators mNetworkOperators;
-    private boolean mNeedScanAgain;
 
     private ProgressDialog mProgressDialog;
     public NetworkSelectListPreference(Context context, AttributeSet attrs) {
@@ -98,8 +91,10 @@
     @Override
     protected void onClick() {
         sendMetricsEvent(null);
-        // Scan the network with setting the isIncrementalResult as true via TelephonyManager first.
-        loadNetworksList(true);
+        // Start the one-time network scan via {@link Phone#getAvailableNetworks()}.
+        // {@link NetworkQueryService will return a {@link onResults()} callback first with a list
+        // of CellInfo, and then will return a {@link onComplete} indicating the scan completed.
+        loadNetworksList();
     }
 
     private final Handler mHandler = new Handler() {
@@ -132,86 +127,22 @@
                 case EVENT_NETWORK_SCAN_RESULTS:
                     List<CellInfo> results = (List<CellInfo>) msg.obj;
                     results.removeIf(cellInfo -> cellInfo == null);
-                    if (results.size() > 0) {
-                        boolean isInvalidCellInfoList = true;
-                        // Regard the list as invalid only if all the elements in the list are
-                        // invalid.
-                        for (CellInfo cellInfo : results) {
-                            if (!isInvalidCellInfo(cellInfo)) {
-                                isInvalidCellInfoList = false;
-                                break;
-                            }
-                        }
-                        if (isInvalidCellInfoList) {
-                            mNeedScanAgain = true;
-                            if (DBG) {
-                                logd("Invalid cell info. Stop current network scan "
-                                        + "and start a new one via old API");
-                            }
-                            // Stop current network scan flow. This behavior will result in a
-                            // onComplete() callback, after which we will start a new network query
-                            // via Phone.getAvailableNetworks(). This behavior might also result in
-                            // a onError() callback if the modem did not stop network query
-                            // successfully. In this case we will display network query failed
-                            // instead of resending a new request.
-                            try {
-                                if (mNetworkQueryService != null) {
-                                    mNetworkQueryService.stopNetworkQuery();
-                                }
-                            } catch (RemoteException e) {
-                                loge("exception from stopNetworkQuery " + e);
-                            }
-                        } else {
-                            // TODO(b/70530820): Display the scan results incrementally after
-                            // finalizing the UI desing on Mobile Network Setting page. For now,
-                            // just update the CellInfo list when received the onResult callback,
-                            // and display the scan result when received the onComplete callback
-                            // in the end.
-                            mCellInfoList = new ArrayList<>(results);
-                            if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
-                        }
-                    }
+                    mCellInfoList = new ArrayList<>(results);
+                    if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
 
                     break;
 
-                case EVENT_NETWORK_SCAN_ERROR:
-                    int error = msg.arg1;
-                    if (DBG) logd("error while querying available networks " + error);
-                    if (error == NetworkScan.ERROR_UNSUPPORTED) {
-                        if (DBG) {
-                            logd("Modem does not support: try to scan network again via Phone");
-                        }
-                        loadNetworksList(false);
-                    } else {
-                        try {
-                            if (mNetworkQueryService != null) {
-                                mNetworkQueryService.unregisterCallback(mCallback);
-                            }
-                        } catch (RemoteException e) {
-                            loge("onError: exception from unregisterCallback " + e);
-                        }
-                        displayNetworkQueryFailed(error);
-                    }
-                    break;
-
                 case EVENT_NETWORK_SCAN_COMPLETED:
-                    if (mNeedScanAgain) {
-                        logd("CellInfo is invalid to display. Start a new scan via Phone. ");
-                        loadNetworksList(false);
-                        mNeedScanAgain = false;
-                    } else {
-                        try {
-                            if (mNetworkQueryService != null) {
-                                mNetworkQueryService.unregisterCallback(mCallback);
-                            }
-                        } catch (RemoteException e) {
-                            loge("onComplete: exception from unregisterCallback " + e);
+                    try {
+                        if (mNetworkQueryService != null) {
+                            mNetworkQueryService.unregisterCallback(mCallback);
                         }
-                        if (DBG) logd("scan complete, load the cellInfosList");
-                        // Modify UI to indicate users that the scan has completed.
-                        networksListLoaded();
+                    } catch (RemoteException e) {
+                        loge("onComplete: exception from unregisterCallback " + e);
                     }
-                    break;
+                    if (DBG) logd("scan complete, load the cellInfosList");
+                    // Modify UI to indicate users that the scan has completed.
+                    networksListLoaded();
             }
             return;
         }
@@ -224,7 +155,7 @@
      */
     private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
 
-        /** Returns the scan results to the user, this callback will be called at lease one time. */
+        /** Returns the scan results to the user, this callback will be called only one time. */
         public void onResults(List<CellInfo> results) {
             if (DBG) logd("get scan results.");
             Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
@@ -244,16 +175,9 @@
         }
 
         /**
-         * Informs the user that there is some error about the scan.
-         *
-         * This callback will be called whenever there is any error about the scan, and the scan
-         * will be terminated. onComplete() will NOT be called.
+         * This callback will not be called, since the old Scan API won't send this callback.
          */
-        public void onError(int error) {
-            if (DBG) logd("get onError callback with error code: " + error);
-            Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error, 0 /* arg2 */);
-            msg.sendToTarget();
-        }
+        public void onError(int error) {}
     };
 
     @Override
@@ -298,7 +222,6 @@
         mNetworkOperators = networkOperators;
         // This preference should share the same progressDialog with networkOperators category.
         mProgressDialog = progressDialog;
-        mNeedScanAgain = false;
 
         if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
             mPhoneId = SubscriptionManager.getPhoneId(mSubId);
@@ -361,17 +284,14 @@
                 NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
     }
 
-    private void loadNetworksList(boolean isIncrementalResult) {
+    private void loadNetworksList() {
         if (DBG) logd("load networks list...");
 
-        if (!mNeedScanAgain) {
-            // Avoid blinking while showing the dialog again.
-            showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
-        }
+        showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
 
         try {
             if (mNetworkQueryService != null) {
-                mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId, isIncrementalResult);
+                mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId, false);
             } else {
                 displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION);
             }
@@ -399,7 +319,6 @@
         }
 
         setEnabled(true);
-
         if (mCellInfoList != null) {
             // create a preference for each item in the list.
             // just use the operator name instead of the mildly
@@ -554,46 +473,6 @@
         return oi;
     }
 
-
-    /**
-     * Check if the CellInfo is valid to display. If a CellInfo has signal strength but does
-     * not have operator info, it is invalid to display.
-     */
-    private boolean isInvalidCellInfo(CellInfo cellInfo) {
-        if (DBG) logd("Check isInvalidCellInfo: " + cellInfo.toString());
-        CharSequence al = null;
-        CharSequence as = null;
-        boolean hasSignalStrength = false;
-        if (cellInfo instanceof CellInfoLte) {
-            CellInfoLte lte = (CellInfoLte) cellInfo;
-            al = lte.getCellIdentity().getOperatorAlphaLong();
-            as = lte.getCellIdentity().getOperatorAlphaShort();
-            hasSignalStrength = !lte.getCellSignalStrength().equals(new CellSignalStrengthLte());
-        } else if (cellInfo instanceof CellInfoWcdma) {
-            CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
-            al = wcdma.getCellIdentity().getOperatorAlphaLong();
-            as = wcdma.getCellIdentity().getOperatorAlphaShort();
-            hasSignalStrength = !wcdma.getCellSignalStrength().equals(
-                    new CellSignalStrengthWcdma());
-        } else if (cellInfo instanceof CellInfoGsm) {
-            CellInfoGsm gsm = (CellInfoGsm) cellInfo;
-            al = gsm.getCellIdentity().getOperatorAlphaLong();
-            as = gsm.getCellIdentity().getOperatorAlphaShort();
-            hasSignalStrength = !gsm.getCellSignalStrength().equals(new CellSignalStrengthGsm());
-        } else if (cellInfo instanceof CellInfoCdma) {
-            CellInfoCdma cdma = (CellInfoCdma) cellInfo;
-            al = cdma.getCellIdentity().getOperatorAlphaLong();
-            as = cdma.getCellIdentity().getOperatorAlphaShort();
-            hasSignalStrength = !cdma.getCellSignalStrength().equals(new CellSignalStrengthCdma());
-        } else {
-            return true;
-        }
-        if (TextUtils.isEmpty(al) && TextUtils.isEmpty(as) && hasSignalStrength) {
-            return true;
-        }
-        return false;
-    }
-
     @Override
     protected Parcelable onSaveInstanceState() {
         final Parcelable superState = super.onSaveInstanceState();
diff --git a/src/com/android/phone/NetworkSelectSetting.java b/src/com/android/phone/NetworkSelectSetting.java
index 7ef3dea..ff918e2 100644
--- a/src/com/android/phone/NetworkSelectSetting.java
+++ b/src/com/android/phone/NetworkSelectSetting.java
@@ -15,6 +15,7 @@
  */
 package com.android.phone;
 
+import android.app.ActionBar;
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
@@ -60,7 +61,7 @@
 public class NetworkSelectSetting extends PreferenceFragment {
 
     private static final String TAG = "NetworkSelectSetting";
-    private static final boolean DBG = true;
+    private static final boolean DBG = false;
 
     private static final int EVENT_NETWORK_SELECTION_DONE = 1;
     private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
@@ -132,6 +133,12 @@
         // Inflate progress bar
         final Activity activity = getActivity();
         if (activity != null) {
+            ActionBar actionBar = activity.getActionBar();
+            if (actionBar != null) {
+                // android.R.id.home will be triggered in
+                // {@link NetworkSelectSettingAcitivity#onOptionsItemSelected()}
+                actionBar.setDisplayHomeAsUpEnabled(true);
+            }
             mFrameLayout = activity.findViewById(R.id.choose_network_content);
             final LayoutInflater inflater = activity.getLayoutInflater();
             final View pinnedHeader =
@@ -256,13 +263,13 @@
 
                     ar = (AsyncResult) msg.obj;
                     if (ar.exception != null) {
-                        mNetworkOperators.displayNetworkSelectionFailed(ar.exception);
+                        if (DBG) logd("manual network selection: failed! ");
+                        updateNetworkSelection();
                         // Set summary as "Couldn't connect" to the selected network.
                         mSelectedNetworkOperatorPreference.setSummary(
                                 R.string.network_could_not_connect);
                     } else {
                         if (DBG) logd("manual network selection: succeeded! ");
-                        mNetworkOperators.displayNetworkSelectionSucceeded(msg.arg1);
                         // Set summary as "Connected" to the selected network.
                         mSelectedNetworkOperatorPreference.setSummary(R.string.network_connected);
                     }
@@ -290,7 +297,6 @@
                 case EVENT_NETWORK_SCAN_COMPLETED:
                     stopNetworkQuery();
                     if (DBG) logd("scan complete");
-                    setProgressBarVisible(false);
                     if (mCellInfoList == null) {
                         // In case the scan timeout before getting any results
                         addMessagePreference(R.string.empty_networks_list);
@@ -611,6 +617,22 @@
         }
     }
 
+    /**
+     * Call {@link NotificationMgr#updateNetworkSelection(int, int)} to send notification about
+     * no service of user selected operator
+     */
+    private void updateNetworkSelection() {
+        if (DBG) logd("Update notification about no service of user selected operator");
+        final PhoneGlobals app = PhoneGlobals.getInstance();
+        Phone phone = PhoneFactory.getPhone(mPhoneId);
+        if (phone != null) {
+            ServiceState ss = mTelephonyManager.getServiceStateForSubscriber(phone.getSubId());
+            if (ss != null) {
+                app.notificationMgr.updateNetworkSelection(ss.getState(), phone.getSubId());
+            }
+        }
+    }
+
     private void stopNetworkQuery() {
         // Stop the network query process
         try {
diff --git a/src/com/android/phone/NetworkSelectSettingActivity.java b/src/com/android/phone/NetworkSelectSettingActivity.java
index 2f730ad..a151c81 100644
--- a/src/com/android/phone/NetworkSelectSettingActivity.java
+++ b/src/com/android/phone/NetworkSelectSettingActivity.java
@@ -23,6 +23,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.MenuItem;
 
 
 /**
@@ -57,4 +58,14 @@
                     .commit();
         }
     }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        final int itemId = item.getItemId();
+        if (itemId == android.R.id.home) {
+            onBackPressed();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
 }
