diff --git a/fmapp2/res/layout/band_sweep_setting.xml b/fmapp2/res/layout/band_sweep_setting.xml
new file mode 100644
index 0000000..777332c
--- /dev/null
+++ b/fmapp2/res/layout/band_sweep_setting.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     * Copyright (c) 2013 The Linux Foundation. All rights reserved.
+     *
+     * Redistribution and use in source and binary forms, with or without
+     * modification, are permitted provided that the following conditions are met:
+     *    * Redistributions of source code must retain the above copyright
+     *      notice, this list of conditions and the following disclaimer.
+     *    * Redistributions in binary form must reproduce the above copyright
+     *      notice, this list of conditions and the following disclaimer in the
+     *      documentation and/or other materials provided with the distribution.
+     *    * Neither the name of The Linux Foundation nor
+     *      the names of its contributors may be used to endorse or promote
+     *      products derived from this software without specific prior written
+     *      permission.
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+     * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+     * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+     * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:scrollbars="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_gravity="center_horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent">
+
+        <TextView
+            android:id="@+id/lbl_band_sweep_spinner"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="15sp"
+            android:text="@string/band_sweep_choose"/>
+
+        <Spinner
+            android:id="@+id/band_sweep_spinner"
+            android:layout_width="fill_parent"
+            android:layout_height="75dp"
+            android:layout_below="@id/lbl_band_sweep_spinner"
+            android:prompt="@string/band_method_prompt"
+            android:textSize="25sp"/>
+
+        <TextView
+            android:id="@+id/LabelStartdelay"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="15sp"
+            android:layout_below="@id/band_sweep_spinner"
+            android:text="@string/enter_start_delay_time"/>
+
+        <EditText
+            android:id="@+id/txtboxDelayTime"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="15sp"
+            android:inputType="number"
+            android:layout_toRightOf="@id/LabelStartdelay"/>
+
+        <TextView
+            android:id="@+id/LabelDwellTime"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="15sp"
+            android:layout_below="@id/LabelStartdelay"
+            android:text="@string/enter_dwell_time"/>
+
+        <EditText
+            android:id="@+id/txtboxDwellTime"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textSize="15sp"
+            android:inputType="number"
+            android:layout_toRightOf="@id/LabelDwellTime"/>
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/fmapp2/res/layout/fmstats.xml b/fmapp2/res/layout/fmstats.xml
index 2501a51..1cf8023 100644
--- a/fmapp2/res/layout/fmstats.xml
+++ b/fmapp2/res/layout/fmstats.xml
@@ -50,9 +50,18 @@
 
            <Button
                android:id= "@+id/Runbutton"
-               android:text="@string/test_run"
+               android:text="@string/band_sweep_setting"
                android:layout_width="wrap_content"
                android:layout_height="100dp"
+               android:textSize="25dp"
+               android:visibility="gone"/>
+
+           <TextView
+               android:id= "@+id/BandSweepSetting"
+               android:text="@string/band_sweep_setting"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:layout_toRightOf="@id/Runbutton"
                android:textSize="25sp"
                android:visibility="gone"/>
 
diff --git a/fmapp2/res/values/arrays.xml b/fmapp2/res/values/arrays.xml
index d7904be..c453c6a 100644
--- a/fmapp2/res/values/arrays.xml
+++ b/fmapp2/res/values/arrays.xml
@@ -243,6 +243,7 @@
     <item>Turkey</item>
     <item>United Kingdom </item>
     <item>United States</item>
+    <item>User Defined Band</item>
   </string-array>
 
   <string-array name="regional_band_values">
@@ -282,6 +283,7 @@
     <item>33</item>
     <item>34</item>
     <item>35</item>
+    <item>36</item>
   </string-array>
 
   <string-array name="regional_band_summary">
@@ -321,6 +323,7 @@
     <item>Turkey (87.5MHz To 108.0MHz In 100 Khz Steps)</item>
     <item>United Kingdom (87.5MHz To 108.0MHz In 100 Khz Steps)</item>
     <item>United States (88.1MHz To 107.9MHz In 200 Khz Steps)</item>
+    <item>User Defined Band</item>
   </string-array>
 
   <string-array name="rf_cfg">
@@ -368,4 +371,21 @@
       <item> RF Statistics</item>
   </string-array>
 
+  <string-array name="channel_spacing_val">
+      <item>2</item>
+      <item>1</item>
+      <item>0</item>
+  </string-array>
+
+  <string-array name="channel_spacing_entries">
+      <item>50 Khz</item>
+      <item>100 Khz</item>
+      <item>200 Khz</item>
+  </string-array>
+
+  <string-array name="band_sweep_methods">
+      <item>Manual</item>
+      <item>From File</item>
+  </string-array>
+
 </resources>
diff --git a/fmapp2/res/values/strings.xml b/fmapp2/res/values/strings.xml
index 12c9778..8fdc938 100644
--- a/fmapp2/res/values/strings.xml
+++ b/fmapp2/res/values/strings.xml
@@ -247,4 +247,17 @@
     <string name="enter_RxRePeatCount">Enter RxRePeat count</string>
     <string name="set_RxRePeatCount">Config RxRePeat count</string>
 
+    <string name="usr_def_band_min">Lower Freq Limit(In Mhz)</string>
+    <string name="usr_def_band_max">Higher Freq Limit(In Mhz)</string>
+    <string name="sel_chanl_spacing">Select Channel Spacing</string>
+    <string name="chanl_spacing">Channel Spacing</string>
+
+    <string name="band_method_prompt">Select Method</string>
+    <string name="enter_start_delay_time">Start Delay Time</string>
+    <string name="enter_dwell_time">Dwell Time</string>
+    <string name="band_sweep_setting">Sweep Setting</string>
+    <string name="band_sweep_setting_set">Set</string>
+    <string name="band_sweep_setting_cancel">Cancel</string>
+    <string name="band_sweep_choose">Choose Band Sweep Method</string>
+
 </resources>
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 4014b8e..e587c08 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -55,6 +55,10 @@
 import android.widget.AdapterView.OnItemSelectedListener;
 import qcom.fmradio.FmReceiver;
 import android.os.SystemProperties;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.view.LayoutInflater;
+import android.content.DialogInterface;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -62,7 +66,8 @@
 import java.io.OutputStreamWriter;
 import java.util.HashMap;
 import android.os.SystemProperties;
