diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index 1c506c4..091b1b3 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -276,6 +276,7 @@
 
     private Thread mRecordUpdateHandlerThread = null;
     private Thread mRunTestThread = null;
+    private Thread mTuneCompleteThread = null;
     boolean mRecording = false;
 
 
@@ -465,12 +466,10 @@
                         if (lastCmdSent == CMD_STNPARAM_SINR)
                             nSINR = msg.arg1;
                     }
-                    if (mRunTestThread !=  null) {
-                        synchronized (obj) {
-                            obj.notify();
-                        }
-                    }
-                    lastCmdSent = 0;
+					synchronized (obj) {
+						obj.notify();
+					}
+					lastCmdSent = 0;
                     break;
                 case GET_STATION_DBG_PARAM:
                     status = msg.arg2;
@@ -484,12 +483,10 @@
                         if  (lastCmdSent == CMD_STNDBGPARAM_INFDETOUT)
                             nIntDet = msg.arg1;
                     }
-                    if (mRunTestThread !=  null) {
-                        synchronized (obj) {
-                            mRunTestThread.notify();
-                        }
-                    }
-                    break;
+					synchronized (obj) {
+						obj.notify();
+					}
+					break;
                 default:
                     Log.e(LOGTAG, "mCallbackHandler:Default");
                     break;
@@ -535,9 +532,6 @@
         if(mUIUpdateHandlerHandler != null) {
            mUIUpdateHandlerHandler.removeCallbacksAndMessages(null);
         }
-        if(mHandler != null) {
-           mHandler.removeCallbacksAndMessages(null);
-        }
         unRegisterBroadcastReceiver(mBandSweepDelayExprdListener);
         unRegisterBroadcastReceiver(mBandSweepDwellExprdListener);
         if(null != mFileCursor ) {
@@ -563,6 +557,28 @@
         }
     };
 
+     private Runnable mTuneComplete = new Runnable(){
+         public void run(){
+             if((null != mMultiUpdateThread) &&(null != mSync))
+             {
+                 synchronized(mSync){
+                     mSync.notify();
+                 }
+             }
+            if((mTestSelected == SEARCH_TEST) && (mService != null)) {
+                /* On every Tune Complete generate the result for the current
+                Frequency*/
+                Message updateUI = new Message();
+                updateUI.what = STATUS_UPDATE;
+                int freq = FmSharedPreferences.getTunedFrequency();
+                updateUI.obj = (Object)GetFMStatsForFreq(freq);
+                if (updateUI.obj == null)
+                    updateUI.what = STATUS_DONE;
+                mUIUpdateHandlerHandler.sendMessage(updateUI);
+            }
+         }
+     };
+
     private View.OnClickListener mOnRunListener = new View.OnClickListener() {
         public void onClick(View v) {
             Log.d(LOGTAG, "mTestRunning=" + mTestRunning);
@@ -2880,12 +2896,12 @@
     private boolean isCherokeeChip() {
         Log.d(LOGTAG, "isCherokeeChip");
 
-		String chip = SystemProperties.get("qcom.bluetooth.soc");
-		if (chip.equals("cherokee"))
-			return true;
-		else
-			return false;
-	}
+        String chip = SystemProperties.get("qcom.bluetooth.soc");
+        if (chip.equals("cherokee"))
+            return true;
+        else
+            return false;
+    }
 
     private boolean isRomeChip() {
         String chip = "";
@@ -3515,8 +3531,21 @@
           public void onTuneStatusChanged()
           {
              Log.d(LOGTAG, "mServiceCallbacks.onTuneStatusChanged :" + mTestRunning);
-             if (mTestRunning)
-                 mHandler.post(mTuneComplete);
+             if (mTestRunning) {
+                 if ((mTuneCompleteThread == null) || (mTuneCompleteThread.getState() == Thread.State.TERMINATED)) {
+                     mTuneCompleteThread = new Thread(mTuneComplete,
+                                                "mTuneCompleteThread");
+                 } else {
+                     Log.e(LOGTAG, "mTuneCompleteThread is already running");
+                     return;
+                 }
+                 if (mTuneCompleteThread != null) {
+                     mTuneCompleteThread.start();
+                 } else {
+                     Log.e(LOGTAG, "mTuneCompleteThread: new thread create failed");
+                     return;
+                 }
+             }
           }
 
           public void onProgramServiceChanged()
@@ -3737,30 +3766,6 @@
               mCallbackHandler.obtainMessage(GET_STATION_DBG_PARAM, val, status).sendToTarget();
           }
       };
-      /* Radio Vars */
-     private Handler mHandler = new Handler();
-
-     private Runnable mTuneComplete = new Runnable(){
-         public void run(){
-             if((null != mMultiUpdateThread) &&(null != mSync))
-             {
-                 synchronized(mSync){
-                     mSync.notify();
-                 }
-             }
-            if((mTestSelected == SEARCH_TEST) && (mService != null)) {
-                /* On every Tune Complete generate the result for the current
-                Frequency*/
-                Message updateUI = new Message();
-                updateUI.what = STATUS_UPDATE;
-                int freq = FmSharedPreferences.getTunedFrequency();
-                updateUI.obj = (Object)GetFMStatsForFreq(freq);
-                if (updateUI.obj == null)
-                    updateUI.what = STATUS_DONE;
-                mUIUpdateHandlerHandler.sendMessage(updateUI);
-            }
-         }
-     };
 
      private void stopCurTest() {
          if (mRunTestThread != null) {
@@ -3779,7 +3784,8 @@
                       mMultiUpdateThread.interrupt();
                   break;
              case SEARCH_TEST:
-                  mHandler.removeCallbacks(mTuneComplete);
+                  if (mTuneCompleteThread != null)
+                      mTuneCompleteThread.interrupt();
                   if (mService != null) {
                       try {
                            Message updateStop = new Message();
