diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 909a14c0f63c73d291a2f4af2f4bc7d6be31916d..ee8ef3d5037407a5e6b4ef84280eaccea5eb55a2 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -218,6 +218,7 @@ public class FMRadio extends Activity
    /* Bottom row in the station info layout */
    private TextView mRadioTextTV;
    private TextView mERadioTextTV;
+   private TextView mEContryCodeTV;
 
    /* Sleep and Recording Messages */
    private TextView mSleepMsgTV;
@@ -2805,6 +2806,26 @@ public class FMRadio extends Activity
       }
    };
 
+   Runnable mUpdateExtenCountryCode = new Runnable() {
+      public void run() {
+         String str = "";
+         int value;
+         if ((mService != null) && isFmOn()) {
+            try {
+               /* Get Extended Radio Text and update the display */
+               value = mService.getExtenCountryCode();
+               str = Integer.toString(value);
+               Log.d(LOGTAG, "mUpdateExtenCountryCode: Updatable string: [" + str + "]");
+               mERadioTextTV.setText(str);
+               mERadioTextScroller.mOriginalString = str;
+               mERadioTextScroller.startScroll();
+            }catch (RemoteException e) {
+               e.printStackTrace();
+            }
+         }
+      }
+   };
+
    /* Create runnable for posting */
    Runnable mUpdateProgramService = new Runnable() {
       public void run() {
@@ -3124,6 +3145,9 @@ public class FMRadio extends Activity
       public void onExtenRadioTextChanged() {
          mHandler.post(mUpdateExtenRadioText);
       }
+      public void onExtenCountryCodeChanged() {
+         mHandler.post(mUpdateExtenCountryCode);
+      }
       public void onAlternateFrequencyChanged() {
          Log.d(LOGTAG, "mServiceCallbacks.onAlternateFrequencyChanged :");
       }
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index 65f33cb454392d5d45203183ffca9d81d375990a..f4b24fb7f9846506405b4d2214ebaa05b7fac4fb 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -2043,6 +2043,10 @@ public class FMRadioService extends Service
          return(mService.get().isA2DPConnected());
       }
 
+      public int getExtenCountryCode()
+      {
+         return(mService.get().getExtenCountryCode());
+      }
    }
    private final IBinder mBinder = new ServiceStub(this);
 
@@ -2741,6 +2745,16 @@ public class FMRadioService extends Service
       Log.d(LOGTAG, "eRadio Text:[" + str +"]");
       return str;
    }
