diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index 5ba27c8..7d6ab0d 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -41,6 +41,7 @@
 import android.net.wifi.WifiManager;
 import android.content.IntentFilter;
 import android.bluetooth.BluetoothAdapter;
+import java.lang.Object;
 
 /**
  * This class contains all interfaces and types needed to
@@ -439,6 +440,8 @@
            }
        }
    };
+   private volatile int mState;
+   public static Object mLockObject = new Object();
 
    /**
     * Constructor for the receiver Object
@@ -446,7 +449,7 @@
    public FmReceiver(){
       mControl = new FmRxControls();
       mRdsData = new FmRxRdsData (sFd);
-      mRxEvents = new FmRxEventListner();
+      mRxEvents = new FmRxEventListner(this);
    }
 
    /**
@@ -461,7 +464,7 @@
    public FmReceiver(String devicePath,
                      FmRxEvCallbacksAdaptor callback) throws InstantiationException {
       mControl = new FmRxControls();
-      mRxEvents = new FmRxEventListner();
+      mRxEvents = new FmRxEventListner(this);
 
       Log.e(TAG, "FmReceiver constructor");
       //registerClient(callback);
@@ -576,22 +579,32 @@
        * Check for FM State.
        * If FMRx already on, then return.
       */
-      int state = getFMState();
+
+      int mState = getFMState();
 
       mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
       mBtIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
 
-      if (state == FMState_Rx_Turned_On || state == FMState_Srch_InProg) {
+      if (mState == FMState_Rx_Turned_On || mState == FMState_Srch_InProg) {
+
          Log.d(TAG, "enable: FM already turned On and running");
          return status;
-      }else if (state == subPwrLevel_FMTurning_Off) {
+      }else if (mState == subPwrLevel_FMTurning_Off) {
          Log.v(TAG, "FM is in the process of turning off.Pls wait for sometime.");
-         return status;
-      }else if (state == subPwrLevel_FMRx_Starting) {
+         synchronized(mLockObject){
+                try {
+                    if (getFMState() != FMState_Turned_Off) {
+                        mLockObject.wait();
+                    }
+                } catch (InterruptedException e) {
+                    Log.e(TAG, "Error in waiting on mLockObject" + e);
+                }
+         }
+      }else if (mState == subPwrLevel_FMRx_Starting) {
          Log.v(TAG, "FM is in the process of turning On.Pls wait for sometime.");
          return status;
-      }else if ((state == FMState_Tx_Turned_On)
-                || (state == subPwrLevel_FMTx_Starting)) {
+      }else if ((mState == FMState_Tx_Turned_On)
+                || (mState == subPwrLevel_FMTx_Starting)) {
          Log.v(TAG, "FM Tx is turned on or in the process of turning on.");
          return status;
       }
diff --git a/qcom/fmradio/FmRxEventListner.java b/qcom/fmradio/FmRxEventListner.java
index 0ad7c0c..9c9bba2 100644
--- a/qcom/fmradio/FmRxEventListner.java
+++ b/qcom/fmradio/FmRxEventListner.java
@@ -59,8 +59,13 @@
     }
 
     private Thread mThread;
+    private FmReceiver mReceiver;
     private static final String TAG = "FMRadio";
 
+    public FmRxEventListner(FmReceiver receiver) {
+        mReceiver = receiver;
+    }
+
     public void startListner (final int fd, final FmRxEvCallbacks cb) {
         /* start a thread and listen for messages */
         mThread = new Thread(){
@@ -213,11 +218,14 @@
                             case 18:
                                 Log.d(TAG, "Got RADIO_DISABLED");
                                 if (FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMTurning_Off) {
-                                    FmTransceiver.release("/dev/radio0");
-                                    cb.FmRxEvDisableReceiver();
-                                    /*Set the state as FMOff */
-                                    FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off);
-                                    Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff");
+                                    synchronized(FmReceiver.mLockObject) {
+                                        FmTransceiver.release("/dev/radio0");
+                                        cb.FmRxEvDisableReceiver();
+                                        /*Set the state as FMOff */
+                                        FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off);
+                                        Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff");
+                                        FmReceiver.mLockObject.notify();
+                                    }
                                     Thread.currentThread().interrupt();
                                 } else {
                                     Log.d(TAG, "Unexpected RADIO_DISABLED recvd");
