diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index d25e5a8..4cb92d3 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -229,6 +229,7 @@
    private static final int ENABLE_SLIMBUS_DATA_PORT = 1;
    private static final int DISABLE_SOFT_MUTE = 0;
    private static final int ENABLE_SOFT_MUTE = 1;
+   private static final int DEFAULT_VOLUME_INDEX = 6;
    private static Object mNotchFilterLock = new Object();
    private static Object mNotificationLock = new Object();
 
@@ -1587,27 +1588,30 @@
                   return;
               }
               switch (msg.arg1) {
-                  case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
-                      Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
-                      if (true == isFmRecordingOn())
-                          stopRecording();
                   case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
-                      if ((mReceiver != null) && mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
-                          enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
+                      mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+                      int mCurrentVolumeIndex =
+                                  mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
+                      Log.d(LOGTAG, "Current Volume Index = "+ mCurrentVolumeIndex);
+                      /* lower fm volume only if fm audio playing above default volume index */
+                      if (mCurrentVolumeIndex > DEFAULT_VOLUME_INDEX) {
+                          setFMVolume(DEFAULT_VOLUME_INDEX);
                       }
-                      mStoppedOnFocusLoss = true;
-
-                      if (true == mPlaybackInProgress) {
-                          stopFM();
-                      }
-
                       break;
                   case AudioManager.AUDIOFOCUS_LOSS:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS mspeakerphone= " +
                                mSpeakerPhoneOn);
-
+                      if (mSpeakerPhoneOn) {
+                          if (isAnalogModeSupported())
+                              setAudioPath(false);
+                      }
+                      if (mSession.isActive()) {
+                          mSession.setActive(false);
+                      }
                       //intentional fall through.
+                  case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+                      Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
                       if (mReceiver.isCherokeeChip() && (mPref.getBoolean("SLIMBUS_SEQ", true))) {
                           enableSlimbus(DISABLE_SLIMBUS_DATA_PORT);
                       }
@@ -1618,12 +1622,7 @@
                       if (true == isFmRecordingOn())
                           stopRecording();
 
-                      if (mSpeakerPhoneOn) {
-                          if (isAnalogModeSupported())
-                              setAudioPath(false);
-                      }
                       mStoppedOnFocusLoss = true;
-                      mSession.setActive(false);
                       break;
                   case AudioManager.AUDIOFOCUS_GAIN:
                       Log.v(LOGTAG, "AudioFocus: received AUDIOFOCUS_GAIN mPlaybackinprogress =" +
@@ -1641,8 +1640,16 @@
                                 (mPref.getBoolean("SLIMBUS_SEQ", true))) {
                               enableSlimbus(ENABLE_SLIMBUS_DATA_PORT);
                           }
+                      } else {
+                          /* This case usually happens, when FM volume is lowered down and Playback
+                           * In Progress on AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK recived. Need
+                           * to restore volume level back when AUDIOFOCUS_GAIN received
+                           */
+                          setCurrentFMVolume();
                       }
-                      mSession.setActive(true);
+                      if (!mSession.isActive()) {
+                          mSession.setActive(true);
+                      }
                       break;
                   default:
                       Log.e(LOGTAG, "Unknown audio focus change code"+msg.arg1);