+   public int  getExtenCountryCode() {
+      int val = 0;
+      if (mFMRxRDSData != null)
+      {
+         val = mFMRxRDSData.getECountryCode();
+      }
+      Log.d(LOGTAG, "eCountry Code :[" + val +"]");
+      return val;
+   }
+
    /* Retrieves the RDS Program Type (PTY) code.
     *
     * @return int - RDS PTY code.
@@ -3295,6 +3309,19 @@ public class FMRadioService extends Service
              e.printStackTrace();
          }
       }
+      public void FmRxEvECCInfo()
+      {
+         Log.d(LOGTAG, "FmRxEvECCInfo");
+         try {
+             if (mReceiver != null) {
+                mFMRxRDSData = mReceiver.getECCInfo();
+                if(mCallbacks != null)
+                   mCallbacks.onExtenCountryCodeChanged();
+             }
+         } catch (RemoteException e) {
+             e.printStackTrace();
+         }
+      }
       public void FmRxEvRdsPiMatchAvailable()
       {
          Log.d(LOGTAG, "FmRxEvRdsPiMatchAvailable");
diff --git a/fmapp2/src/com/caf/fmradio/FMStats.java b/fmapp2/src/com/caf/fmradio/FMStats.java
index c035475b245b77d99737be43d4183d5df1050f2a..75ba4c686f9f13e810f00c9667e0c1833297e461 100644
--- a/fmapp2/src/com/caf/fmradio/FMStats.java
+++ b/fmapp2/src/com/caf/fmradio/FMStats.java
@@ -2657,6 +2657,10 @@ public class FMStats extends Activity  {
           {
              Log.d(LOGTAG, "Extended Radio Text changed:");
           }
+          public void onExtenCountryCodeChanged()
+          {
+             Log.d(LOGTAG, "Extended ountry Code  changed:");
+          }
           public void onAlternateFrequencyChanged()
           {
              Log.d(LOGTAG, "mServiceCallbacks.onAlternateFrequencyChanged :");
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
index a02c59350b0f194a1b3b88a5acc347f9ed2426e4..766961adab914077c0979345ac8ee748c085f903 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioService.aidl
@@ -53,6 +53,7 @@ interface IFMRadioService
     boolean setIntfDetLowTh(int intfLowTh);
     boolean setIntfDetHighTh(int intfHighTh);
     String getExtenRadioText();
+    int getExtenCountryCode();
     int getSinrSamplesCnt();
     int getSinrTh();
     int getSearchAlgoType();
diff --git a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
index 24aaa7001be7a5c70651f52056ccc9580934b14e..826b5f3b5fdfb1a581511d4a339c959f3739d27c 100644
--- a/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
+++ b/fmapp2/src/com/caf/fmradio/IFMRadioServiceCallbacks.aidl
@@ -50,4 +50,5 @@ interface IFMRadioServiceCallbacks
   void onA2DPConnectionstateChanged(boolean state);
   void onFmAudioPathStarted();
   void onFmAudioPathStopped();
+  void onExtenCountryCodeChanged();
 }
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 5c21bdd59576144b7b1466bc1de2ceb939064d28..98452d800d4b02005fd9dff9b886e917c4128f64 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -163,6 +163,7 @@ typedef void (*rds_grp_cntrs_cb)(char *rds_params);
 typedef void (*fm_peek_cb)(char *peek_rsp);
 typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
 typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
+typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
 
 typedef struct {
     size_t  size;
@@ -185,6 +186,7 @@ typedef struct {
     fm_peek_cb fm_peek_rsp_cb;
     fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
     fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
+    fm_ecc_evt_cb	ext_country_code_cb;
     callback_thread_event thread_evt_cb;
 } fm_vendor_callbacks_t;
 
@@ -501,6 +503,8 @@ struct hci_fm_blend_table {
 #define HCI_EV_SEARCH_COMPLETE          0x12
 #define HCI_EV_SEARCH_RDS_COMPLETE      0x13
 #define HCI_EV_SEARCH_LIST_COMPLETE     0x14
+
+#define HCI_EV_EXT_COUNTRY_CODE         0x17
 #define HCI_EV_RADIO_TEXT_PLUS_ID       0x18
 #define HCI_EV_RADIO_TEXT_PLUS_TAG      0x19
 #define HCI_EV_HW_ERR_EVENT             0x1A
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index fd673ab486cdca5954644f0a5533d0e9dbe17ddf..561c92af8aa5989c1e3dd4674018fccf7606e8f5 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -558,6 +558,28 @@ static void hci_ev_rt_plus_tag(char *buff)
      }
 }
 
+static void  hci_ev_ext_country_code(char *buff)
+{
+    char *data = NULL;
+    int len = 15;
+    ALOGD("%s:%s: start", LOG_TAG, __func__);
+    data = malloc(len);
+    if (data != NULL) {
+        data[0] = len;
+        ALOGI("%s:%s: data length=%d\n", LOG_TAG, __func__,data[0]);
+        data[1] = buff[RDS_PTYPE];
+        data[2] = buff[RDS_PID_LOWER];
+        data[3] = buff[RDS_PID_HIGHER];
+        data[4] = buff[3];
+        memcpy(&data[RDS_OFFSET], &buff[4], len-RDS_OFFSET);
+        // data[len] = 0x00;
+        jni_cb->ext_country_code_cb(data);
+        free(data);
+    } else {
+        ALOGE("%s:memory allocation failed\n", LOG_TAG);
+    }
+}
+
 static void hci_ev_ert()
 {
     char *data = NULL;
@@ -770,9 +792,12 @@ void radio_hci_event_packet(char *evt_buf)
     case HCI_EV_RADIO_TEXT_PLUS_TAG:
         hci_ev_rt_plus_tag(((FM_EVT_HDR *)evt_buf)->cmd_params);
         break;
+    case HCI_EV_EXT_COUNTRY_CODE:
+        hci_ev_ext_country_code(((FM_EVT_HDR *)evt_buf)->cmd_params);
+        break;
     case HCI_EV_HW_ERR_EVENT:
-	    hci_ev_hw_error(((FM_EVT_HDR *)evt_buf)->cmd_params);
-	    break;
+        hci_ev_hw_error(((FM_EVT_HDR *)evt_buf)->cmd_params);
+        break;
     default:
         break;
     }
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index 53e757a3998d13da933d49358cfd6ea4d8421d46..21528bbf70ed1dbc3097d3b0aa55c37d31e0c505 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -78,7 +78,6 @@ enum search_dir_t {
     SCAN_DN
 };
 
-
 static JNIEnv *g_jEnv = NULL;
 static JavaVM *g_jVM = NULL;
 
@@ -89,7 +88,6 @@ char *FM_LIBRARY_NAME = "fm_helium.so";
 char *FM_LIBRARY_SYMBOL_NAME = "FM_HELIUM_LIB_INTERFACE";
 void *lib_handle;
 
-
 typedef void (*enb_result_cb)();
 typedef void (*tune_rsp_cb)(int Freq);
 typedef void (*seek_rsp_cb)(int Freq);
@@ -109,6 +107,7 @@ typedef void (*rds_grp_cntrs_cb)(char *rds_params);
 typedef void (*fm_peek_cb)(char *peek_rsp);
 typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
 typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
+typedef void (*fm_ecc_evt_cb)(char *ecc);
 
 static JNIEnv *mCallbackEnv = NULL;
 static jobject mCallbacksObj = NULL;
@@ -120,6 +119,7 @@ static jmethodID method_rtCallback;
 static jmethodID method_ertCallback;
 static jmethodID method_aflistCallback;
 static jmethodID method_rtplusCallback;
+static jmethodID method_eccCallback;
 
 jmethodID method_enableCallback;
 jmethodID method_tuneCallback;
@@ -289,7 +289,7 @@ void fm_rt_plus_update_cb(char *rt_plus)
 
 void fm_ert_update_cb(char *ert)
 {
-    ALOGE("ERT_EVT");
+    ALOGI("ERT_EVT");
     jbyteArray ert_buff = NULL;
     int i,len;
 
@@ -301,19 +301,44 @@ void fm_ert_update_cb(char *ert)
     len = (int)(ert[0] & 0xFF);
     len = len+3;
 
-    ALOGE(" ert data len=%d :",len);
+    ALOGI(" ert data len=%d :",len);
     ert_buff = mCallbackEnv->NewByteArray(len);
     if (ert_buff == NULL) {
-        ALOGE(" ps data allocate failed :");
+        ALOGE(" ert data allocate failed :");
         return;
     }
 
     mCallbackEnv->SetByteArrayRegion(ert_buff, 0, len,(jbyte *)ert);
-    jbyte* bytes= mCallbackEnv->GetByteArrayElements(ert_buff,0);
+   // jbyte* bytes= mCallbackEnv->GetByteArrayElements(ert_buff,0);
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_ertCallback,ert_buff);
     mCallbackEnv->DeleteLocalRef(ert_buff);
 }
 
+void fm_ext_country_code_cb(char *ecc)
+{
+    ALOGI("Extended Contry code ");
+    jbyteArray ecc_buff = NULL;
+    int i,len;
+
+    if (!checkCallbackThread()) {
+        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+        return;
+    }
+
+    len = (int)(ecc[0] & 0xFF);
+
+    ALOGI(" ecc data len=%d :",len);
+    ecc_buff = mCallbackEnv->NewByteArray(len);
+    if (ecc_buff == NULL) {
+        ALOGE(" ecc data allocate failed :");
+        return;
+    }
+    mCallbackEnv->SetByteArrayRegion(ecc_buff, 0, len,(jbyte *)ecc);
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_eccCallback,ecc_buff);
+    mCallbackEnv->DeleteLocalRef(ecc_buff);
+}
+
+
 void rds_grp_cntrs_rsp_cb(char * evt_buffer)
 {
    ALOGE("rds_grp_cntrs_rsp_cb");
@@ -376,6 +401,7 @@ typedef struct {
    fm_peek_cb fm_peek_rsp_cb;
    fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
    fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
+   fm_ecc_evt_cb   ext_country_code_cb;
    callback_thread_event thread_evt_cb;
 } fm_vendor_callbacks_t;
 
@@ -407,6 +433,7 @@ static   fm_vendor_callbacks_t fm_callbacks = {
     fm_peek_rsp_cb,
     fm_ssbi_peek_rsp_cb,
     fm_ch_det_th_rsp_cb,
+    fm_ext_country_code_cb,
     fm_thread_evt_cb
 };
 #endif
@@ -1336,7 +1363,6 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
 
     ALOGI("ClassInit native called \n");
 #ifdef FM_SOC_TYPE_CHEROKEE
-
     jclass dataClass = env->FindClass("qcom/fmradio/FmReceiverJNI");
     javaClassRef = (jclass) env->NewGlobalRef(dataClass);
     lib_handle = dlopen(FM_LIBRARY_NAME, RTLD_NOW);
@@ -1344,7 +1370,7 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
         ALOGE("%s unable to open %s: %s", __func__, FM_LIBRARY_NAME, dlerror());
         goto error;
     }
-    ALOGE("Opened %s shared object library successfully", FM_LIBRARY_NAME);
+    ALOGI("Opened %s shared object library successfully", FM_LIBRARY_NAME);
 
     ALOGI("Obtaining handle: '%s' to the shared object library...", FM_LIBRARY_SYMBOL_NAME);
     vendor_interface = (fm_interface_t *)dlsym(lib_handle, FM_LIBRARY_SYMBOL_NAME);
@@ -1356,9 +1382,9 @@ static void classInitNative(JNIEnv* env, jclass clazz) {
     method_psInfoCallback = env->GetMethodID(javaClassRef, "PsInfoCallback", "([B)V");
     method_rtCallback = env->GetMethodID(javaClassRef, "RtCallback", "([B)V");
     method_ertCallback = env->GetMethodID(javaClassRef, "ErtCallback", "([B)V");
+    method_eccCallback = env->GetMethodID(javaClassRef, "EccCallback", "([B)V");
     method_rtplusCallback = env->GetMethodID(javaClassRef, "RtPlusCallback", "([B)V");
     method_aflistCallback = env->GetMethodID(javaClassRef, "AflistCallback", "([B)V");
-    ALOGI("method_psInfoCallback: '%p' env =%p...", method_psInfoCallback, env);
     method_enableCallback = env->GetMethodID(javaClassRef, "enableCallback", "()V");
     method_tuneCallback = env->GetMethodID(javaClassRef, "tuneCallback", "(I)V");
     method_seekCmplCallback = env->GetMethodID(javaClassRef, "seekCmplCallback", "(I)V");
@@ -1390,9 +1416,8 @@ static void initNative(JNIEnv *env, jobject object) {
             ALOGE("%s unable to initialize vendor library: %d", __func__, status);
             return;
         }
-        ALOGE("***** FM HAL Initialization complete *****\n");
+        ALOGI("***** FM HAL Initialization complete *****\n");
     }
-    ALOGE("object =%p, env = %p\n",object,env);
     mCallbacksObj = env->NewGlobalRef(object);
 #endif
 }
@@ -1485,7 +1510,7 @@ jint JNI_OnLoad(JavaVM *jvm, void *reserved)
     int status;
     g_jVM = jvm;
 
-    ALOGE("FM : Loading QCOMM FM-JNI");
+    ALOGI("FM : Loading QCOMM FM-JNI");
     if (jvm->GetEnv((void **)&e, JNI_VERSION_1_6)) {
         ALOGE("JNI version mismatch error");
         return JNI_ERR;
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index 95a8c5e2b5ace0009f111ee3ac86bca83906c7ce..8e681e7d60ebe63817727f096aaa1efbd13d410e 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -1600,6 +1600,21 @@ public class FmReceiver extends FmTransceiver
       return mRdsData;
    }
 
+   public FmRxRdsData getECCInfo() {
+      byte [] raw_ecc = new byte[STD_BUF_SIZE];
+      int ecc_code =0;
+      int bytes_read;
+
+      raw_ecc = FmReceiverJNI.getPsBuffer(raw_ecc);
+      bytes_read = raw_ecc[0];
+      Log.d (TAG, "bytes_read = " + bytes_read);
+      if (bytes_read > 0) {
+          ecc_code =  raw_ecc[9] & 0xFF;
+          mRdsData.setECountryCode(ecc_code);
+          Log.d(TAG, "ECC code: " + ecc_code );
+      }
+      return mRdsData;
+   }
    /*==============================================================
    FUNCTION:  getAFInfo
    ==============================================================*/
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index 1cafe37f41ff2c01163cb57e40a603b40e53c43e..d085476b211bef457e9976be691c7fcafa52d6a8 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -113,6 +113,17 @@ class FmReceiverJNI {
         Log.d(TAG, "RtCallback exit " );
     }
 
