diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 9b130ff..2b45049 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -387,20 +387,6 @@
       if ((mERadioTextScroller == null) && (mERadioTextTV != null)) {
           mERadioTextScroller = new ScrollerText(mERadioTextTV);
       }
-
-
-      //HDMI and FM concurrecny is not supported.
-      if (isHdmiOn()) {
-          showDialog(DIALOG_CMD_FAILED_HDMI_ON);
-      }
-      else {
-         if (false == bindToService(this, osc)) {
-             Log.d(LOGTAG, "onCreate: Failed to Start Service");
-         } else {
-             Log.d(LOGTAG, "onCreate: Start Service completed successfully");
-         }
-         registerFMSettingListner();
-      }
    }
 
    protected void setDisplayvalue(){
@@ -450,18 +436,7 @@
    public void onStop() {
       Log.d(LOGTAG, "FMRadio: onStop");
       if(isSleepTimerActive()) {
-          mSleepUpdateHandlerThread.interrupt();
-          long timeNow = ((SystemClock.elapsedRealtime()));
-          if (timeNow < mSleepAtPhoneTime) {
-              try {
-                if (null != mService) {
-                    mService.delayedStop((mSleepAtPhoneTime - timeNow),
-                                               FMRadioService.STOP_SERVICE);
-                }
-              }catch (Exception e) {
-                e.printStackTrace();
-              }
-          }
+         mSleepUpdateHandlerThread.interrupt();
       }
       if(isRecording()) {
           try {
@@ -479,36 +454,16 @@
    public void onStart() {
       super.onStart();
       Log.d(LOGTAG, "FMRadio: onStart");
-      try {
-         if(mService != null) {
-            mService.registerCallbacks(mServiceCallbacks);
+      if (isHdmiOn()) {
+          showDialog(DIALOG_CMD_FAILED_HDMI_ON);
+      }
+      else {
+         if ((mService == null ) && (false == bindToService(this, osc))) {
+             Log.d(LOGTAG, "onStart: Failed to Start Service");
+         } else {
+             Log.d(LOGTAG, "onStart: Start Service completed successfully");
          }
-      }catch (RemoteException e) {
-         e.printStackTrace();
-      }
-      if(isSleepTimerActive()) {
-          Log.d(LOGTAG, "isSleepTimerActive is true");
-          try {
-            if (null != mService) {
-                mService.cancelDelayedStop(FMRadioService.STOP_SERVICE);
-            }
-          } catch (Exception e) {
-            e.printStackTrace();
-          }
-          initiateSleepThread();
-      }
-      if(isRecording()) {
-          Log.d(LOGTAG,"isRecordTimerActive is true");
-          try {
-            if (null != mService) {
-                mService.cancelDelayedStop(FMRadioService.STOP_RECORD);
-            }
-          }catch (Exception e) {
-            e.printStackTrace();
-          }
-          if(isRecording()) {
-              initiateRecordThread();
-          }
+         registerFMSettingListner();
       }
       mPrefs.Load();
       if (mPicker != null) {
@@ -535,6 +490,40 @@
    @Override
    public void onResume() {
       super.onResume();
+      try {
+         if(mService != null) {
+            mService.registerCallbacks(mServiceCallbacks);
+         }
+      }catch (RemoteException e) {
+         e.printStackTrace();
+      }
+      if(isSleepTimerActive()) {
+          Log.d(LOGTAG, "isSleepTimerActive is true");
+          try {
+               if(null != mService) {
+                  mService.cancelDelayedStop(FMRadioService.STOP_SERVICE);
+               }
+               if(null != mSleepUpdateHandlerThread) {
+                  mSleepUpdateHandlerThread.interrupt();
+               }
+          }catch (Exception e) {
+               e.printStackTrace();
+          }
+          initiateSleepThread();
+      }
+      if(isRecording()) {
+          Log.d(LOGTAG,"isRecordTimerActive is true");
+          try {
+            if (null != mService) {
+                mService.cancelDelayedStop(FMRadioService.STOP_RECORD);
+            }
+          }catch (Exception e) {
+            e.printStackTrace();
+          }
+          if(isRecording()) {
+              initiateRecordThread();
+          }
+      }
       Log.d(LOGTAG, "FMRadio: onResume");
       mStereo = FmSharedPreferences.getLastAudioMode();
       mHandler.post(mUpdateProgramService);
@@ -2305,13 +2294,33 @@
                                                 "SleepUpdateThread");
       }
       /* If the thread state is "new" then the thread has not yet started */
-      if (mSleepUpdateHandlerThread.getState() == Thread.State.NEW) {
-         mSleepUpdateHandlerThread.start();
+      if(mSleepUpdateHandlerThread.getState() == Thread.State.NEW && isFmOn()) {
+          try {
+              if((mService != null) &&
+                 !mService.isSleepTimerActive()) {
+                 long timeNow = ((SystemClock.elapsedRealtime()));
+                 if(timeNow < mSleepAtPhoneTime) {
+                    mService.delayedStop((mSleepAtPhoneTime - timeNow),
+                                            FMRadioService.STOP_SERVICE);
+                 }
+              }
+              mSleepUpdateHandlerThread.start();
+          }catch(Exception e) {
+              e.printStackTrace();
+          }
       }
    }
 
    private void endSleepTimer() {
       mSleepAtPhoneTime = 0;
+      try {
+           if(mService != null) {
+              mService.cancelDelayedStop(FMRadioService.STOP_SERVICE);
+           }
+      }catch(RemoteException e) {
+           e.printStackTrace();
+      }
+
       if(null != mSleepUpdateHandlerThread) {
          mSleepUpdateHandlerThread.interrupt();
       }
@@ -2333,8 +2342,16 @@
 
    private boolean isSleepTimerActive() {
       boolean active = false;
-      if (mSleepAtPhoneTime > 0) {
-          active = true;
+      try {
+          if((mService != null)
+             && (mService.isSleepTimerActive())
+             && (mSleepAtPhoneTime > 0)) {
+             active = true;
+             Log.d(LOGTAG, "Sleeptimer is active");
+          }else {
+          }
+      }catch(RemoteException e) {
+          e.printStackTrace();
       }
       return active;
    }
@@ -2407,6 +2424,7 @@
                 Thread.sleep(500);
                 Message statusUpdate = new Message();
                 statusUpdate.what = SLEEPTIMER_UPDATE;
+                Log.d(LOGTAG, "SLEEP TIMER UPDATE");
                 mUIUpdateHandlerHandler.sendMessage(statusUpdate);
                 sleepTimerExpired = hasSleepTimerExpired();
             }catch (Exception ex) {
@@ -2901,6 +2919,7 @@
             mCallback.onServiceDisconnected(className);
          }
          sService = null;
+         mService = null;
       }
    }
 
@@ -2924,6 +2943,9 @@
             if (isRecording()) {
                 initiateRecordThread();
             }
+            if(isSleepTimerActive()) {
+               initiateSleepThread();
+            }
             return;
          }else {
             Log.e(LOGTAG, "IFMRadioService onServiceConnected failed");
@@ -2937,6 +2959,10 @@
          finish();
       }
       public void onServiceDisconnected(ComponentName classname) {
+         Log.d(LOGTAG, "Service got disconnected");
+         unbindFromService(FMRadio.this);
+         mService = null;
+         sService = null;
       }
    };
 
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 5ecb5be..b162627 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -100,6 +100,7 @@
    private BroadcastReceiver mSdcardUnmountReceiver = null;
    private BroadcastReceiver mMusicCommandListener = null;
    private BroadcastReceiver mSleepExpiredListener = null;
+   private boolean mSleepActive = false;
    private BroadcastReceiver mRecordTimeoutListener = null;
    private BroadcastReceiver mDelayedServiceStopListener = null;
    private boolean mOverA2DP = false;
@@ -649,7 +650,7 @@
    @Override
    public void onRebind(Intent intent) {
       mDelayedStopHandler.removeCallbacksAndMessages(null);
-      cancelAlarms();
+      cancelAlarmDealyedServiceStop();
       mServiceInUse = true;
       /* Application/UI is attached, so get out of lower power mode */
       setLowPowerMode(false);
@@ -663,7 +664,7 @@
       // make sure the service will shut down on its own if it was
       // just started but not bound to and nothing is playing
       mDelayedStopHandler.removeCallbacksAndMessages(null);
-      cancelAlarms();
+      cancelAlarmDealyedServiceStop();
       setAlarmDelayedServiceStop();
    }
 
@@ -1475,6 +1476,10 @@
       {
            return (mService.get().getRecordingStartTime());
       }
+      public boolean isSleepTimerActive()
+      {
+           return (mService.get().isSleepTimerActive());
+      }
    }
    private final IBinder mBinder = new ServiceStub(this);
 
@@ -2892,12 +2897,14 @@
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
        Log.d(LOGTAG, "delayedStop called" + SystemClock.elapsedRealtime() + duration);
        am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + duration, pi);
+       mSleepActive = true;
    }
    private void cancelAlarmSleepExpired() {
        Intent i = new Intent(SLEEP_EXPIRED_ACTION);
        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
        am.cancel(pi);
+       mSleepActive = false;
    }
    private void setAlarmRecordTimeout(long duration) {
        Intent i = new Intent(RECORD_EXPIRED_ACTION);
@@ -2939,6 +2946,10 @@
    public long getRecordingStartTime() {
       return mSampleStart;
    }
+
+   public boolean isSleepTimerActive() {
+      return mSleepActive;
+   }
    //handling the sleep and record stop when FM App not in focus
    private void delayedStop(long duration, int nType) {
        int whatId = (nType == STOP_SERVICE) ? STOPSERVICE_ONSLEEP: STOPRECORD_ONTIMEOUT;
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index fe54124..2f6f1e3 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -71,5 +71,6 @@
     int getAfJmpRmssiSamplesCnt();
     boolean setRxRepeatCount(int count);
     long getRecordingStartTime();
+    boolean isSleepTimerActive();
 }
 