-
+import java.io.BufferedReader;
+import java.io.FileReader;
 
 public class FMStats extends Activity  {
 
@@ -77,12 +82,13 @@
 
     private FmReceiver mReceiver;
 
+    TextView  bandSweepSettingButton;
+
     /*Data structure for band*/
     private class Band {
-
-        public int lFreq;
-        public int hFreq;
-        public int Spacing;
+      public int lFreq;
+      public int hFreq;
+      public int Spacing;
     }
     /* Data structure for Result*/
     private class Result {
@@ -141,47 +147,51 @@
       public String getSINR() {
          return mSINR;
       }
-
     };
 
     /*constant column header*/
     Result mColumnHeader = new Result();
 
     boolean mTestRunning = false;
-    FmRfItemSelectedListener mSpinFmRfListener = new FmRfItemSelectedListener();
-    RfCfgItemSelectedListener mSpinRfCfgListener = new RfCfgItemSelectedListener();
+    FmRfItemSelectedListener mSpinFmRfListener =
+                                     new FmRfItemSelectedListener();
+    RfCfgItemSelectedListener mSpinRfCfgListener =
+                                     new RfCfgItemSelectedListener();
     CfgRfItemSelectedListener1 mSpinCfgRfListener1 = null;
     CfgRfItemSelectedListener2 mSpinCfgRfListener2 = null;
-
+    BandSweepMthdsSelectedListener mSweepMthdsListener =
+                                     new BandSweepMthdsSelectedListener();
 
     int  mTestSelected = 0;
     boolean mIsSearching = false;
     private static String LOGTAG = "FMStats";
     private static IFMRadioService mService = null;
-    private Thread mMultiUpdateThread =null;
-    private static final int STATUS_UPDATE =1;
-    private static final int STATUS_DONE =2;
-    private static final int STOP_ROW_ID =200;
+    private Thread mMultiUpdateThread = null;
+    private static final int STATUS_UPDATE = 1;
+    private static final int STATUS_DONE = 2;
+    private static final int STOP_ROW_ID = 200;
     private static final int NEW_ROW_ID = 300;
     private int mStopIds = STOP_ROW_ID;
     private int mNewRowIds = NEW_ROW_ID;
     private static final int SCAN_DWELL_PERIOD = 1;
 
-    private static final int CUR_FREQ_TEST =0;
+    private static final int CUR_FREQ_TEST = 0;
     private static final int CUR_MULTI_TEST = 1;
     private static final int SEARCH_TEST =2;
-    private static final int SWEEP_TEST =3;
-    private Band mBand =null;
+    private static final int SWEEP_TEST = 3;
+    private Band mBand = null;
     private Band mSync = null;
     int Lo = 1, Auto = 0;
 
-    private FileOutputStream mFileCursor =null;
+    private FileOutputStream mFileCursor = null;
     private String mCurrentFileName = null;
 
     Spinner spinOptionFmRf;
+    Spinner spinOptionBandSweepMthds;
     ArrayAdapter<CharSequence> adaptCfgRf;
     ArrayAdapter<CharSequence> adaptRfCfg;
     ArrayAdapter<CharSequence> adaptFmRf;
+    ArrayAdapter<CharSequence> bandSweepMthds;
 
     private static boolean mIsTransportSMD = false;
 
@@ -204,27 +214,42 @@
     private static final int MIN_AF_JMP_RMSSI_SAMPLES = 0;
     private static final int MAX_AF_JMP_RMSSI_SAMPLES = 255;
 
+    private static final int DIALOG_BAND_SWEEP_SETTING = 1;
+
+    private int prevDwellTime = 2; //2secs
+    private int prevDelayTime = 0;//0secs
+    private int prevSweepMthd = 0; //Manual (using band min, max)
+
+    private int curSweepMthd = 0;
+
+    private final String FREQ_LIST_FILE_NAME = "/freq_list_comma_separated.txt";
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         this.setContentView(R.layout.fmstats);
 
-        spinOptionFmRf = (Spinner) findViewById(R.id.spinner);
-        adaptFmRf = ArrayAdapter.createFromResource(
-            this, R.array.stats_options, android.R.layout.simple_spinner_item);
-        adaptFmRf.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinOptionFmRf = (Spinner)findViewById(R.id.spinner);
+        adaptFmRf = ArrayAdapter.createFromResource
+                       (this, R.array.stats_options
+                         , android.R.layout.simple_spinner_item);
+        adaptFmRf.setDropDownViewResource
+                   (android.R.layout.simple_spinner_dropdown_item);
         if (spinOptionFmRf != null) {
            spinOptionFmRf.setAdapter(adaptFmRf);
            spinOptionFmRf.setOnItemSelectedListener(mSpinFmRfListener);
         }
 
+        bandSweepMthds = ArrayAdapter.createFromResource
+                          (this, R.array.band_sweep_methods,
+                            android.R.layout.simple_spinner_item);
+
         checkTransportLayer();
         if (!isTransportLayerSMD()) {
             mSpinCfgRfListener1 = new CfgRfItemSelectedListener1();
             adaptCfgRf = ArrayAdapter.createFromResource(
                            this, R.array.cfg_rf1,
                            android.R.layout.simple_spinner_item);
-        } else {
+        }else {
             mSpinCfgRfListener2 = new CfgRfItemSelectedListener2();
             adaptCfgRf = ArrayAdapter.createFromResource(
                            this, R.array.cfg_rf2,
@@ -238,194 +263,206 @@
         if(mReceiver == null)
             mReceiver = new FmReceiver();
 
-        long  curTime = System.currentTimeMillis();
-        mCurrentFileName = "FMStats_".concat(Long.toString(curTime).concat(".txt"));
-        Log.e(LOGTAG,"Filename is "+mCurrentFileName);
+        long curTime = System.currentTimeMillis();
+        mCurrentFileName = "FMStats_".concat(
+                                 Long.toString(curTime).concat(".txt")
+                              );
+        Log.e(LOGTAG,"Filename is " + mCurrentFileName);
         try {
-            mFileCursor = openFileOutput(mCurrentFileName, Context.MODE_PRIVATE);
+            mFileCursor = openFileOutput(
+                                 mCurrentFileName,
+                                 Context.MODE_PRIVATE);
             if(null != mFileCursor) {
                Log.e(LOGTAG, "location of the file is"+getFilesDir());
             }
-        } catch (IOException e) {
-             e.printStackTrace();
+        }catch (IOException e) {
+            e.printStackTrace();
             Log.e(LOGTAG,"Couldn't create the file to writeLog");
             mCurrentFileName = null;
         }
 
-        if (false == bindToService(this, osc))
-        {
-           Log.d(LOGTAG, "onCreate: Failed to Start Service");
-        }
-        else
-        {
-           Log.d(LOGTAG, "onCreate: Start Service completed successfully");
+        if (false == bindToService(this, osc)) {
+            Log.d(LOGTAG, "onCreate: Failed to Start Service");
+        }else {
+            Log.d(LOGTAG, "onCreate: Start Service completed successfully");
         }
 
-	/*Initialize the column header with
-	constant values*/
-	mColumnHeader.setFreq("Freq");
-	mColumnHeader.setRSSI("RMSSI");
-	mColumnHeader.setIoC("IoC");
+        /*Initialize the column header with
+        constant values*/
+        mColumnHeader.setFreq("Freq");
+        mColumnHeader.setRSSI("RMSSI");
+        mColumnHeader.setIoC("IoC");
         mColumnHeader.setSINR("SINR");
-	mColumnHeader.setMpxDcc("Offset");
-	mColumnHeader.setIntDet("IntDet");
+        mColumnHeader.setMpxDcc("Offset");
+        mColumnHeader.setIntDet("IntDet");
+
+        bandSweepSettingButton = (TextView)findViewById(R.id.BandSweepSetting);
+        if(bandSweepSettingButton != null) {
+           bandSweepSettingButton.setOnClickListener(mClicktBandSweepSettingListener);
+        }
     }
 
     public void onDestroy() {
         if(null != mFileCursor ) {
-	    try {
-		mFileCursor.close();
+            try {
+                mFileCursor.close();
             } catch (IOException e) {
-
                 e.printStackTrace();
             }
         }
-	/*Stop the thread by interrupting it*/
-	if(mMultiUpdateThread != null) {
-		mMultiUpdateThread.interrupt();
-		mMultiUpdateThread = null;
-	}
-	/*Stop the search/scan if there is an ongoing*/
+        /*Stop the thread by interrupting it*/
+        if(mMultiUpdateThread != null) {
+           mMultiUpdateThread.interrupt();
+           mMultiUpdateThread = null;
+        }
+        /*Stop the search/scan if there is an ongoing*/
         if(SEARCH_TEST == mTestSelected)
         {
-		Log.d(LOGTAG, "Stop Search\n");
-		try {
-                    mService.cancelSearch();
-                } catch (RemoteException e) {
-                     e.printStackTrace();
-                }
+           Log.d(LOGTAG, "Stop Search\n");
+           try {
+                 mService.cancelSearch();
+           } catch (RemoteException e) {
+                 e.printStackTrace();
+           }
         }
 
         unbindFromService(this);
         Log.d(LOGTAG, "onDestroy: unbindFromService completed");
         mReceiver = null;
         mService = null;
+        removeDialog(DIALOG_BAND_SWEEP_SETTING);
         super.onDestroy();
     }
 
     private View.OnClickListener mOnRunListener = new View.OnClickListener() {
-       public void onClick(View v) {
-          if(false == mTestRunning)
-          {
+        public void onClick(View v) {
+           if(false == mTestRunning) {
               clearPreviousTestResults();
               mTestRunning = true;
+              if(mTestSelected == SWEEP_TEST) {
+                 disableBandSweepSetting();
+              }
               runCurrentTest();
-          }
-          else
-          {
+           }else {
               mTestRunning = false;
               /*Set it back to ready to Run*/
               SetButtonState(true);
-		/*Stop the thread by interrupting it*/
-	      if(mMultiUpdateThread != null) {
-	            mMultiUpdateThread.interrupt();
-		    mMultiUpdateThread = null;
-	      }
+              /*Stop the thread by interrupting it*/
+              if(mMultiUpdateThread != null) {
+                 mMultiUpdateThread.interrupt();
+                 mMultiUpdateThread = null;
+              }
 
-              if(SEARCH_TEST == mTestSelected )
-              {
+              if(SEARCH_TEST == mTestSelected) {
                  try {
                       mService.cancelSearch();
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                       e.printStackTrace();
                  }
               }
-          }
+              if(mTestSelected == SWEEP_TEST) {
+                 enableBandSweepSetting();
+              }
+           }
        }
     };
 
-   private void clearPreviousTestResults()
-   {
-       TableLayout tl = (TableLayout) findViewById(R.id.maintable);
+    private void clearPreviousTestResults() {
+       TableLayout tl = (TableLayout)findViewById(R.id.maintable);
        if (tl != null) {
-          tl.removeAllViewsInLayout();
+           tl.removeAllViewsInLayout();
        }
        mNewRowIds = NEW_ROW_ID;
-   }
+    }
 
-
-    private void SetButtonState(boolean state)
-    {
-        // Get the TableRow
-        Button RunButton = (Button)findViewById(R.id.Runbutton);
-        ProgressBar  pbar = (ProgressBar) findViewById(R.id.progressbar);
-        /*Update the state of the button based on
+    private void SetButtonState(boolean state) {
+       // Get the TableRow
+       Button RunButton = (Button)findViewById(R.id.Runbutton);
+       ProgressBar  pbar = (ProgressBar)findViewById(R.id.progressbar);
+       /*Update the state of the button based on
         state*/
-        if( state )
-        {
-            if (RunButton != null) {
-               RunButton.setText(R.string.test_run);
-            }
-            if (pbar != null) {
-               pbar.setVisibility(View.INVISIBLE);
-            }
-        }
-        else
-        {
-            if (RunButton != null) {
-               RunButton.setText("Stop Test");
-            }
-            if (pbar != null) {
-               pbar.setVisibility(View.VISIBLE);
-            }
-        }
+       if(state) {
+          if(RunButton != null) {
+             RunButton.setText(R.string.test_run);
+          }
+          if(pbar != null) {
+             pbar.setVisibility(View.INVISIBLE);
+          }
+          if(mTestSelected == SWEEP_TEST) {
+             enableBandSweepSetting();
+          }
+       }else {
+          if(RunButton != null) {
+             RunButton.setText("Stop Test");
+          }
+          if(pbar != null) {
+             pbar.setVisibility(View.VISIBLE);
+          }
+       }
     }
 
     private void chooseFMRFoption(){
-        String[] szTestInformation = getResources().getStringArray(
+       String[] szTestInformation = getResources().getStringArray(
                         R.array.stats_options);
-        final StringBuilder szbTestHeader = new StringBuilder();
-        szbTestHeader.append("running test:").append(szTestInformation[mTestSelected]);
-        String szTestHeader = new String(szbTestHeader);
-        switch(mTestSelected){
-            case 1:
-                RunButton = (Button)findViewById(R.id.Runbutton);
-                if (RunButton != null) {
-                   RunButton.setVisibility(View.INVISIBLE);
-                }
-                pbar = (ProgressBar) findViewById(R.id.progressbar);
-                if (pbar != null) {
-                   pbar.setVisibility(View.INVISIBLE);
-                }
-                adaptCfgRf.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-                spinOptionFmRf.setAdapter(adaptCfgRf);
-                if(isTransportLayerSMD())
-                   spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2);
-                else
-                   spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1);
-                break;
-            case 2:
-                txtbox1 = (EditText) findViewById(R.id.txtbox1);
-                tv1 = (TextView) findViewById(R.id.label);
-                if (txtbox1 != null) {
-                   txtbox1.setVisibility(View.INVISIBLE);
-                }
-                if (tv1 != null) {
-                   tv1.setVisibility(View.INVISIBLE);
-                }
-                Button SetButton = (Button)findViewById(R.id.Setbutton);
-                if (SetButton != null) {
-                   SetButton.setVisibility(View.INVISIBLE);
-                }
-                adaptRfCfg.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-                spinOptionFmRf.setAdapter(adaptRfCfg);
-                spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener);
-                break;
+       final StringBuilder szbTestHeader = new StringBuilder();
+       szbTestHeader.append("running test:").append
+                              (szTestInformation[mTestSelected]);
+       String szTestHeader = new String(szbTestHeader);
+       switch(mTestSelected)
+       {
+       case 1:
+               RunButton = (Button)findViewById(R.id.Runbutton);
+               if(RunButton != null) {
+                  RunButton.setVisibility(View.INVISIBLE);
+               }
+               pbar = (ProgressBar) findViewById(R.id.progressbar);
+               if(pbar != null) {
+                  pbar.setVisibility(View.INVISIBLE);
+               }
+               adaptCfgRf.setDropDownViewResource
+                           (android.R.layout.simple_spinner_dropdown_item);
+               spinOptionFmRf.setAdapter(adaptCfgRf);
+               if(isTransportLayerSMD())
+                  spinOptionFmRf.setOnItemSelectedListener
+                                   (mSpinCfgRfListener2);
+               else
+                  spinOptionFmRf.setOnItemSelectedListener
+                                   (mSpinCfgRfListener1);
+               break;
+       case 2:
+               txtbox1 = (EditText)findViewById(R.id.txtbox1);
+               tv1 = (TextView)findViewById(R.id.label);
+               if(txtbox1 != null) {
+                  txtbox1.setVisibility(View.INVISIBLE);
+               }
+               if(tv1 != null) {
+                  tv1.setVisibility(View.INVISIBLE);
+               }
+               Button SetButton = (Button)findViewById(R.id.Setbutton);
+               if(SetButton != null) {
+                  SetButton.setVisibility(View.INVISIBLE);
+               }
+               adaptRfCfg.setDropDownViewResource
+                               (android.R.layout.simple_spinner_dropdown_item);
+               spinOptionFmRf.setAdapter(adaptRfCfg);
+               spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener);
+               break;
         }
     }
 
-    private View.OnClickListener mOnSetRmssitListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetRmssitListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
                int rdel = Integer.parseInt(a);
                Log.d(LOGTAG, "Value of RMSSI DELTA is : " + rdel);
                mReceiver.setRmssiDel(rdel);
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
                Log.e(LOGTAG, "Value entered is not in correct format: " + a);
                txtbox1.setText("");
-          } catch (NullPointerException e) {
+          }catch (NullPointerException e) {
                e.printStackTrace();
           }
        }
@@ -455,108 +492,116 @@
         }
     };
 