+    public void EccCallback(byte[] ecc) {
+        Log.i(TAG, "EccCallback enter " );
+        if (ecc == null) {
+            Log.e(TAG, "ECC null return  ");
+            return;
+        }
+        mRdsBuffer = Arrays.copyOf(ecc, ecc.length);
+        FmReceiver.mCallback.FmRxEvECCInfo();
+        Log.i(TAG, "EccCallback exit " );
+    }
+
     public void PsInfoCallback(byte[] psInfo) {
         Log.d(TAG, "PsInfoCallback enter " );
         if (psInfo == null) {
diff --git a/qcom/fmradio/FmRxEvCallbacks.java b/qcom/fmradio/FmRxEvCallbacks.java
index 50d2fb2c3552df9619a481d4fdf109286cb1307c..267d73df0a4665aa049b3c1078e9e9e17b91d7d1 100644
--- a/qcom/fmradio/FmRxEvCallbacks.java
+++ b/qcom/fmradio/FmRxEvCallbacks.java
@@ -46,4 +46,5 @@ interface FmRxEvCallbacks {
     public void FmRxEvRdsAfInfo();
     public void FmRxEvRTPlus();
     public void FmRxEvERTInfo();
+    public void FmRxEvECCInfo();
 }
diff --git a/qcom/fmradio/FmRxEvCallbacksAdaptor.java b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
index 458ff59e393c3e942cc48b5518a101ef9fc5cad6..753d506330469264a9b077b1e68bae0c7a5043a1 100644
--- a/qcom/fmradio/FmRxEvCallbacksAdaptor.java
+++ b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
@@ -51,5 +51,6 @@ public class FmRxEvCallbacksAdaptor implements FmRxEvCallbacks {
     public void FmRxEvRdsAfInfo() {};
     public void FmRxEvRTPlus() {};
     public void FmRxEvERTInfo() {};
+    public void FmRxEvECCInfo() {};
 }
 
diff --git a/qcom/fmradio/FmRxRdsData.java b/qcom/fmradio/FmRxRdsData.java
index f0e5b9ed0befd95cf5fbbfbcf1442b53bb6453a3..1f722f1aee56ad375ca1cdcb534a9fe74e037ce1 100644
--- a/qcom/fmradio/FmRxRdsData.java
+++ b/qcom/fmradio/FmRxRdsData.java
@@ -50,6 +50,7 @@ public class FmRxRdsData {
     private int mPrgmId;
     private int mPrgmType;
     private int mFd;
+    private int mECountryCode;
 
     /* V4L2 controls */
     private static final int V4L2_CID_PRIVATE_BASE = 0x8000000;
@@ -216,6 +217,12 @@ public class FmRxRdsData {
     public void setERadioText (String x) {
          mERadioText = x;
     }
+    public void setECountryCode(int x) {
+         mECountryCode = x;
+    }
+    public int getECountryCode() {
+         return mECountryCode;
+    }
     public boolean getFormatDir() {
          return formatting_dir;
     }