diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index ae85350..49fe731 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -228,6 +228,7 @@
    private boolean mIsRecordSink = false;
    private static final int AUDIO_FRAMES_COUNT_TO_IGNORE = 3;
    private Object mEventWaitLock = new Object();
+   private Object mRecordSinkLock = new Object();
    private boolean mIsFMDeviceLoopbackActive = false;
    private File mStoragePath = null;
    private static final int FM_OFF_FROM_APPLICATION = 1;
@@ -418,6 +419,17 @@
             mRecordSinkThread = new RecordSinkThread();
             mRecordSinkThread.start();
             Log.d(LOGTAG, "mRecordSinkThread started");
+            try {
+                synchronized (mRecordSinkLock) {
+                    Log.d(LOGTAG, "waiting for play to complete");
+                    mRecordSinkLock.wait();
+                }
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+                enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+            }
         }
     }
 
@@ -470,6 +482,9 @@
                             Log.d(LOGTAG, "RecordSinkThread: mAudioTrack.play executed");
                             mAudioTrack.play();
                             Log.d(LOGTAG, "RecordSinkThread: mAudioTrack.play completed");
+                            synchronized (mRecordSinkLock) {
+                                mRecordSinkLock.notify();
+                            }
                         }
                         int size = mAudioRecord.read(buffer, 0, FM_RECORD_BUF_SIZE);
                         // check whether need to ignore first 3 frames audio data from AudioRecord
@@ -567,6 +582,9 @@
             }
             if ((!mIsFMDeviceLoopbackActive) && (!mA2dpConnected) && (!mSpeakerPhoneOn)) {
                 // not on BT and device loop is also not active
+                if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+                    enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
+                }
                 exitRecordSinkThread();
                 configureFMDeviceLoopback(true);
             }
@@ -978,8 +996,6 @@
       if (isFmOn()) {
           setLowPowerMode(false);
           startFM();
-          if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
-              enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
       }
    }
 
@@ -1179,6 +1195,7 @@
        mAudioManager.registerMediaButtonEventReceiver(fmRadio);
 
        mStoppedOnFocusLoss = false;
+       mPlaybackInProgress = true;
 
        if (mStoppedOnFactoryReset) {
            mStoppedOnFactoryReset = false;
@@ -1192,9 +1209,10 @@
                } else {
                    startApplicationLoopBack(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
                }
+       } else {
+               Log.d(LOGTAG,"Start Hardware loop back for audio");
+               configureAudioDataPath(true);
        }
-       mPlaybackInProgress = true;
-       configureAudioDataPath(true);
        try {
            if ((mServiceInUse) && (mCallbacks != null))
                mCallbacks.onFmAudioPathStarted();
@@ -1752,8 +1770,6 @@
 
                       if(false == mPlaybackInProgress)
                           startFM();
-                      if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true)))
-                          enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
                       mSession.setActive(true);
                       break;
                   default:
@@ -2526,22 +2542,14 @@
          else
          {
            if (mReceiver.isCherokeeChip()) {
-               if ((mPref.getBoolean("SLIMBUS_SEQ", true)) ) {
-                       bStatus = enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
-                   if (bStatus) {
-                       bStatus = fmTurnOnSequenceCherokee();
-                   } else {
-                       Log.d(LOGTAG, "set SLIMBUS_SEQ flag to false");
-                       mEditor.putBoolean("SLIMBUS_SEQ", false);
-                       mEditor.commit();
-                       bStatus = fmTurnOnSequence();
-                   }
-               } else {
-                   bStatus = fmTurnOnSequence();
+               if ((mReceiver != null) && mReceiver.isCherokeeChip() &&
+                     (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+                   enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
                }
-         } else {
+               bStatus = fmTurnOnSequenceCherokee();
+           } else {
                bStatus = fmTurnOnSequence();
-         }
+           }
            /* reset SSR flag */
            mIsSSRInProgressFromActivity = false;
          }
@@ -2559,8 +2567,8 @@
       {
          Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
          if ((mReceiver != null) && mReceiver.isCherokeeChip() &&
-                            (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-             enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+                     (mPref.getBoolean("SLIMBUS_SEQ", true))) {
+              enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
          }
          stopFM();
          unMute();
@@ -2766,7 +2774,6 @@
            Log.d(LOGTAG, "enabling speaker");
                startApplicationLoopBack(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
        }
-       enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
        Log.d(LOGTAG, "speakerOn completed:" + speakerOn);
    }
   /*
@@ -4166,7 +4173,6 @@
            audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
                   AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            startFM();
-           enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
            mStoppedOnFocusLoss = false;
        }
    }