-    private View.OnClickListener mOnSetSigThListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetSigThListener =
+     new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rdel = Integer.parseInt(a);
               Log.d(LOGTAG, "Value of Signal Th. is : " + rdel);
               mReceiver.setSignalThreshold(rdel);
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format: " + a);
               txtbox1.setText("");
-          } catch (NullPointerException e) {
+          }catch (NullPointerException e) {
               e.printStackTrace();
           }
       }
     };
 
-    private View.OnClickListener mOnSetSinrSmplCntListener  = new View.OnClickListener() {
+    private View.OnClickListener mOnSetSinrSmplCntListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rdel = Integer.parseInt(a);
               Log.d(LOGTAG, "Value of Sinr Samples count is : " + rdel);
               if(mService != null) {
                  try {
                      mService.setSinrSamplesCnt(rdel);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format: " + a);
               txtbox1.setText("");
           }
       }
     };
-    private View.OnClickListener mOnSetSinrThListener = new View.OnClickListener() {
+
+    private View.OnClickListener mOnSetSinrThListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rdel = Integer.parseInt(a);
               Log.d(LOGTAG, "Value of Sinr Th is : " + rdel);
               if(mService != null) {
                  try {
                      mService.setSinrTh(rdel);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format: " + a);
               txtbox1.setText("");
           }
       }
     };
-    private View.OnClickListener mOnSetIntfLowThListener = new View.OnClickListener() {
+
+    private View.OnClickListener mOnSetIntfLowThListener =
+     new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rdel = Integer.parseInt(a);
               Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel);
               if(mService != null) {
                  try {
                      mService.setIntfDetLowTh(rdel);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format: " + a);
               txtbox1.setText("");
           }
       }
     };
