diff --git a/fmapp/src/com/codeaurora/fmradio/FMRadioService.java b/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
index 1bc25b2..c53efbb 100644
--- a/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
+++ b/fmapp/src/com/codeaurora/fmradio/FMRadioService.java
@@ -656,8 +656,6 @@
       mServiceInUse = true;
       /* Application/UI is attached, so get out of lower power mode */
       setLowPowerMode(false);
-      if((mPlaybackInProgress == false) && isWiredHeadsetAvailable())
-         startFM();
       Log.d(LOGTAG, "onRebind");
    }
 
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 335ce4f..9b130ff 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -188,8 +188,8 @@
    public static final String STATION_NAME = "name_of_station";
    public static final String STATION_FREQUENCY = "frequency_of_station";
 
-   private static IFMRadioService mService = null;
-   private static FmSharedPreferences mPrefs;
+   private IFMRadioService mService = null;
+   private FmSharedPreferences mPrefs;
 
    /* Button Resources */
    private ImageView mOnOffButton;
@@ -242,11 +242,11 @@
    private ScrollerText mRadioTextScroller = null;
    private ScrollerText mERadioTextScroller = null;
 
-   private static PresetStation mTunedStation = new PresetStation("", 102100);
+   private PresetStation mTunedStation = new PresetStation("", 102100);
    private PresetStation mPresetButtonStation = null;
 
    /* Radio Vars */
-   final Handler mHandler = new Handler();
+   private Handler mHandler = new Handler();
    /* Search Progress Dialog */
    private ProgressDialog mProgressDialog = null;
 
@@ -273,6 +273,8 @@
    /** fm stats property string */
    public static final String FM_STATS_PROP = "persist.fm.stats";
 
+   private BroadcastReceiver mFmSettingReceiver = null;
+
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -397,6 +399,7 @@
          } else {
              Log.d(LOGTAG, "onCreate: Start Service completed successfully");
          }
+         registerFMSettingListner();
       }
    }
 
@@ -507,6 +510,16 @@
               initiateRecordThread();
           }
       }
+      mPrefs.Load();
+      if (mPicker != null) {
+          setDisplayvalue();
+      }
+      PresetStation station = new PresetStation("",
+                                   FmSharedPreferences.getTunedFrequency());
+      if (station != null) {
+          mTunedStation.Copy(station);
+      }
+
    }
 
    @Override
@@ -523,15 +536,6 @@
    public void onResume() {
       super.onResume();
       Log.d(LOGTAG, "FMRadio: onResume");
-      mPrefs.Load();
-      if (mPicker != null) {
-          setDisplayvalue();
-      }
-      PresetStation station = new PresetStation("",
-                                   FmSharedPreferences.getTunedFrequency());
-      if (station != null) {
-          mTunedStation.Copy(station);
-      }
       mStereo = FmSharedPreferences.getLastAudioMode();
       mHandler.post(mUpdateProgramService);
       mHandler.post(mUpdateRadioText);
@@ -540,13 +544,13 @@
       updateStationInfoToUI();
       enableRadioOnOffUI();
    }
