diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 76b961c..e7f1c51 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -496,14 +496,11 @@
       Log.d(LOGTAG, "FMRadio: onResume");
 
       super.onResume();
-      if (null == mService) {
-          Log.e(LOGTAG, "FM Service is not running, returning");
-          return;
-      }
 
       // TODO: We should return on exception or continue?
       try {
-          mService.registerCallbacks(mServiceCallbacks);
+          if (mService != null)
+              mService.registerCallbacks(mServiceCallbacks);
       } catch (RemoteException e) {
           e.printStackTrace();
       }
@@ -511,7 +508,8 @@
       if (isSleepTimerActive()) {
           Log.d(LOGTAG, "isSleepTimerActive is true");
           try {
-               mService.cancelDelayedStop(FMRadioService.STOP_SERVICE);
+               if (mService != null)
+                  mService.cancelDelayedStop(FMRadioService.STOP_SERVICE);
                if(null != mSleepUpdateHandlerThread) {
                   mSleepUpdateHandlerThread.interrupt();
                }
@@ -524,7 +522,8 @@
       if (isRecording()) {
           Log.d(LOGTAG,"isRecordTimerActive is true");
           try {
-              mService.cancelDelayedStop(FMRadioService.STOP_RECORD);
+              if (mService != null)
+                  mService.cancelDelayedStop(FMRadioService.STOP_RECORD);
           } catch (Exception e) {
               e.printStackTrace();
           }
@@ -536,7 +535,8 @@
       // we might lose audio focus between pause and restart,
       // hence request it again
       try {
-           mService.requestFocus();
+           if (mService != null)
+               mService.requestFocus();
       } catch (Exception e) {
            e.printStackTrace();
       }
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 6f6f257..188a068 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -283,10 +283,6 @@
       cancelAlarms();
       //release the audio focus listener
       AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-      if (isMuted()) {
-          mMuted = false;
-          audioManager.setStreamMute(AudioManager.STREAM_MUSIC,false);
-      }
       audioManager.abandonAudioFocus(mAudioFocusListener);
       /* Remove the Screen On/off listener */
       if (mScreenOnOffReceiver != null) {
@@ -356,6 +352,8 @@
                                      AUDIO_SAMPLE_RATE, AUDIO_CHANNEL_CONFIG,
                                      AUDIO_ENCODING_FORMAT, FM_RECORD_BUF_SIZE,
                                      AudioTrack.MODE_STREAM);
+        if (mMuted)
+            mAudioTrack.setVolume(0.0f);
    }
 
    private synchronized void startRecordSink() {
@@ -722,6 +720,7 @@
         }
     }
 
+    // TODO: Check if this is needed with latest Android versions?
     public void registerMusicServiceCommandReceiver() {
         if (mMusicCommandListener == null) {
             mMusicCommandListener = new BroadcastReceiver() {
@@ -738,21 +737,11 @@
                                 mA2dpDisconnected = false;
                                 return;
                             }
-                            if(isFmOn()){
-                                fmOff();
+                            if (isFmOn()) {
+                                fmOperationsOff();
                                 if (isOrderedBroadcast()) {
                                     abortBroadcast();
                                 }
-                                try {
-                                    /* Notify the UI/Activity, only if the service is "bound"
-                                       by an activity and if Callbacks are registered
-                                    */
-                                    if((mServiceInUse) && (mCallbacks != null) ){
-                                        mCallbacks.onDisabled();
-                                    }
-                                } catch (RemoteException e) {
-                                    e.printStackTrace();
-                                }
                             }
                         }
                     }
@@ -1539,8 +1528,6 @@
                          mSpeakerDisableHandler.postDelayed(mSpeakerDisableTask, 0);
                       }
                       if (true == mPlaybackInProgress) {
-                          if(mMuted)
-                             unMute();
                           stopFM();
                       }
                       if (mSpeakerPhoneOn) {
@@ -2154,7 +2141,6 @@
       if(audioManager != null)
       {
          Log.d(LOGTAG, "audioManager.setFmRadioOn = false \n" );
-         unMute();
          stopFM();
          //audioManager.setParameters("FMRadioOn=false");
          Log.d(LOGTAG, "audioManager.setFmRadioOn false done \n" );
@@ -2405,7 +2391,9 @@
       if (audioManager != null)
       {
          mMuted = true;
-         audioManager.setStreamMute(AudioManager.STREAM_MUSIC,true);
+         audioManager.setParameters("fm_mute=1");
+         if (mAudioTrack != null)
+             mAudioTrack.setVolume(0.0f);
       }
       return bCommandSent;
    }
@@ -2425,7 +2413,9 @@
       if (audioManager != null)
       {
          mMuted = false;
-         audioManager.setStreamMute(AudioManager.STREAM_MUSIC,false);
+         audioManager.setParameters("fm_mute=0");
+         if (mAudioTrack != null)
+             mAudioTrack.setVolume(1.0f);
          if (mResumeAfterCall)
          {
              //We are unmuting FM in a voice call. Need to enable FM audio routing.