-    private View.OnClickListener mOnSetIntfHighThListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetIntfHighThListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rdel = Integer.parseInt(a);
               Log.d(LOGTAG, "Value of Intf Det Low Th is : " + rdel);
               if(mService != null) {
                  try {
                      mService.setIntfDetHighTh(rdel);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
 
-    private View.OnClickListener mOnSetSinrFirstStageListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetSinrFirstStageListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int sinr = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for SINR FIRST STAGE is : " + sinr);
@@ -566,20 +611,22 @@
               if(mService != null) {
                  try {
                      mService.setSinrFirstStage(sinr);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
-    private View.OnClickListener mOnSetRmssiFirstStageListener = new View.OnClickListener() {
+
+    private View.OnClickListener mOnSetRmssiFirstStageListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int rmssi = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for RMSSI FIRST STAGE is: " + rmssi);
@@ -589,21 +636,22 @@
               if(mService != null) {
                  try {
                      mService.setRmssiFirstStage(rmssi);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
 
-    private View.OnClickListener mOnSetCFOMeanThListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetCFOMeanThListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int cf0 = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for CF0TH12 is: " + cf0);
@@ -613,46 +661,50 @@
               if(mService != null) {
                  try {
                      mService.setCFOMeanTh(cf0);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
 
-    private View.OnClickListener mOnSetSearchMPXDCCListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetSearchMPXDCCListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
-              Log.d(LOGTAG, "Value entered for search is: MPX DCC");
-              if(mService != null) {
-                 try {
-                     mService.setSearchAlgoType(MPX_DCC);
-                 } catch (RemoteException e) {
-                     e.printStackTrace();
-                 }
-              }
-       }
-    };
-    private View.OnClickListener mOnSetSearchSinrIntfListener = new View.OnClickListener() {
-       public void onClick(View v) {
-              Log.d(LOGTAG, "Value entered for search is: SINR INTF");
-              if(mService != null) {
-                 try {
-                     mService.setSearchAlgoType(SINR_INTF);
-                 } catch (RemoteException e) {
-                     e.printStackTrace();
-                 }
-              }
+          Log.d(LOGTAG, "Value entered for search is: MPX DCC");
+          if(mService != null) {
+             try {
+                  mService.setSearchAlgoType(MPX_DCC);
+             }catch (RemoteException e) {
+                  e.printStackTrace();
+             }
+          }
        }
     };
 
-    private View.OnClickListener mOnSetAfJmpRmssiThListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetSearchSinrIntfListener =
+    new View.OnClickListener() {
+       public void onClick(View v) {
+          Log.d(LOGTAG, "Value entered for search is: SINR INTF");
+          if(mService != null) {
+             try {
+                  mService.setSearchAlgoType(SINR_INTF);
+             }catch (RemoteException e) {
+                  e.printStackTrace();
+             }
+          }
+       }
+    };
+
+    private View.OnClickListener mOnSetAfJmpRmssiThListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int th = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for AfJmpRmssiTh is: " + th);
@@ -662,21 +714,22 @@
               if(mService != null) {
                  try {
                      mService.setAfJmpRmssiTh(th);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
 
-    private View.OnClickListener mOnSetGdChRmssiThListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetGdChRmssiThListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int th = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for Good channel Rmssi Th is: " + th);
@@ -686,21 +739,22 @@
               if(mService != null) {
                  try {
                      mService.setGoodChRmssiTh(th);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
        }
     };
 
-    private View.OnClickListener mOnSetAfJmpRmssiSmplsCntListener = new View.OnClickListener() {
+    private View.OnClickListener mOnSetAfJmpRmssiSmplsCntListener =
+    new View.OnClickListener() {
        public void onClick(View v) {
           String a;
-          a =  txtbox1.getText().toString();
+          a = txtbox1.getText().toString();
           try {
               int cnt = Integer.parseInt(a);
               Log.d(LOGTAG, "Value entered for AfJmpRmssiSamples is: " + cnt);
@@ -710,11 +764,11 @@
               if(mService != null) {
                  try {
                      mService.setAfJmpRmssiSamplesCnt(cnt);
-                 } catch (RemoteException e) {
+                 }catch (RemoteException e) {
                      e.printStackTrace();
                  }
               }
-          } catch (NumberFormatException e) {
+          }catch (NumberFormatException e) {
               Log.e(LOGTAG, "Value entered is not in correct format : " + a);
               txtbox1.setText("");
           }
@@ -722,61 +776,64 @@
     };
 
     public class CfgRfItemSelectedListener1 implements OnItemSelectedListener {
-        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+        public void onItemSelected(
+                     AdapterView<?> parent, View view, int pos, long id) {
             Log.d("Table","onItemSelected is hit with " + pos);
-            txtbox1 = (EditText) findViewById(R.id.txtbox1);
-            tv1 = (TextView) findViewById(R.id.label);
+            txtbox1 = (EditText)findViewById(R.id.txtbox1);
+            tv1 = (TextView)findViewById(R.id.label);
             Button SetButton = (Button)findViewById(R.id.Setbutton);
             tLayout.setVisibility(View.INVISIBLE);
             switch(pos)
             {
-                case 0:
-                    if (txtbox1 != null) {
+            case 0:
+                   if (txtbox1 != null) {
                        txtbox1.setText(R.string.type_rd);
                        txtbox1.setVisibility(View.VISIBLE);
-                    }
-                    if (tv1 != null) {
+                   }
+                   if (tv1 != null) {
                        tv1.setText(R.string.enter_rssi);
                        tv1.setVisibility(View.VISIBLE);
-                    }
-                    if (SetButton != null) {
+                   }
+                   if (SetButton != null) {
                        SetButton.setText(R.string.set_rmmsi_delta);
                        SetButton.setVisibility(View.VISIBLE);
                        SetButton.setOnClickListener(mOnSetRmssitListener);
-                    }
-                    break;
-                case 1:
-                    if (txtbox1 != null) {
+                   }
+                   break;
+            case 1:
+                   if (txtbox1 != null) {
                        txtbox1.setText(R.string.type_rd);
                        txtbox1.setVisibility(View.VISIBLE);
-                    }
-                    if (tv1 != null) {
+                   }
+                   if (tv1 != null) {
                        tv1.setText(R.string.enter_sigth);
                        tv1.setVisibility(View.VISIBLE);
-                    }
-                    if (SetButton != null) {
+                   }
+                   if (SetButton != null) {
                        SetButton.setText(R.string.set_sigth);
                        SetButton.setVisibility(View.VISIBLE);
                        SetButton.setOnClickListener(mOnSetSigThListener);
-                    }
-                    break;
-                case 2:
-                    tLayout.removeAllViewsInLayout();
-                    mNewRowIds = NEW_ROW_ID;
-                    tLayout.setVisibility(View.VISIBLE);
-                    if (txtbox1 != null) {
+                   }
+                   break;
+            case 2:
+                   tLayout.removeAllViewsInLayout();
+                   mNewRowIds = NEW_ROW_ID;
+                   tLayout.setVisibility(View.VISIBLE);
+                   if (txtbox1 != null) {
                        txtbox1.setVisibility(View.INVISIBLE);
-                    }
-                    if (tv1 != null) {
+                   }
+                   if (tv1 != null) {
                        tv1.setVisibility(View.INVISIBLE);
-                    }
-                    if (SetButton != null) {
+                   }
+                   if (SetButton != null) {
                        SetButton.setVisibility(View.INVISIBLE);
-                    }
-                    adaptRfCfg.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-                    spinOptionFmRf.setAdapter(adaptRfCfg);
-                    spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener);
-                    break;
+                   }
+                   adaptRfCfg.setDropDownViewResource(
+                              android.R.layout.simple_spinner_dropdown_item);
+                   spinOptionFmRf.setAdapter(adaptRfCfg);
+                   spinOptionFmRf.setOnItemSelectedListener(
+                                                 mSpinRfCfgListener);
+                   break;
             }
         }
 
@@ -786,7 +843,8 @@
     }
 
     public class CfgRfItemSelectedListener2 implements OnItemSelectedListener {
-        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+        public void onItemSelected(AdapterView<?> parent,
+                                    View view, int pos, long id) {
             Log.d("Table","onItemSelected is hit with " + pos);
             int ret = Integer.MAX_VALUE;
             txtbox1 = (EditText) findViewById(R.id.txtbox1);
@@ -1306,7 +1364,8 @@
                     if(button2 != null) {
                        button2.setVisibility(View.INVISIBLE);
                     }
-                    adaptRfCfg.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+                    adaptRfCfg.setDropDownViewResource(
+                              android.R.layout.simple_spinner_dropdown_item);
                     spinOptionFmRf.setAdapter(adaptRfCfg);
                     spinOptionFmRf.setOnItemSelectedListener(mSpinRfCfgListener);
                     break;
@@ -1324,6 +1383,12 @@
                         SetButton.setVisibility(View.VISIBLE);
                         SetButton.setOnClickListener(mOnSetRxRePeatCount);
                     }
+                    if(button1 != null) {
+                       button1.setVisibility(View.INVISIBLE);
+                    }
+                    if(button2 != null) {
+                       button2.setVisibility(View.INVISIBLE);
+                    }
                     break;
             }
         }
@@ -1333,7 +1398,8 @@
     }
 
     public class RfCfgItemSelectedListener implements OnItemSelectedListener {
-        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+        public void onItemSelected(AdapterView<?> parent,
+                                    View view, int pos, long id) {
             Log.d("Table","onItemSelected is hit with "+pos);
             tLayout.setVisibility(View.INVISIBLE);
             if (mTestRunning)
@@ -1354,6 +1420,11 @@
                        RunButton.setVisibility(View.VISIBLE);
                        RunButton.setOnClickListener(mOnRunListener);
                     }
+                    if(mTestSelected == SWEEP_TEST) {
+                       enableBandSweepSetting();
+                    }else {
+                       disableBandSweepSetting();
+                    }
                     break;
                 case 4:
                     RunButton = (Button)findViewById(R.id.Runbutton);
@@ -1364,12 +1435,14 @@
                     if (pbar != null) {
                        pbar.setVisibility(View.INVISIBLE);
                     }
-                    adaptCfgRf.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+                    adaptCfgRf.setDropDownViewResource(
+                                     android.R.layout.simple_spinner_dropdown_item);
                     spinOptionFmRf.setAdapter(adaptCfgRf);
                     if(isTransportLayerSMD())
                        spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener2);
                     else
                        spinOptionFmRf.setOnItemSelectedListener(mSpinCfgRfListener1);
+                    disableBandSweepSetting();
                     break;
             }
         }
@@ -1384,9 +1457,7 @@
             mTestSelected = pos;
             tLayout.setVisibility(View.INVISIBLE);
             chooseFMRFoption();
-
         }
-
         public void onNothingSelected(AdapterView<?> parent) {
             // Do Nothing
         }
@@ -1479,8 +1550,7 @@
         }
     }
 
-
-    private void runCurrentTest(){
+    private void runCurrentTest() {
         Log.d(LOGTAG, "The test being run is" +mTestSelected);
 
         //get test summary
@@ -1490,118 +1560,107 @@
         szbTestHeader.append("running test:").append(szTestInformation[mTestSelected]);
         szbTestHeader.append("\r\n");
         String szTestHeader = new String(szbTestHeader);
-        if(null != mFileCursor )
-        {
-            try {
+        if(null != mFileCursor ) {
+           try {
                 mFileCursor.write(szTestHeader.getBytes());
-            } catch (IOException ioe) {
+           } catch (IOException ioe) {
                 ioe.printStackTrace();
-            }
+           }
         }
-        switch(mTestSelected){
-            case CUR_FREQ_TEST:
-                Log.d(LOGTAG,"Current Freq test is going to run");
-                int freq = FmSharedPreferences.getTunedFrequency();
-                Result res = GetFMStatsForFreq(freq);
-                createResult(mColumnHeader);
-                if(res != null)
-                   createResult(res);
+        switch(mTestSelected)
+        {
+        case CUR_FREQ_TEST:
+             Log.d(LOGTAG,"Current Freq test is going to run");
+             int freq = FmSharedPreferences.getTunedFrequency();
+             Result res = GetFMStatsForFreq(freq);
+             createResult(mColumnHeader);
+             if(res != null)
+                createResult(res);
+              mTestRunning = false;
+              break;
+        case CUR_MULTI_TEST:
+             /*Set it to ready to Stop*/
+             SetButtonState(false);
+             createResult(mColumnHeader);
+
+             if(mMultiUpdateThread == null) {
+                mMultiUpdateThread = new Thread(null, getMultipleResults,
+                                                 "MultiResultsThread");
+             }
+             /* Launch dummy thread to simulate the transfer progress */
+             Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState());
+             if(mMultiUpdateThread.getState() == Thread.State.TERMINATED) {
+                mMultiUpdateThread = new Thread(null, getMultipleResults,
+                                                 "MultiResultsThread");
+             }
+             /* If the thread state is "new" then the thread has not yet started */
+             if(mMultiUpdateThread.getState() == Thread.State.NEW) {
+                mMultiUpdateThread.start();
+             }
+             // returns and UI in different thread.
+             break;
+        case SEARCH_TEST:
+             try {
+                 Log.d(LOGTAG, "start scanning\n");
+                 if(isTransportLayerSMD()) {
+                    Log.d(LOGTAG,"Scanning with 0 scan time");
+                    if (mReceiver != null)
+                        mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
+                                           SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
+                 }else {
+                    mIsSearching = mService.scan(0);
+                 }
+             }catch (RemoteException e) {
+                 e.printStackTrace();
+             }
+
+             if(mIsSearching) {
+                 /*Set it to Ready to Stop*/
+                 SetButtonState(false);
+                 createResult(mColumnHeader);
+                 Log.d(LOGTAG, "Created the results and cancel UI\n");
+             }else {
                  mTestRunning = false;
-                break;
-            case CUR_MULTI_TEST:
-                /*Set it to ready to Stop*/
-                SetButtonState(false);
-                createResult(mColumnHeader);
-
-                if (mMultiUpdateThread == null)
-                {
-                   mMultiUpdateThread = new Thread(null, getMultipleResults,
-                                                          "MultiResultsThread");
-                }
-                /* Launch dummy thread to simulate the transfer progress */
-                Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState());
-                if (mMultiUpdateThread.getState() == Thread.State.TERMINATED)
-                {
-                    mMultiUpdateThread = new Thread(null, getMultipleResults,
-                                                          "MultiResultsThread");
-                }
-                /* If the thread state is "new" then the thread has not yet started */
-                if (mMultiUpdateThread.getState() == Thread.State.NEW)
-                {
-                    mMultiUpdateThread.start();
-                }
-                // returns and UI in different thread.
-                break;
-            case SEARCH_TEST:
-                try {
-                    Log.d(LOGTAG, "start scanning\n");
-                    if(isTransportLayerSMD()) {
-                         Log.d(LOGTAG,"Scanning with 0 scan time");
-                         if (mReceiver != null)
-                              mIsSearching = mReceiver.searchStations(FmReceiver.FM_RX_SRCH_MODE_SCAN,
-                                             SCAN_DWELL_PERIOD, FmReceiver.FM_RX_SEARCHDIR_UP);
-                    } else {
-                        mIsSearching = mService.scan(0);
-                    }
-                } catch (RemoteException e) {
-
-                    e.printStackTrace();
-                }
-
-                if(mIsSearching)
-                {
-                    /*Set it to Ready to Stop*/
-                    SetButtonState(false);
-                    createResult(mColumnHeader);
-                    Log.d(LOGTAG, "Created the results and cancel UI\n");
-                }
-                else
-                {
-                    mTestRunning = false;
-                }
-                break;
-            case SWEEP_TEST:
-                int Spacing = FmSharedPreferences.getChSpacing();
-                int lowerFreq = FmSharedPreferences.getLowerLimit();
-                int higherFreq = FmSharedPreferences.getUpperLimit();
-                try {
-                    Log.d(LOGTAG, "Going to set low side injection\n");
-                    mService.setHiLoInj(Lo);
-                } catch (RemoteException e) {
-
-                    e.printStackTrace();
-                }
-                /* Set it to Ready to stop*/
-                SetButtonState(false);
-                createResult(mColumnHeader);
-                getFMStatsInBand(lowerFreq,higherFreq,Spacing);
-                break;
+             }
+             break;
+        case SWEEP_TEST:
+             int Spacing = FmSharedPreferences.getChSpacing();
+             int lowerFreq = FmSharedPreferences.getLowerLimit();
+             int higherFreq = FmSharedPreferences.getUpperLimit();
+             try {
+                 Log.d(LOGTAG, "Going to set low side injection\n");
+                 mService.setHiLoInj(Lo);
+             }catch (RemoteException e) {
+                 e.printStackTrace();
+             }
+             /* Set it to Ready to stop*/
+             SetButtonState(false);
+             createResult(mColumnHeader);
+             getFMStatsInBand(lowerFreq, higherFreq, Spacing);
+             break;
         }
     }
 
     /* Thread processing */
     private Runnable getMultipleResults = new Runnable() {
        public void run() {
-            /*Collect the data for the current frequency
-            20 times*/
-            int freq = FmSharedPreferences.getTunedFrequency();
+          /*Collect the data for the current frequency
+           20 times*/
+          int freq = FmSharedPreferences.getTunedFrequency();
 
-            for (int i = 0; i < 20; i++)
-            {
-                try
-                {
-                    Thread.sleep(500);
-                    Message updateUI = new Message();
-                    updateUI.what = STATUS_UPDATE;
-                    updateUI.obj = (Object)GetFMStatsForFreq(freq);
-                    if (updateUI.obj == null)
+          for(int i = 0; i < 20; i++) {
+              try {
+                   Thread.sleep(500);
+                   Message updateUI = new Message();
+                   updateUI.what = STATUS_UPDATE;
+                   updateUI.obj = (Object)GetFMStatsForFreq(freq);
+                   if(updateUI.obj == null)
                         break;
-                    mUIUpdateHandlerHandler.sendMessage(updateUI);
-		} catch (InterruptedException e)
-		{
-			/*break the loop*/
-			break;
-		}
+                   mUIUpdateHandlerHandler.sendMessage(updateUI);
+              }catch (InterruptedException e) {
+                   /*break the loop*/
+                   break;
+              }
             }
             mTestRunning = false;
             Message updateStop = new Message();
@@ -1610,93 +1669,168 @@
        }
     };
 
-    private void getFMStatsInBand(int lFreq, int hFreq, int Spacing)
-    {
-        if( null == mBand) {
-            mBand = new Band();
-        }
-        mBand.lFreq = lFreq;
-        mBand.hFreq = hFreq;
-        if(Spacing == 0)
-        {
-            mBand.Spacing = 200; // 200KHz
-        }
-        else if( Spacing == 1)
-        {
-            mBand.Spacing = 100; // 100KHz
-        }
-        else
-        {
-            mBand.Spacing = 50;
-        }
+    private void getFMStatsInBand(int lFreq, int hFreq, int Spacing) {
+       if(null == mBand) {
+          mBand = new Band();
+       }
+       mBand.lFreq = lFreq;
+       mBand.hFreq = hFreq;
+       if(Spacing == 0) {
+          mBand.Spacing = 200; // 200KHz
+       }else if(Spacing == 1) {
+          mBand.Spacing = 100; // 100KHz
+       }else {
+          mBand.Spacing = 50;
+       }
 
-        if (mMultiUpdateThread == null)
-        {
-           mMultiUpdateThread = new Thread(null, getSweepResults,
+       if(mMultiUpdateThread == null) {
+          if(prevSweepMthd == 0) {
+             mMultiUpdateThread = new Thread(null, getManualSweepResults,
+                                           "MultiResultsThread");
+          }else {
+             mMultiUpdateThread = new Thread(null, getFileSweepResults,
+                                           "MultiResultsThread");
+          }
+       }
+       /* Launch he dummy thread to simulate the transfer progress */
+       Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState());
+       if((mMultiUpdateThread.getState() == Thread.State.TERMINATED)) {
+          if(prevSweepMthd == 0) {
+             mMultiUpdateThread = new Thread(null, getManualSweepResults,
                                                   "MultiResultsThread");
-        }
-        /* Launch he dummy thread to simulate the transfer progress */
-        Log.d(LOGTAG, "Thread State: " + mMultiUpdateThread.getState());
-        if (mMultiUpdateThread.getState() == Thread.State.TERMINATED)
-        {
-            mMultiUpdateThread = new Thread(null, getSweepResults,
-                                                  "MultiResultsThread");
-        }
-        /* If the thread state is "new" then the thread has not yet started */
-        if (mMultiUpdateThread.getState() == Thread.State.NEW)
-        {
-            mMultiUpdateThread.start();
-        }
+          }else {
+             mMultiUpdateThread = new Thread(null, getFileSweepResults,
+                                           "MultiResultsThread");
+          }
+       }
+       /* If the thread state is "new" then the thread has not yet started */
+       if(mMultiUpdateThread.getState() == Thread.State.NEW) {
+          mMultiUpdateThread.start();
+       }
     }
 
     /* Thread processing */
-    private Runnable getSweepResults = new Runnable() {
+    private Runnable getManualSweepResults = new Runnable() {
        public void run() {
-            for (int i = mBand.lFreq; (i <= mBand.hFreq) && (mService != null);
-                                                            i += mBand.Spacing)
-            {
-                 try {
-                      if (!mService.tune(i)) {
-                          Log.e(LOGTAG, "tune failed");
-                          break;
-                      }
-                      mSync = new Band();
-                      synchronized(mSync) {
-                         mSync.wait(); //wait till notified
-                      }
-                      mSync = null;
-                      Message updateUI = new Message();
-                      updateUI.what = STATUS_UPDATE;
-                      updateUI.obj = (Object)GetFMStatsForFreq(i);
-                      if (updateUI.obj == null) {
-                          break;
-                      } else {
-                          mUIUpdateHandlerHandler.sendMessage(updateUI);
-                          Log.d(LOGTAG,"highFerq is "+mBand.hFreq);
-                      }
-                 }
-                 catch (RemoteException e) {
-		      Log.e(LOGTAG, "SweepResults:Tune failed\n");
-		 }
-
-                catch (InterruptedException e) {
-			/*Stop the thrad*/
-		       break;
-                }
-            }
-            mTestRunning = false;
-            Message updateStop = new Message();
-            updateStop.what = STATUS_DONE;
             try {
-                 Log.d(LOGTAG, "Going to set auto hi-lo injection\n");
-                 mService.setHiLoInj(Auto);
-            } catch (RemoteException e) {
-                 e.printStackTrace();
+                Thread.sleep(prevDelayTime * 1000);
+            }catch(InterruptedException e) {
             }
-            mUIUpdateHandlerHandler.sendMessage(updateStop);
+            for (int i = mBand.lFreq; (i <= mBand.hFreq) &&
+                                     (mService != null); i += mBand.Spacing) {
+                 if(!tuneAndUpdateSweepResult(i)) {
+                    break;
+                 }
+                 try {
+                     Thread.sleep(prevDwellTime * 1000);
+                 }catch (InterruptedException e) {
+                     /*Stop the thrad*/
+                     break;
+                 }
+            }
+            sendStatusDoneMsg();
        }
     };
 
+    private void sendStatusDoneMsg() {
+       mTestRunning = false;
+       Message updateStop = new Message();
+       updateStop.what = STATUS_DONE;
+       try {
+           Log.d(LOGTAG, "Going to set auto hi-lo injection\n");
+           mService.setHiLoInj(Auto);
+       } catch (RemoteException e) {
+           e.printStackTrace();
+       }
+       if(mUIUpdateHandlerHandler != null) {
+          Log.d(LOGTAG, "Sending message to stop test");
+          mUIUpdateHandlerHandler.sendMessage(updateStop);
+       }
+    }
+
+    private Runnable getFileSweepResults = new Runnable() {
+       public void run() {
+          boolean status = true;
+          try {
+               BufferedReader reader = new BufferedReader
+                               (new FileReader(getFilesDir()
+                                                + FREQ_LIST_FILE_NAME));
+               String curLine = null;
+               try {
+                    Thread.sleep(prevDelayTime * 1000);
+               }catch(InterruptedException e) {
+               }
+               while((reader != null) && (curLine = reader.readLine()) != null) {
+                     String[] freq_list = curLine.split(",");
+                     for(int i = 0; (freq_list != null ) &&
+                                      (i < freq_list.length); i++) {
+                         int freq =
+                             (int)(Double.parseDouble(freq_list[i]) * 1000);
+                         if(validFreq(freq)) {
+                            if(!tuneAndUpdateSweepResult(freq)) {
+                               status = false;
+                               break;
+                            }else {
+                               try {
+                                   Thread.sleep(prevDwellTime * 1000);
+                               }catch (InterruptedException e) {
+                                   /*Stop the thrad*/
+                                   status = false;
+                                   break;
+                               }
+                            }
+                         }
+                     }
+                     if(!status) {
+                        break;
+                     }
+               }
+               reader.close();
+          }catch(IOException e) {
+               e.printStackTrace();
+          }
+          sendStatusDoneMsg();
+       }
+    };
+
+    private boolean validFreq(int freq) {
+       if((freq >= mBand.lFreq) &&
+          (((freq - mBand.lFreq) / mBand.Spacing) >= 0)) {
+           return true;
+       }else {
+           return false;
+       }
+    }
+
+    private boolean tuneAndUpdateSweepResult(int freq) {
+       try {
+            if(!mService.tune(freq)) {
+               Log.e(LOGTAG, "tune failed");
+               return false;
+            }
+            mSync = new Band();
+            synchronized(mSync) {
+                mSync.wait(); //wait till notified
+            }
+            mSync = null;
+            Message updateUI = new Message();
+            updateUI.what = STATUS_UPDATE;
+            updateUI.obj = (Object)GetFMStatsForFreq(freq);
+            if(updateUI.obj == null) {
+               return false;
+            }else {
+               mUIUpdateHandlerHandler.sendMessage(updateUI);
+               Log.d(LOGTAG,"highFerq is " + mBand.hFreq);
+            }
+       }catch (RemoteException e) {
+            Log.e(LOGTAG, "SweepResults:Tune failed\n");
+            return false;
+       }catch (InterruptedException e) {
+            return false;
+       }
+       return true;
+    }
+
     private Result GetFMStatsForFreq(int freq)
     {
         Result result = new Result();
@@ -2015,4 +2149,90 @@
              mTestRunning = false;
          }
      }
+
+     @Override
+     protected Dialog onCreateDialog(int id) {
+         AlertDialog.Builder dlgBuilder = new AlertDialog.Builder(this);
+         switch(id)
+         {
+         case DIALOG_BAND_SWEEP_SETTING:
+              return createBandSweepDialog(id, dlgBuilder);
+         }
+         return null;
+     }
+
+     private Dialog createBandSweepDialog(int id, AlertDialog.Builder dlgBuilder) {
+         LayoutInflater inflater = LayoutInflater.from(this);
+         final View listview = inflater.inflate(R.layout.band_sweep_setting, null);
+         spinOptionBandSweepMthds = (Spinner)listview.findViewById(R.id.band_sweep_spinner);
+         final EditText delayBox = (EditText)listview.findViewById(R.id.txtboxDelayTime);
+         final EditText dwellBox = (EditText)listview.findViewById(R.id.txtboxDwellTime);
+
+         if(delayBox != null) {
+            delayBox.setText("" + prevDelayTime);
+         }
+         if(dwellBox != null) {
+            dwellBox.setText("" + prevDwellTime);
+         }
+         if(spinOptionBandSweepMthds != null) {
+            spinOptionBandSweepMthds.setAdapter(bandSweepMthds);
+            spinOptionBandSweepMthds.setOnItemSelectedListener(mSweepMthdsListener);
+            spinOptionBandSweepMthds.setSelection(prevSweepMthd);
+         }else {
+            Log.e(LOGTAG, "could not find spinner for methods\n");
+         }
+         dlgBuilder.setView(listview)
+                .setPositiveButton(R.string.band_sweep_setting_set, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        prevSweepMthd = curSweepMthd;
+                        if(delayBox != null) {
+                           String s = delayBox.getText().toString();
+                           prevDelayTime = Integer.parseInt(s);
+                        }
+                        if(dwellBox != null) {
+                           String s = dwellBox.getText().toString();
+                           prevDwellTime = Integer.parseInt(s);
+                        }
+                        removeDialog(DIALOG_BAND_SWEEP_SETTING);
+                    }
+                })
+                .setNegativeButton(R.string.band_sweep_setting_cancel, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        removeDialog(DIALOG_BAND_SWEEP_SETTING);
+                    }
+                });
+         return dlgBuilder.create();
+     }
+
+    private View.OnClickListener mClicktBandSweepSettingListener = new View.OnClickListener() {
+         public void onClick(View v) {
+            showDialog(DIALOG_BAND_SWEEP_SETTING);
+         }
+    };
+
+    private void enableBandSweepSetting() {
+         if(bandSweepSettingButton != null) {
+            bandSweepSettingButton.setEnabled(true);
+            bandSweepSettingButton.setVisibility(View.VISIBLE);
+         }
+    }
+
+    private void disableBandSweepSetting() {
+         if(bandSweepSettingButton != null) {
+            bandSweepSettingButton.setEnabled(false);
+            bandSweepSettingButton.setVisibility(View.INVISIBLE);
+         }
+    }
+
+    public class BandSweepMthdsSelectedListener implements OnItemSelectedListener {
+        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
+            Log.d("Band Sweep Methods","onItemSelected is hit with " + pos);
+            curSweepMthd = pos;
+        }
+
+        public void onNothingSelected(AdapterView<?> parent) {
+            // Do Nothing
+        }
+    }
+
  }