-   private class LoadedDataAndState {
+   private static class LoadedDataAndState {
       public LoadedDataAndState(){};
       public boolean onOrOff;
    }
    @Override
    public Object onRetainNonConfigurationInstance() {
-      final LoadedDataAndState data = new LoadedDataAndState();
+      LoadedDataAndState data = new LoadedDataAndState();
       if (mService != null) {
          try {
               data.onOrOff = mService.isFmOn();
@@ -562,8 +566,18 @@
 
    @Override
    public void onDestroy() {
+      super.onDestroy();
       Log.d(LOGTAG, "FMRadio: onDestroy");
+      mHandler.removeCallbacksAndMessages(null);
       cleanupTimeoutHandler();
+      if(mProgressDialog != null) {
+         mProgressDialog.dismiss();
+      }
+      if(mSearchProgressHandler != null) {
+         mSearchProgressHandler.removeCallbacksAndMessages(null);
+      }
+      removeDialog(DIALOG_PRESET_OPTIONS);
+      unRegisterReceiver(mFmSettingReceiver);
       if (mService != null) {
           try {
                if(!mService.isFmOn()) {
@@ -576,7 +590,6 @@
       unbindFromService(this);
       mService = null;
       Log.d(LOGTAG, "onDestroy: unbindFromService completed");
-      super.onDestroy();
    }
 
    @Override
@@ -790,7 +803,7 @@
                mUIUpdateHandlerHandler.sendMessage(statusUpdate);
             } catch (InterruptedException e)
             {
-               Thread.currentThread().interrupt();
+               break;
             }
             if(!isRecording()) {
                Message finished = new Message();
@@ -1469,7 +1482,7 @@
       }
    };
 
-   final FrequencyPickerDialog.OnFrequencySetListener mFrequencyChangeListener
+   FrequencyPickerDialog.OnFrequencySetListener mFrequencyChangeListener
       = new FrequencyPickerDialog.OnFrequencySetListener() {
         public void onFrequencySet(FrequencyPicker view, int frequency) {
            Log.d(LOGTAG, "mFrequencyChangeListener: onFrequencyChanged to: " +
@@ -1687,7 +1700,7 @@
       editor.clear();
       editor.commit();
    }
-   public static boolean fmConfigure() {
+   public boolean fmConfigure() {
       boolean bStatus = true;
       if(mService != null) {
          try {
@@ -1703,7 +1716,7 @@
       }
       return bStatus;
    }
-   public static void fmAutoAFSwitch() {
+   public void fmAutoAFSwitch() {
       boolean bStatus = false;
       if (mService != null) {
          try {
@@ -1718,7 +1731,7 @@
       }
    }
 
-   public static void fmAudioOutputMode() {
+   public void fmAudioOutputMode() {
       boolean bStatus = false;
       if (mService != null) {
          try {
@@ -2109,7 +2122,7 @@
       return(mIsSearching);
    }
 
-   public static PresetStation getCurrentTunedStation() {
+   public PresetStation getCurrentTunedStation() {
       return mTunedStation;
    }
 
@@ -2398,8 +2411,8 @@
                 sleepTimerExpired = hasSleepTimerExpired();
             }catch (Exception ex) {
                 Log.d( LOGTAG, "RunningThread InterruptedException");
-                Thread.currentThread().interrupt();
-            }//try
+                break;
+            }
          }
          if(true == sleepTimerExpired) {
              Message finished = new Message();
@@ -2527,7 +2540,7 @@
       updateStationInfoToUI();
    }
 
-   final Runnable mRadioEnabled = new Runnable() {
+   Runnable mRadioEnabled = new Runnable() {
       public void run() {
          /* Update UI to FM On State */
          enableRadioOnOffUI(true);
@@ -2537,7 +2550,7 @@
       }
    };
 
-   final Runnable mRadioDisabled = new Runnable() {
+   Runnable mRadioDisabled = new Runnable() {
       public void run() {
          /* Update UI to FM Off State */
          cleanupTimeoutHandler();
@@ -2547,14 +2560,15 @@
          enableRadioOnOffUI(false);
       }
    };
-   final Runnable mRadioReset = new Runnable() {
+
+    Runnable mRadioReset = new Runnable() {
       public void run() {
          /* Update UI to FM Reset (Off) State */
          resetRadio();
       }
    };
 
-   final Runnable mUpdateStationInfo = new Runnable() {
+   Runnable mUpdateStationInfo = new Runnable() {
       public void run() {
          cleanupTimeoutHandler();
          PresetStation station = new PresetStation("", FmSharedPreferences.getTunedFrequency());
@@ -2566,7 +2580,7 @@
       }
    };
 
-   final Runnable mSearchComplete = new Runnable() {
+   Runnable mSearchComplete = new Runnable() {
       public void run() {
          Log.d(LOGTAG, "mSearchComplete: ");
          mScanPty=0;
@@ -2579,13 +2593,13 @@
       }
    };
 
-   final Runnable mOnMute = new Runnable() {
+   Runnable mOnMute = new Runnable() {
       public void run() {
          setMuteModeButtonImage(true);
       }
    };
 
-   final Runnable mOnStereo = new Runnable() {
+   Runnable mOnStereo = new Runnable() {
       public void run() {
          if (FMRADIO_UI_STATION_AUDIO_STEREO == mStereo) {
              mStereoTV.setText(R.string.audio_type_stereo);
@@ -2598,7 +2612,7 @@
       }
    };
 
-   final Runnable mUpdateRadioText = new Runnable() {
+   Runnable mUpdateRadioText = new Runnable() {
       public void run() {
          String str = "";
          if ((mService != null) && isFmOn()) {
@@ -2639,14 +2653,14 @@
       }
    };
 
-   final Runnable mRadioChangeFrequency = new Runnable(){
+   Runnable mRadioChangeFrequency = new Runnable(){
        public void run() {
            mUpdatePickerValue = false;
            tuneRadio(mFrequency);
        }
    };
 
-   final Runnable mUpdateExtenRadioText = new Runnable() {
+   Runnable mUpdateExtenRadioText = new Runnable() {
       public void run() {
          String str = "";
          if ((mService != null) && isFmOn()) {
@@ -2669,7 +2683,7 @@
    };
 
    /* Create runnable for posting */
-   final Runnable mUpdateProgramService = new Runnable() {
+   Runnable mUpdateProgramService = new Runnable() {
       public void run() {
          String str = "";
          if (mService != null) {
@@ -2720,7 +2734,7 @@
     * When the entire text is scrolled, the scrolling will restart
     * after SCROLLER_RESTART_DELAY_MS
     */
-   private static final class ScrollerText extends Handler {
+   private final class ScrollerText extends Handler {
       private static final byte SCROLLER_STOPPED = 0x51;
       private static final byte SCROLLER_STARTING = 0x52;
       private static final byte SCROLLER_RUNNING = 0x53;
@@ -2776,7 +2790,7 @@
             return;
          }
          removeMessages(SCROLLER_MSG_TICK);
-         final TextView textView = mView.get();
+         TextView textView = mView.get();
          if (textView != null)  {
             mStringlength = mOriginalString.length();
             String szStr2 = "";
@@ -2812,7 +2826,7 @@
        */
       private void resetScroll() {
          mIteration = 0;
-         final TextView textView = mView.get();
+         TextView textView = mView.get();
          if (textView != null) {
             textView.setText(mOriginalString);
          }
@@ -2823,7 +2837,7 @@
        * Starts only if Length > 0
        */
       void startScroll() {
-         final TextView textView = mView.get();
+         TextView textView = mView.get();
          if (textView != null) {
             mOriginalString = (String)textView.getText();
             mStringlength = mOriginalString.length();
@@ -2836,15 +2850,15 @@
    }
 
 
-   public static IFMRadioService sService = null;
-   private static HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
+   public  IFMRadioService sService = null;
+   private  HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
 
-   public static boolean bindToService(Context context) {
+   public  boolean bindToService(Context context) {
       Log.e(LOGTAG, "bindToService: Context");
       return bindToService(context, null);
    }
 
-   public static boolean bindToService(Context context, ServiceConnection callback) {
+   public  boolean bindToService(Context context, ServiceConnection callback) {
       Log.e(LOGTAG, "bindToService: Context with serviceconnection callback");
       context.startService(new Intent(context, FMRadioService.class));
       ServiceBinder sb = new ServiceBinder(callback);
@@ -2853,7 +2867,7 @@
                                                          FMRadioService.class), sb, 0);
    }
 
-   public static void unbindFromService(Context context) {
+   public  void unbindFromService(Context context) {
       ServiceBinder sb = (ServiceBinder) sConnectionMap.remove(context);
       Log.e(LOGTAG, "unbindFromService: Context");
       if (sb == null) {
@@ -2868,7 +2882,7 @@
       }
    }
 
-   private static class ServiceBinder implements ServiceConnection {
+   private  class ServiceBinder implements ServiceConnection {
       ServiceConnection mCallback;
       ServiceBinder(ServiceConnection callback) {
          mCallback = callback;
@@ -2978,6 +2992,10 @@
       }
       public void onSearchComplete() {
          Log.d(LOGTAG, "mServiceCallbacks.onSearchComplete :");
+         mScanPty = 0;
+         mIsScaning = false;
+         mIsSeeking = false;
+         mIsSearching = false;
          mHandler.post(mSearchComplete);
       }
       public void onSearchListComplete() {
@@ -3017,4 +3035,45 @@
          startRecordingTimer();
       }
    };
+
+    private void registerFMSettingListner() {
+        if (mFmSettingReceiver == null) {
+            mFmSettingReceiver = new BroadcastReceiver() {
+                @Override
+                public void onReceive(Context context, Intent intent) {
+                     Log.d(LOGTAG, "Received intent " + intent);
+                     String action = intent.getAction();
+                     Log.d(LOGTAG, " action = " + action);
+                     if (action.equals(Settings.ACTION_FM_SETTING)) {
+                         int state = intent.getIntExtra("state", 0);
+                         Log.d(LOGTAG, "ACTION_FM_SETTING Intent received" + state);
+                         switch(state) {
+                         case Settings.FM_BAND_CHANGED:
+                              fmConfigure();
+                              break;
+                         case Settings.FM_CHAN_SPACING_CHANGED:
+                              fmConfigure();
+                              break;
+                         case Settings.FM_AF_OPTION_CHANGED:
+                              fmAudioOutputMode();
+                              break;
+                         case Settings.FM_AUDIO_MODE_CHANGED:
+                              fmAudioOutputMode();
+                              break;
+                         }
+                     }
+                 }
+            };
+            IntentFilter iFilter = new IntentFilter();
+            iFilter.addAction(Settings.ACTION_FM_SETTING);
+            registerReceiver(mFmSettingReceiver, iFilter);
+        }
+    }
+
+    private void unRegisterReceiver(BroadcastReceiver myReceiver) {
+        if(myReceiver != null) {
+           unregisterReceiver(myReceiver);
+           myReceiver = null;
+        }
+    }
 }
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 29c602f..106d1a6 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -653,8 +653,6 @@
       mServiceInUse = true;
       /* Application/UI is attached, so get out of lower power mode */
       setLowPowerMode(false);
-      if((mPlaybackInProgress == false) && isWiredHeadsetAvailable())
-         startFM();
       Log.d(LOGTAG, "onRebind");
    }
 
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 18ab71c..8defff5 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -178,7 +178,7 @@
     int  mTestSelected = 0;
     boolean mIsSearching = false;
     private static String LOGTAG = "FMStats";
-    private static IFMRadioService mService = null;
+    private IFMRadioService mService = null;
     private Thread mMultiUpdateThread = null;
     private static final int STATUS_UPDATE = 1;
     private static final int STATUS_DONE = 2;
@@ -355,6 +355,7 @@
 
     @Override
     public void onStop() {
+       Log.d(LOGTAG, "onStop");
        super.onStop();
        if(isRecording()) {
           try {
@@ -369,12 +370,16 @@
 
     @Override
     public void onDestroy() {
-
+        Log.d(LOGTAG, "onDestroy");
         stopCurTest();
-
+        if(mUIUpdateHandlerHandler != null) {
+           mUIUpdateHandlerHandler.removeCallbacksAndMessages(null);
+        }
+        if(mHandler != null) {
+           mHandler.removeCallbacksAndMessages(null);
+        }
         unRegisterBroadcastReceiver(mBandSweepDelayExprdListener);
         unRegisterBroadcastReceiver(mBandSweepDwellExprdListener);
-
         if(null != mFileCursor ) {
             try {
                 mFileCursor.close();
@@ -1707,7 +1712,7 @@
            20 times*/
           int freq = FmSharedPreferences.getTunedFrequency();
 
-          for(int i = 0; i < 20; i++) {
+          for(int i = 0; i < 20 && !Thread.currentThread().isInterrupted(); i++) {
               try {
                    Thread.sleep(500);
                    Message updateUI = new Message();
@@ -1749,19 +1754,27 @@
     /* Thread processing */
     private Runnable getManualSweepResults = new Runnable() {
        public void run() {
-           mWakeLock.acquire(10 * 1000);
-           if(mBand.cur_freq <= mBand.hFreq) {
-              if(!tuneAndUpdateSweepResult(mBand.cur_freq)) {
-                 sendStatusDoneMsg();
-              }
-              mBand.cur_freq += mBand.Spacing;
-              if(mBand.cur_freq > mBand.hFreq) {
-                 sendStatusDoneMsg();
-              }else {
-                 setAlarm(prevDwellTime * 1000, BAND_SWEEP_DWELL_DELAY_TIMEOUT);
-              }
-           }else {
-              sendStatusDoneMsg();
+           try {
+               if(mBand == null) {
+                  return;
+               }
+               mWakeLock.acquire(10 * 1000);
+               if(mBand.cur_freq <= mBand.hFreq) {
+                  if(!tuneAndUpdateSweepResult(mBand.cur_freq)) {
+                     sendStatusDoneMsg();
+                     return;
+                  }
+                  mBand.cur_freq += mBand.Spacing;
+                  if(mBand.cur_freq > mBand.hFreq) {
+                     sendStatusDoneMsg();
+                  }else {
+                     setAlarm(prevDwellTime * 1000, BAND_SWEEP_DWELL_DELAY_TIMEOUT);
+                  }
+               }else {
+                  sendStatusDoneMsg();
+               }
+           }catch(Exception e) {
+               e.printStackTrace();
            }
        }
     };
@@ -1787,31 +1800,37 @@
          boolean status = true;
          int freq;
 
-         mWakeLock.acquire(10 * 1000);
-         freq = mNextFreqInterface.getNextFreq();
-
-         for(; (status = (!mNextFreqInterface.errorOccured()) & (!Thread.currentThread().isInterrupted()));
-                  freq = mNextFreqInterface.getNextFreq()) {
-            if(validFreq(freq)) {
-               if(!tuneAndUpdateSweepResult(freq)) {
-                  status = false;
-                  break;
-               }else {
-                  setAlarm(prevDwellTime * 1000, BAND_SWEEP_DWELL_DELAY_TIMEOUT);
-                  break;
-               }
-            }
-         }
-         if(!status) {
-            sendStatusDoneMsg();
-            mNextFreqInterface.Stop();
-            mNextFreqInterface = null;
+         try {
+              mWakeLock.acquire(10 * 1000);
+              freq = mNextFreqInterface.getNextFreq();
+              for(; (status = (!mNextFreqInterface.errorOccured()) &
+                     (!Thread.currentThread().isInterrupted()));
+                          freq = mNextFreqInterface.getNextFreq()) {
+                  if(validFreq(freq)) {
+                     if(!tuneAndUpdateSweepResult(freq)) {
+                        status = false;
+                        break;
+                     }else {
+                        setAlarm(prevDwellTime * 1000,
+                                  BAND_SWEEP_DWELL_DELAY_TIMEOUT);
+                        break;
+                     }
+                  }
+              }
+              if(!status) {
+                 sendStatusDoneMsg();
+                 mNextFreqInterface.Stop();
+                 mNextFreqInterface = null;
+              }
+         }catch (Exception e) {
+              e.printStackTrace();
          }
        }
     };
 
     private boolean validFreq(int freq) {
-       if((freq >= mBand.lFreq) &&
+       if((freq >= mBand.lFreq) && (freq <= mBand.hFreq)
+           &&
           (((freq - mBand.lFreq) / mBand.Spacing) >= 0)) {
            return true;
        }else {
@@ -1870,6 +1889,8 @@
                }
            } catch (RemoteException e) {
                e.printStackTrace();
+           } catch(Exception e) {
+               e.printStackTrace();
            }
 
            try {
@@ -1880,6 +1901,8 @@
                    return null;
            } catch (RemoteException e) {
                e.printStackTrace();
+           } catch(Exception e) {
+               e.printStackTrace();
            }
 
            if(isTransportLayerSMD()) {
@@ -1893,6 +1916,8 @@
                   }
               } catch (RemoteException e) {
                   e.printStackTrace();
+              } catch(Exception e) {
+                  e.printStackTrace();
               }
            } else {
               try {
@@ -1903,6 +1928,8 @@
                       return null;
               } catch (RemoteException e) {
                   e.printStackTrace();
+              }catch(Exception e) {
+                  e.printStackTrace();
               }
            }
 
@@ -1914,6 +1941,8 @@
                    return null;
            } catch (RemoteException e) {
                e.printStackTrace();
+           }catch (Exception e) {
+               e.printStackTrace();
            }
         } else {
            return null;
@@ -1949,15 +1978,15 @@
             }
     };
 
-    public static IFMRadioService sService = null;
-    private static HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
+    public IFMRadioService sService = null;
+    private HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
 
-    public static boolean bindToService(Context context) {
+    public boolean bindToService(Context context) {
        Log.e(LOGTAG, "bindToService: Context");
        return bindToService(context, null);
     }
 
-    public static boolean bindToService(Context context, ServiceConnection callback) {
+    public boolean bindToService(Context context, ServiceConnection callback) {
        Log.e(LOGTAG, "bindToService: Context with serviceconnection callback");
        context.startService(new Intent(context, FMRadioService.class));
        ServiceBinder sb = new ServiceBinder(callback);
@@ -1966,7 +1995,7 @@
                                                           FMRadioService.class), sb, 0);
     }
 
-    public static void unbindFromService(Context context) {
+    public void unbindFromService(Context context) {
        ServiceBinder sb = (ServiceBinder) sConnectionMap.remove(context);
        Log.e(LOGTAG, "unbindFromService: Context");
        if (sb == null)
@@ -1983,7 +2012,7 @@
        }
     }
 
-    private static class ServiceBinder implements ServiceConnection
+    private class ServiceBinder implements ServiceConnection
     {
        ServiceConnection mCallback;
        ServiceBinder(ServiceConnection callback) {
@@ -2136,9 +2165,9 @@
           }
       };
       /* Radio Vars */
-     final Handler mHandler = new Handler();
+     private Handler mHandler = new Handler();
 
-     final Runnable mTuneComplete = new Runnable(){
+     private Runnable mTuneComplete = new Runnable(){
          public void run(){
              if((null != mMultiUpdateThread) &&(null != mSync))
              {
@@ -2297,8 +2326,10 @@
               @Override
                public void onReceive(Context context, Intent intent) {
                    Log.d(LOGTAG, "received Band sweep Dwell expired");
-                   mWakeLock.acquire(5 * 1000);
-                   ResumeBandSweep();
+                   if(mTestRunning) {
+                      mWakeLock.acquire(5 * 1000);
+                      ResumeBandSweep();
+                   }
                }
            };
            IntentFilter intentFilter = new IntentFilter(BAND_SWEEP_DWELL_DELAY_TIMEOUT);
diff --git a/fmapp2/src/com/caf/fmradio/FMTransmitterActivity.java b/fmapp2/src/com/caf/fmradio/FMTransmitterActivity.java
index e83f61f..9798e3e 100644
--- a/fmapp2/src/com/caf/fmradio/FMTransmitterActivity.java
+++ b/fmapp2/src/com/caf/fmradio/FMTransmitterActivity.java
@@ -98,8 +98,8 @@
    private static final int ACTIVITY_RESULT_SETTINGS = 1;
 
    private static final int MAX_PRESETS = 7;
-   private static IFMTransmitterService mService = null;
-   private static FmSharedPreferences mPrefs;
+   private IFMTransmitterService mService = null;
+   private FmSharedPreferences mPrefs;
 
    /* Button Resources */
    private ImageView mOnOffButton;
@@ -134,9 +134,9 @@
    private String mPSData = null;
 
    /* Radio Vars */
-   final Handler mHandler = new Handler();
-   private final Handler enableRadioHandler = new Handler();
-   private final Handler disableRadioHandler = new Handler();
+   private Handler mHandler = new Handler();
+   private Handler enableRadioHandler = new Handler();
+   private Handler disableRadioHandler = new Handler();
 
    /* Search Progress Dialog */
    private ProgressDialog mProgressDialog = null;
@@ -150,6 +150,7 @@
    private static final int FREQUENCY_STEP_LARGE = 200;
    public static boolean mUpdatePickerValue = false;
 
+   private BroadcastReceiver mFmSettingReceiver = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -243,6 +244,7 @@
           }else {
              Log.d(LOGTAG, "onCreate: Start Service completed successfully");
           }
+          registerFMSettingListner();
        }
    }
 
@@ -341,6 +343,7 @@
    @Override
    public void onResume() {
       super.onResume();
+      Log.d(LOGTAG, "Resuming");
       LoadPreferences();
       if(mPicker != null) {
          setDisplayvalue();
@@ -353,20 +356,30 @@
 
    @Override
    public void onDestroy() {
+      super.onDestroy();
+      mHandler.removeCallbacksAndMessages(null);
+      if(mProgressDialog != null) {
+         mProgressDialog.dismiss();
+         mProgressDialog = null;
+      }
+      if(mSearchProgressHandler != null) {
+         mSearchProgressHandler.removeCallbacksAndMessages(null);
+      }
+      removeDialog(DIALOG_PRESET_LIST_AUTO_SET);
+      unRegisterReceiver(mFmSettingReceiver);
       unbindFromService(this);
       mService = null;
       Log.d(LOGTAG, "onDestroy: unbindFromService completed");
-      super.onDestroy();
    }
 
-   private class LoadedDataAndState {
+   private static class LoadedDataAndState {
       public LoadedDataAndState(){};
       public boolean onOrOff;
    }
 
    @Override
    public Object onRetainNonConfigurationInstance() {
-      final LoadedDataAndState data = new LoadedDataAndState();
+      LoadedDataAndState data = new LoadedDataAndState();
       if(mService != null) {
          try {
               data.onOrOff = mService.isFmOn();
@@ -759,7 +772,7 @@
       }
    };
 
-   final FrequencyPickerDialog.OnFrequencySetListener
+   private FrequencyPickerDialog.OnFrequencySetListener
       mFrequencyChangeListener =
          new FrequencyPickerDialog.OnFrequencySetListener() {
             public void onFrequencySet
@@ -867,7 +880,7 @@
       }
    }
 
-   public static void fmConfigure() {
+   public void fmConfigure() {
       if(mService != null) {
          try {
               mService.fmReconfigure();
@@ -1051,7 +1064,7 @@
       return (mIsSearching);
    }
 
-   public static int getCurrentTunedFrequency() {
+   public int getCurrentTunedFrequency() {
       return mTunedFrequency;
    }
 
@@ -1148,14 +1161,14 @@
   }
 
 
-  final Runnable mUpdateStationInfo = new Runnable() {
+  private Runnable mUpdateStationInfo = new Runnable() {
      public void run() {
         updateSearchProgress();
         resetFMStationInfoUI();
      }
   };
 
-  final Runnable mSearchListComplete = new Runnable() {
+  private Runnable mSearchListComplete = new Runnable() {
      public void run() {
         Log.d(LOGTAG, "mSearchListComplete: ");
         mIsSearching = false;
@@ -1196,7 +1209,7 @@
 
 
 
-  final Runnable mUpdateRadioText = new Runnable() {
+  private Runnable mUpdateRadioText = new Runnable() {
      public void run() {
         String str = "";
         if((mService != null) && isFmOn()) {
@@ -1237,7 +1250,7 @@
      }
   };
 
-  final Runnable mRadioChangeFrequency = new Runnable(){
+  private Runnable mRadioChangeFrequency = new Runnable(){
      public void run() {
         mUpdatePickerValue = false;
         tuneRadio(mFrequency);
@@ -1260,7 +1273,7 @@
     * character after every SCROLLER_UPDATE_DELAY_MS When the entire text is
     * scrolled, the scrolling will restart after SCROLLER_RESTART_DELAY_MS
     */
-  private static final class ScrollerText extends Handler {
+  private final class ScrollerText extends Handler {
 
      private static final byte SCROLLER_STOPPED = 0x51;
      private static final byte SCROLLER_STARTING = 0x52;
@@ -1379,15 +1392,15 @@
      }
   }
 
-  public static IFMTransmitterService sService = null;
-  private static HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
+  public IFMTransmitterService sService = null;
+  private HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>();
 
-  public static boolean bindToService(Context context) {
+  public boolean bindToService(Context context) {
      Log.e(LOGTAG, "bindToService: Context");
      return bindToService(context, null);
   }
 
-  public static boolean bindToService(Context context,
+  public boolean bindToService(Context context,
                         ServiceConnection callback) {
      Log.e(LOGTAG, "bindToService: Context with serviceconnection callback");
      context.startService(new Intent(context, FMTransmitterService.class));
@@ -1397,7 +1410,7 @@
                                 FMTransmitterService.class), sb, 0);
   }
 
-  public static void unbindFromService(Context context) {
+  public void unbindFromService(Context context) {
      ServiceBinder sb = (ServiceBinder) sConnectionMap.remove(context);
      Log.e(LOGTAG, "unbindFromService: Context");
      if(sb == null) {
@@ -1413,7 +1426,7 @@
      }
   }
 
-  private static class ServiceBinder implements ServiceConnection {
+  private class ServiceBinder implements ServiceConnection {
      ServiceConnection mCallback;
 
      ServiceBinder(ServiceConnection callback) {
@@ -1530,7 +1543,7 @@
      }
   };
 
-  final Runnable mRadioStateUpdated = new Runnable() {
+  private Runnable mRadioStateUpdated = new Runnable() {
      public void run() {
         enableRadioOnOffButton();
         /* Update UI to FM On State */
@@ -1551,7 +1564,7 @@
      }
   };
 
-  final Runnable mRadioReset = new Runnable() {
+  private Runnable mRadioReset = new Runnable() {
      public void run() {
         /* Save the existing frequency */
         resetSearchProgress();
@@ -1560,4 +1573,40 @@
         enableRadioOnOffUI(false);
      }
   };
+
+  private void registerFMSettingListner() {
+       if(mFmSettingReceiver == null) {
+           mFmSettingReceiver = new BroadcastReceiver() {
+               @Override
+               public void onReceive(Context context, Intent intent) {
+                    Log.d(LOGTAG, "Received intent " + intent);
+                    String action = intent.getAction();
+                    Log.d(LOGTAG, " action = " + action);
+                    if (action.equals(Settings.ACTION_FM_SETTING)) {
+                        int state = intent.getIntExtra("state", 0);
+                        Log.d(LOGTAG, "ACTION_FM_SETTING Intent received" + state);
+                        switch(state) {
+                        case Settings.FM_BAND_CHANGED:
+                             fmConfigure();
+                             break;
+                        case Settings.FM_CHAN_SPACING_CHANGED:
+                             fmConfigure();
+                             break;
+                        }
+                    }
+                }
+           };
+           IntentFilter iFilter = new IntentFilter();
+           iFilter.addAction(Settings.ACTION_FM_SETTING);
+           registerReceiver(mFmSettingReceiver, iFilter);
+       }
+  }
+
+  private void unRegisterReceiver(BroadcastReceiver myReceiver) {
+      if(myReceiver != null) {
+         unregisterReceiver(myReceiver);
+         myReceiver = null;
+      }
+  }
+
 }
diff --git a/fmapp2/src/com/caf/fmradio/Settings.java b/fmapp2/src/com/caf/fmradio/Settings.java
index 328126a..d64621b 100644
--- a/fmapp2/src/com/caf/fmradio/Settings.java
+++ b/fmapp2/src/com/caf/fmradio/Settings.java
@@ -62,7 +62,11 @@
         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";
-
+        public static final String ACTION_FM_SETTING = "com.caf.fmradio.settings.changed";
+        public static final int FM_BAND_CHANGED = 1;
+        public static final int FM_CHAN_SPACING_CHANGED = 2;
+        public static final int FM_AF_OPTION_CHANGED = 3;
+        public static final int FM_AUDIO_MODE_CHANGED = 4;
         private static final String LOGTAG = FMRadio.LOGTAG;
         private static final String USR_BAND_MSG = "Enter Freq from range 76.0 - 108.0";
 
@@ -272,8 +276,7 @@
                                                         + index);
               FmSharedPreferences.setCountry(index);
               setBandSummary(index);
-              bStatus = FMRadio.fmConfigure();
-              FMTransmitterActivity.fmConfigure();
+              sendSettingsChangedIntent(FM_BAND_CHANGED);
               if (curList != null) {
                   curList.clear();
               }
@@ -286,14 +289,13 @@
                if(valStr != null) {
                   index  = mChannelSpacingPref.findIndexOfValue(valStr);
                }
-               if ((index < 0) || (index >= summaryRecordItems.length)) {
+               if ((index < 0) || (index >= chSpacingItems.length)) {
                    index = 0;
                    mChannelSpacingPref.setValueIndex(0);
                }
                mChannelSpacingPref.setSummary(chSpacingItems[index]);
                FmSharedPreferences.setChSpacing(2 - index);
-               FMRadio.fmConfigure();
-               FMTransmitterActivity.fmConfigure();
+               sendSettingsChangedIntent(FM_CHAN_SPACING_CHANGED);
                if(curList != null) {
                   curList.clear();
                }
@@ -311,8 +313,7 @@
                min_freq = FmSharedPreferences.getLowerLimit();
                if((freq > 0) && (freq < max_freq) && (freq >= 76000)) {
                   FmSharedPreferences.setLowerLimit((int)freq);
-                  FMRadio.fmConfigure();
-                  FMTransmitterActivity.fmConfigure();
+                  sendSettingsChangedIntent(FM_BAND_CHANGED);
                   setBandSummary(summaryBandItems.length - 1);
                   clearStationList();
                }else {
@@ -331,8 +332,7 @@
                max_freq = FmSharedPreferences.getUpperLimit();
                if((freq > 0) && (freq > min_freq) && (freq <= 108000)) {
                   FmSharedPreferences.setUpperLimit((int)freq);
-                  FMRadio.fmConfigure();
-                  FMTransmitterActivity.fmConfigure();
+                  sendSettingsChangedIntent(FM_BAND_CHANGED);
                   setBandSummary(summaryBandItems.length - 1);
                   clearStationList();
                }else {
@@ -345,8 +345,8 @@
                      Log.d(LOGTAG, "onSharedPreferenceChanged: Auto AF Enable: "
                                                + bAFAutoSwitch);
                      FmSharedPreferences.setAutoAFSwitch(bAFAutoSwitch);
-                     FMRadio.fmAutoAFSwitch();
                      mPrefs.Save();
+                     sendSettingsChangedIntent(FM_AF_OPTION_CHANGED);
                  }else if(key.equals(RECORD_DURATION_KEY)) {
                      if(FMRadio.RECORDING_ENABLE) {
                         String valueStr = mRecordDurPreference.getValue();
@@ -387,7 +387,7 @@
                          FmSharedPreferences.setAudioOutputMode(false);
                      }
                      mPrefs.Save();
-                     FMRadio.fmAudioOutputMode();
+                     sendSettingsChangedIntent(FM_AUDIO_MODE_CHANGED);
                  }
               }
           }
@@ -526,4 +526,11 @@
         private void displayToast(String msg) {
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
         }
+
+        private void sendSettingsChangedIntent(int action) {
+           Intent intent = new Intent(ACTION_FM_SETTING);
+           intent.putExtra("state", action);
+           Log.d(LOGTAG, "Sending  FM SETTING Change intent for = " + action);
+           getApplicationContext().sendBroadcast(intent);
+        }
 }
