diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 08021cc..0acbc63 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -1620,6 +1620,20 @@
       boolean bStatus = false;
       if (mService != null) {
           try {
+            if(mService.isSSRInProgress()) {
+               Log.e(LOGTAG, "SSR In Progress, looping");
+               while(mService.isSSRInProgress()) {
+                  try
+                  {
+                     Thread.sleep(500);
+                  } catch (InterruptedException e)
+                  {
+                     break;
+                  }
+               }
+               Log.e(LOGTAG, "SSR done, continuing");
+            }
+
             if((false == mService.isFmOn()) && isAntennaAvailable()) {
                 bStatus = mService.fmOn();
                 if(bStatus) {
@@ -1680,11 +1694,21 @@
       }
       if (mService != null) {
          try {
-            if(bSpeakerPhoneOn) {
-               mService.enableSpeaker(false);
-            }
             mService.fmRadioReset();
             enableRadioOnOffUI(false);
+
+            Log.e(LOGTAG, "Done with reset, restarting FM");
+            /* Start Turn ON sequence again */
+            mOnOffButton.setEnabled(false);
+            mOnOffButton.setClickable(false);
+            mOnOffButton.setOnClickListener(null);
+
+            mDisableRadioHandler.removeCallbacks(mDisableRadioTask);
+            mEnableRadioHandler.removeCallbacks(mEnableRadioTask);
+            mEnableRadioHandler.postDelayed(mEnableRadioTask, 0);
+
+            cleanupTimeoutHandler();
+            Log.e(LOGTAG, "Done with restart");
          }catch (RemoteException e) {
             e.printStackTrace();
          }
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 9727050..f643ec3 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -181,6 +181,8 @@
    private boolean mUnMuteOnFocusLoss = false;
    private boolean mSpeakerOnFocusLoss = false;
    private MediaSession mSession;
+   private boolean mIsSSRInProgress = false;
+   private boolean mIsSSRInProgressFromActivity = false;
 
    public FMRadioService() {
    }
@@ -845,6 +847,14 @@
        mResumeAfterCall = false;
        if ( true == mPlaybackInProgress ) // no need to resend event
            return;
+
+       /* If audio focus lost while SSR in progress, don't request for Audio focus */
+       if ( (true == mIsSSRInProgress || true == mIsSSRInProgressFromActivity) &&
+             true == mStoppedOnFocusLoss) {
+           Log.d(LOGTAG, "Audio focus lost while SSR in progress, returning");
+           return;
+       }
+
        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        int granted = audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
               AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
@@ -1718,6 +1728,11 @@
       {
            return (mService.get().isSleepTimerActive());
       }
+
+      public boolean isSSRInProgress()
+      {
+         return(mService.get().isSSRInProgress());
+      }
    }
    private final IBinder mBinder = new ServiceStub(this);
 
@@ -1845,6 +1860,9 @@
                               // we disable
             stop();
          }
+
+         /* reset SSR flag */
+         mIsSSRInProgressFromActivity = false;
       }
       return(bStatus);
    }
@@ -1889,12 +1907,6 @@
    * Reset (OFF) FM Operations: This resets all the current FM operations             .
    */
    private void fmOperationsReset() {
-      if ( mSpeakerPhoneOn)
-      {
-          mSpeakerPhoneOn = false;
-          AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NONE);
-      }
-
       if (isFmRecordingOn())
       {
           stopRecording();
@@ -1904,7 +1916,6 @@
       if(audioManager != null)
       {
          Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
-         unMute();
          resetFM();
          //audioManager.setParameters("FMRadioOn=false");
          Log.d(LOGTAG, "audioManager.setFmRadioOn false done \n" );
@@ -1958,6 +1969,10 @@
       return(bStatus);
    }
 
+   public boolean isSSRInProgress() {
+      return mIsSSRInProgress;
+   }
+
    /* Returns whether FM hardware is ON.
     *
     * @return true if FM was tuned, searching. (at the end of
@@ -2678,6 +2693,7 @@
       }
       public void FmRxEvRadioReset()
       {
+         boolean bStatus;
          Log.d(LOGTAG, "FmRxEvRadioReset");
          if(isFmOn()) {
              // Received radio reset event while FM is ON
@@ -2690,7 +2706,24 @@
                 */
                 if((mServiceInUse) && (mCallbacks != null) )
                 {
+                    mIsSSRInProgressFromActivity = true;
                     mCallbacks.onRadioReset();
+                } else {
+                    Log.d(LOGTAG, "Activity is not in foreground, turning on from service");
+                    if (isAntennaAvailable())
+                    {
+                        mIsSSRInProgress = true;
+                        bStatus = fmOn();
+                        if(bStatus)
+                        {
+                             bStatus = tune(FmSharedPreferences.getTunedFrequency());
+                             if(!bStatus)
+                               Log.e(LOGTAG, "Tuning after SSR from service failed");
+                        } else {
+                           Log.e(LOGTAG, "Turning on after SSR from service failed");
+                        }
+                        mIsSSRInProgress = false;
+                    }
                 }
              }
              catch (RemoteException e)
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index 2f6f1e3..7b04d71 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -72,5 +72,6 @@
     boolean setRxRepeatCount(int count);
     long getRecordingStartTime();
     boolean isSleepTimerActive();
+    boolean isSSRInProgress();
 }
 