diff --git a/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java b/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
index a4b2dbf..d44f06c 100644
--- a/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
+++ b/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
@@ -78,6 +78,7 @@
    public static final int REGIONAL_BAND_TURKEY          = 33;
    public static final int REGIONAL_BAND_UNITEDKINGDOM   = 34;
    public static final int REGIONAL_BAND_UNITED_STATES   = 35;
+   public static final int REGIONAL_BAND_USER_DEFINED    = 36;
 
    public static final int RECORD_DUR_INDEX_0_VAL        = 5;
    public static final int RECORD_DUR_INDEX_1_VAL       = 15;
@@ -98,9 +99,9 @@
 
    private static final String FMCONFIG_COUNTRY = "fmconfig_country";
    //private static final String FMCONFIG_BAND = "fmconfig_band";
-   //private static final String FMCONFIG_MIN = "fmconfig_min";
-   //private static final String FMCONFIG_MAX = "fmconfig_max";
-   //private static final String FMCONFIG_STEP = "fmconfig_step";
+   private static final String FMCONFIG_MIN = "fmconfig_min";
+   private static final String FMCONFIG_MAX = "fmconfig_max";
+   private static final String FMCONFIG_STEP = "fmconfig_step";
    //private static final String FMCONFIG_EMPH = "fmconfig_emphasis";
    //private static final String FMCONFIG_RDSSTD = "fmconfig_rdsstd";
    /* Storage key String */
@@ -153,6 +154,9 @@
    private static int mListIndex;
    private Context mContext;
    private static int mTunedFrequency = 98100;
+   private static int mBandMinFreq = 76000;
+   private static int mBandMaxFreq = 108000;
+   private static int mChanSpacing = 0;
    private static int mFrequencyBand_Stepsize = 200;
 
    private static int mCountry = 0;
@@ -449,6 +453,12 @@
      /* Reset the Lists before reading the preferences */
       mListOfPlists.clear();
 
+      if(sp.getInt(FMCONFIG_COUNTRY, 0) == REGIONAL_BAND_USER_DEFINED) {
+         mBandMinFreq = sp.getInt(FMCONFIG_MIN, mBandMinFreq);
+         mBandMaxFreq = sp.getInt(FMCONFIG_MAX, mBandMaxFreq);
+         mChanSpacing = sp.getInt(FMCONFIG_STEP, mChanSpacing);
+      }
+
       int num_lists = sp.getInt(LIST_NUM, 1);
       if (mListOfPlists.size() == 0) {
 
@@ -542,6 +552,11 @@
 
       /* Save Configuration */
       ed.putInt(FMCONFIG_COUNTRY, mCountry);
+      if(mCountry == REGIONAL_BAND_USER_DEFINED) {
+         ed.putInt(FMCONFIG_MIN, mBandMinFreq);
+         ed.putInt(FMCONFIG_MAX, mBandMaxFreq);
+         ed.putInt(FMCONFIG_STEP, mChanSpacing);
+      }
       ed.putInt(LAST_RECORD_DURATION, mRecordDuration);
       ed.putBoolean(LAST_AF_JUMP_VALUE, mAFAutoSwitch);
       ed.commit();
@@ -683,8 +698,8 @@
 
    public static void setChSpacing(int spacing)
    {
-      if((spacing>=FmReceiver.FM_CHSPACE_200_KHZ)
-          && (spacing<=FmReceiver.FM_CHSPACE_50_KHZ))
+      if( (spacing >= FmReceiver.FM_CHSPACE_200_KHZ)
+          && (spacing <= FmReceiver.FM_CHSPACE_50_KHZ))
       {
          mFrequencyBand_Stepsize = 200;
          switch (spacing)
@@ -700,6 +715,7 @@
                break;
             }
          }
+         mChanSpacing = spacing;
          mFMConfiguration.setChSpacing(spacing);
       }
    }
@@ -762,10 +778,16 @@
    }
    public static void setLowerLimit(int lowLimit){
       mFMConfiguration.setLowerLimit(lowLimit);
+      if(mCountry == REGIONAL_BAND_USER_DEFINED) {
+         mBandMinFreq = lowLimit;
+      }
    }
 
    public static void setUpperLimit(int upLimit){
       mFMConfiguration.setUpperLimit(upLimit);
+      if(mCountry == REGIONAL_BAND_USER_DEFINED) {
+         mBandMaxFreq = upLimit;
+      }
    }
 
    public static void setCountry(int nCountryCode){
@@ -1051,6 +1073,23 @@
           mFrequencyBand_Stepsize = 200;
           break;
         }
+        case REGIONAL_BAND_USER_DEFINED:
+        {
+          mFMConfiguration.setRadioBand(FmReceiver.FM_USER_DEFINED_BAND);
+          mFMConfiguration.setChSpacing(mChanSpacing);
+          mFMConfiguration.setEmphasis(FmReceiver.FM_DE_EMP75);
+          mFMConfiguration.setRdsStd(FmReceiver.FM_RDS_STD_RDS);
+          mFMConfiguration.setLowerLimit(mBandMinFreq);
+          mFMConfiguration.setUpperLimit(mBandMaxFreq);
+          if(mChanSpacing == 0) {
+             mFrequencyBand_Stepsize = 200;
+          }else if(mChanSpacing == 1) {
+             mFrequencyBand_Stepsize = 100;
+          }else {
+             mFrequencyBand_Stepsize = 50;
+          }
+          break;
+        }
         default:
         {
           Log.d(LOGTAG, "Invalid: countryCode: "+nCountryCode);
diff --git a/fmapp2/src/com/caf/fmradio/Settings.java b/fmapp2/src/com/caf/fmradio/Settings.java
index f5c5d07..c5683f1 100644
--- a/fmapp2/src/com/caf/fmradio/Settings.java
+++ b/fmapp2/src/com/caf/fmradio/Settings.java
@@ -42,6 +42,9 @@
 import android.preference.PreferenceCategory;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.EditTextPreference;
+import android.text.InputType;
+import android.widget.Toast;
 import java.util.Locale;
 
 import android.util.Log;
@@ -55,19 +58,34 @@
         public static final String AUTO_AF = "af_checkbox_preference";
         public static final String RESTORE_FACTORY_DEFAULT = "revert_to_fac";
         public static final int RESTORE_FACTORY_DEFAULT_INT = 1;
+        public static final String USER_DEFINED_BAND_MIN_KEY = "user_defined_band_min";
+        public static final String USER_DEFINED_BAND_MAX_KEY = "user_defined_band_max";
+        public static final String CHAN_SPACING_KEY = "chanl_spacing";
         public static final String RESTORE_FACTORY_DEFAULT_ACTION = "com.caf.fmradio.settings.revert_to_defaults";
 
         private static final String LOGTAG = FMRadio.LOGTAG;
+        private static final String USR_BAND_MSG = "Enter Freq from range 76.0 - 108.0";
 
         private ListPreference mBandPreference;
         private ListPreference mAudioPreference;
         private ListPreference mRecordDurPreference;
         private CheckBoxPreference mAfPref;
+        private EditTextPreference mUserBandMinPref;
+        private EditTextPreference mUserBandMaxPref;
+        private ListPreference mChannelSpacingPref;
         private Preference mRestoreDefaultPreference;
 
         private FmSharedPreferences mPrefs = null;
         private boolean mRxMode = false;
 
+        private int min_freq;
+        private int max_freq;
+        private int chan_spacing;
+        private String[] summaryBandItems;
+        private String[] chSpacingItems;
+        private String[] summaryAudioModeItems;
+        private String[] summaryRecordItems;
+
         @Override
         protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
@@ -90,62 +108,87 @@
           PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
                                 this);
 
-          // Band/Country
-          String[] summaryBandItems = getResources().getStringArray(
+           summaryBandItems = getResources().getStringArray(
                                 R.array.regional_band_summary);
-          mBandPreference = new ListPreference(this);
-          mBandPreference.setEntries(R.array.regional_band_entries);
-          mBandPreference.setEntryValues(R.array.regional_band_values);
-          mBandPreference.setDialogTitle(R.string.sel_band_menu);
-          mBandPreference.setKey(REGIONAL_BAND_KEY);
-          mBandPreference.setTitle(R.string.regional_band);
-          index = FmSharedPreferences.getCountry();
-          Log.d(LOGTAG, "createPreferenceHierarchy: Country: " + index);
-          // Get the preference and list the value.
-          if ((index < 0) || (index >= summaryBandItems.length)) {
+           chSpacingItems = getResources().getStringArray(
+                                R.array.channel_spacing_entries);
+           mBandPreference = new ListPreference(this);
+           mBandPreference.setEntries(R.array.regional_band_entries);
+           mBandPreference.setEntryValues(R.array.regional_band_values);
+           mBandPreference.setDialogTitle(R.string.sel_band_menu);
+           mBandPreference.setKey(REGIONAL_BAND_KEY);
+           mBandPreference.setTitle(R.string.regional_band);
+           index = FmSharedPreferences.getCountry();
+           Log.d(LOGTAG, "createPreferenceHierarchy: Country: " + index);
+           // Get the preference and list the value.
+           if ((index < 0) || (index >= summaryBandItems.length)) {
                 index = 0;
-          }
-          Log.d(LOGTAG, "createPreferenceHierarchy: CountrySummary: "
-                               + summaryBandItems[index]);
-          mBandPreference.setSummary(summaryBandItems[index]);
-          mBandPreference.setValueIndex(index);
-          root.addPreference(mBandPreference);
+           }
+           mBandPreference.setValueIndex(index);
+           root.addPreference(mBandPreference);
 
-          if (mRxMode) {
-             // Audio Output (Stereo or Mono)
-             String[] summaryAudioModeItems = getResources().getStringArray(
-                                  R.array.ster_mon_entries);
-             mAudioPreference = new ListPreference(this);
-             mAudioPreference.setEntries(R.array.ster_mon_entries);
-             mAudioPreference.setEntryValues(R.array.ster_mon_values);
-             mAudioPreference.setDialogTitle(R.string.sel_audio_output);
-             mAudioPreference.setKey(AUDIO_OUTPUT_KEY);
-             mAudioPreference.setTitle(R.string.aud_output_mode);
-             boolean audiomode = FmSharedPreferences.getAudioOutputMode();
-             if (audiomode) {
-                 index = 0;
-             }else {
-                 index = 1;
-             }
-             Log.d(LOGTAG, "createPreferenceHierarchy: audiomode: " + audiomode);
-             mAudioPreference.setSummary(summaryAudioModeItems[index]);
-             mAudioPreference.setValueIndex(index);
-             root.addPreference(mAudioPreference);
+           mChannelSpacingPref = new ListPreference(this);
+           mChannelSpacingPref.setEntries(R.array.channel_spacing_entries);
+           mChannelSpacingPref.setEntryValues(R.array.channel_spacing_val);
+           mChannelSpacingPref.setDialogTitle(R.string.sel_chanl_spacing);
+           mChannelSpacingPref.setTitle(R.string.chanl_spacing);
+           mChannelSpacingPref.setKey(CHAN_SPACING_KEY);
 
-             // AF Auto Enable (Checkbox)
-             mAfPref = new CheckBoxPreference(this);
-             mAfPref.setKey(AUTO_AF);
-             mAfPref.setTitle(R.string.auto_select_af);
-             mAfPref.setSummaryOn(R.string.auto_select_af_enabled);
-             mAfPref.setSummaryOff(R.string.auto_select_af_disabled);
-             boolean bAFAutoSwitch = FmSharedPreferences.getAutoAFSwitch();
-             Log.d(LOGTAG, "createPreferenceHierarchy: bAFAutoSwitch: "
-                                   + bAFAutoSwitch);
-             mAfPref.setChecked(bAFAutoSwitch);
-             root.addPreference(mAfPref);
+           mUserBandMinPref = new EditTextPreference(this);
+           mUserBandMinPref.setKey(USER_DEFINED_BAND_MIN_KEY);
+           mUserBandMinPref.setTitle(R.string.usr_def_band_min);
+           mUserBandMinPref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
+                                                        InputType.TYPE_NUMBER_FLAG_DECIMAL);
+           mUserBandMinPref.setDialogTitle(R.string.usr_def_band_min);
+
+           mUserBandMaxPref = new EditTextPreference(this);
+           mUserBandMaxPref.setKey(USER_DEFINED_BAND_MAX_KEY);
+           mUserBandMaxPref.setTitle(R.string.usr_def_band_max);
+           mUserBandMaxPref.setDialogTitle(R.string.usr_def_band_max);
+           mUserBandMaxPref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
+                                                        InputType.TYPE_NUMBER_FLAG_DECIMAL);
+
+           setBandSummary(index);
+
+           root.addPreference(mChannelSpacingPref);
+           root.addPreference(mUserBandMinPref);
+           root.addPreference(mUserBandMaxPref);
+
+           if (mRxMode) {
+               // Audio Output (Stereo or Mono)
+               summaryAudioModeItems = getResources().getStringArray(
+                                        R.array.ster_mon_entries);
+               mAudioPreference = new ListPreference(this);
+               mAudioPreference.setEntries(R.array.ster_mon_entries);
+               mAudioPreference.setEntryValues(R.array.ster_mon_values);
+               mAudioPreference.setDialogTitle(R.string.sel_audio_output);
+               mAudioPreference.setKey(AUDIO_OUTPUT_KEY);
+               mAudioPreference.setTitle(R.string.aud_output_mode);
+               boolean audiomode = FmSharedPreferences.getAudioOutputMode();
+               if (audiomode) {
+                   index = 0;
+               } else {
+                   index = 1;
+               }
+               Log.d(LOGTAG, "createPreferenceHierarchy: audiomode: " + audiomode);
+               mAudioPreference.setSummary(summaryAudioModeItems[index]);
+               mAudioPreference.setValueIndex(index);
+               root.addPreference(mAudioPreference);
+
+               // AF Auto Enable (Checkbox)
+               mAfPref = new CheckBoxPreference(this);
+               mAfPref.setKey(AUTO_AF);
+               mAfPref.setTitle(R.string.auto_select_af);
+               mAfPref.setSummaryOn(R.string.auto_select_af_enabled);
+               mAfPref.setSummaryOff(R.string.auto_select_af_disabled);
+               boolean bAFAutoSwitch = FmSharedPreferences.getAutoAFSwitch();
+               Log.d(LOGTAG, "createPreferenceHierarchy: bAFAutoSwitch: "
+                              + bAFAutoSwitch);
+               mAfPref.setChecked(bAFAutoSwitch);
+               root.addPreference(mAfPref);
 
              if(FMRadio.RECORDING_ENABLE) {
-                String[] summaryRecordItems = getResources().getStringArray(
+                  summaryRecordItems = getResources().getStringArray(
                    R.array.record_durations_entries);
                 int nRecordDuration = 0;
                 mRecordDurPreference = new ListPreference(this);
@@ -197,40 +240,92 @@
           root.addPreference(mRestoreDefaultPreference);
           return root;
         }
-	public void clearStationList() {
+
+        public void clearStationList() {
           SharedPreferences sp = getSharedPreferences(FMRadio.SCAN_STATION_PREFS_NAME, 0);
           SharedPreferences.Editor editor = sp.edit();
           editor.clear();
           editor.commit();
         }
+
         public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                         String key) {
           int mTunedFreq = 0;
           boolean bStatus = false;
           if (key.equals(REGIONAL_BAND_KEY)) {
-	      int curListIndex = FmSharedPreferences.getCurrentListIndex();
-	      PresetList curList = FmSharedPreferences.getStationList(curListIndex);
-              String[] summaryBandItems = getResources().getStringArray(
-                                       R.array.regional_band_summary);
+              int curListIndex = FmSharedPreferences.getCurrentListIndex();
+              PresetList curList = FmSharedPreferences.getStationList(curListIndex);
               String valueStr = sharedPreferences.getString(key, "");
               int index = 0;
-              if (valueStr != null) {
+              if(valueStr != null) {
                   index = mBandPreference.findIndexOfValue(valueStr);
               }
-              if ((index < 0) || (index >= summaryBandItems.length)) {
+              if((index < 0) || (index >= summaryBandItems.length)) {
                   index = 0;
                   mBandPreference.setValueIndex(0);
+              }else if((index + 1) == summaryBandItems.length) {
+                   mChannelSpacingPref.setEnabled(true);
+              }else {
+                   mChannelSpacingPref.setEnabled(false);
               }
               Log.d(LOGTAG, "onSharedPreferenceChanged: Country Change: "
                                                         + index);
-              mBandPreference.setSummary(summaryBandItems[index]);
               FmSharedPreferences.setCountry(index);
+              setBandSummary(index);
               bStatus = FMRadio.fmConfigure();
               FMTransmitterActivity.fmConfigure();
               if (curList != null) {
                   curList.clear();
               }
               clearStationList();
+           }else if(key.equals(CHAN_SPACING_KEY)) {
+               int curListIndex = FmSharedPreferences.getCurrentListIndex();
+               PresetList curList = FmSharedPreferences.getStationList(curListIndex);
+               String valStr = mChannelSpacingPref.getValue();
+               int index = 0;
+               if(valStr != null) {
+                  index  = mChannelSpacingPref.findIndexOfValue(valStr);
+               }
+               if ((index < 0) || (index >= summaryRecordItems.length)) {
+                   index = 0;
+                   mChannelSpacingPref.setValueIndex(0);
+               }
+               mChannelSpacingPref.setSummary(chSpacingItems[index]);
+               FmSharedPreferences.setChSpacing(2 - index);
+               FMRadio.fmConfigure();
+               FMTransmitterActivity.fmConfigure();
+               if(curList != null) {
+                  curList.clear();
+               }
+               clearStationList();
+           }else if(key.equals(USER_DEFINED_BAND_MIN_KEY)) {
+               String valStr = mUserBandMinPref.getText();
+               double freq = Double.parseDouble(valStr) * 1000;
+               max_freq = FmSharedPreferences.getUpperLimit();
+               min_freq = FmSharedPreferences.getLowerLimit();
+               if((freq > 0) && (freq < max_freq) && (freq >= 76000)) {
+                  FmSharedPreferences.setLowerLimit((int)freq);
+                  FMRadio.fmConfigure();
+                  FMTransmitterActivity.fmConfigure();
+                  setBandSummary(summaryBandItems.length - 1);
+                  clearStationList();
+               }else {
+                  displayToast(USR_BAND_MSG);
+               }
+           }else if(key.equals(USER_DEFINED_BAND_MAX_KEY)) {
+               String valStr = mUserBandMaxPref.getText();
+               double freq = Double.parseDouble(valStr) * 1000;
+               min_freq = FmSharedPreferences.getLowerLimit();
+               max_freq = FmSharedPreferences.getUpperLimit();
+               if((freq > 0) && (freq > min_freq) && (freq <= 108000)) {
+                  FmSharedPreferences.setUpperLimit((int)freq);
+                  FMRadio.fmConfigure();
+                  FMTransmitterActivity.fmConfigure();
+                  setBandSummary(summaryBandItems.length - 1);
+                  clearStationList();
+               }else {
+                  displayToast(USR_BAND_MSG);
+               }
           }else {
               if(mRxMode) {
                  if (key.equals(AUTO_AF)) {
@@ -242,40 +337,36 @@
                      mPrefs.Save();
                  }else if(key.equals(RECORD_DURATION_KEY)) {
                      if(FMRadio.RECORDING_ENABLE) {
-                        String[] recordItems = getResources().getStringArray(
-                                                    R.array.record_durations_entries);
                         String valueStr = mRecordDurPreference.getValue();
                         int index = 0;
                         if (valueStr != null) {
                             index = mRecordDurPreference.findIndexOfValue(valueStr);
                         }
-                        if ((index < 0) || (index >= recordItems.length)) {
+                          if ((index < 0) || (index >= summaryRecordItems.length)) {
                              index = 0;
                              mRecordDurPreference.setValueIndex(index);
                         }
                         Log.d(LOGTAG, "onSharedPreferenceChanged: recorddur: "
-                                                 + recordItems[index]);
-                        mRecordDurPreference.setSummary(recordItems[index]);
-                        FmSharedPreferences.setRecordDuration(index);
-                     }
-                 }else if (key.equals(AUDIO_OUTPUT_KEY)) {
-                     String[] bandItems = getResources().getStringArray(
-                                                R.array.ster_mon_entries);
-                     String valueStr = mAudioPreference.getValue();
-                     int index = 0;
-                     if (valueStr != null) {
-                         index = mAudioPreference.findIndexOfValue(valueStr);
-                     }
-                     if (index != 1) {
-                         if (index != 0) {
-                             index = 0;
-                             /* It shud be 0(Stereo) or 1(Mono) */
-                             mAudioPreference.setValueIndex(index);
-                         }
-                     }
-                     Log.d(LOGTAG, "onSharedPreferenceChanged: audiomode: "
-                                              + bandItems[index]);
-                     mAudioPreference.setSummary(bandItems[index]);
+                                     + summaryRecordItems[index]);
+                          mRecordDurPreference.setSummary(summaryRecordItems[index]);
+                          FmSharedPreferences.setRecordDuration(index);
+                       }
+                   } else if (key.equals(AUDIO_OUTPUT_KEY)) {
+                       String valueStr = mAudioPreference.getValue();
+                       int index = 0;
+                       if (valueStr != null) {
+                           index = mAudioPreference.findIndexOfValue(valueStr);
+                       }
+                       if (index != 1) {
+                          if (index != 0) {
+                              index = 0;
+                              /* It shud be 0(Stereo) or 1(Mono) */
+                              mAudioPreference.setValueIndex(index);
+                          }
+                       }
+                       Log.d(LOGTAG, "onSharedPreferenceChanged: audiomode: "
+                                      + summaryAudioModeItems[index]);
+                       mAudioPreference.setSummary(summaryAudioModeItems[index]);
                      if (index == 0) {
                          // Stereo
                          FmSharedPreferences.setAudioOutputMode(true);
@@ -394,4 +485,32 @@
               sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
           }
         }
+        private void setBandSummary(int index) {
+           if((index + 1) == summaryBandItems.length) {
+              min_freq = FmSharedPreferences.getLowerLimit();
+              max_freq = FmSharedPreferences.getUpperLimit();
+              chan_spacing = FmSharedPreferences.getChSpacing();
+              if(chan_spacing < 0) {
+                 chan_spacing = 0;
+              }
+              mBandPreference.setSummary(summaryBandItems[index] + "( "
+                       + (min_freq / 1000.0) +"Mhz To " + (max_freq / 1000.0) +
+                       "Mhz)");
+              mChannelSpacingPref.setValueIndex(2 - chan_spacing);
+              mChannelSpacingPref.setSummary(chSpacingItems[2 - chan_spacing]);
+              mChannelSpacingPref.setEnabled(true);
+              mUserBandMinPref.setEnabled(true);
+              mUserBandMaxPref.setEnabled(true);
+              mUserBandMinPref.setSummary((min_freq / 1000.0) + "Mhz");
+              mUserBandMaxPref.setSummary((max_freq / 1000.0) + "Mhz");
+           }else {
+              mBandPreference.setSummary(summaryBandItems[index]);
+              mChannelSpacingPref.setEnabled(false);
+              mUserBandMinPref.setEnabled(false);
+              mUserBandMaxPref.setEnabled(false);
+           }
+        }
+        private void displayToast(String msg) {
+           Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
+        }
 }
