diff --git a/FMRecord/res/values/customize.xml b/FMRecord/res/values/customize.xml
new file mode 100644
index 0000000..1ef358c
--- /dev/null
+++ b/FMRecord/res/values/customize.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (c) 2014, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of The Linux Foundation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- enabled the prefix of recordings files name or not,default value is false -->
+    <bool name="def_save_name_prefix_enabled">false</bool>
+
+    <!-- the prefix of recordings files name.File name like this "FM-yyyy-MM-dd-HH-mm-ss.3gpp" -->
+    <string name="def_save_name_prefix" translatable="false">FM</string>
+
+    <!-- enabled the name format of recordings files or not,default value is false -->
+    <bool name="def_save_name_format_enabled">false</bool>
+
+    <!-- the name format of recordings files -->
+    <string name="def_save_name_format" translatable="false">yyyy-MM-dd-HH-mm-ss</string>
+
+    <!-- the save path of recordings files -->
+    <string name="def_fmRecord_savePath" translatable="false">/SoundRecorder</string>
+
+    <!-- the suffix of recordings files.default value is ".3gpp" -->
+    <string name="def_save_name_suffix" translatable="false">.3gpp</string>
+
+</resources>
diff --git a/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java b/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
index e101584..2aa1684 100644
--- a/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
+++ b/FMRecord/src/com/codeaurora/fmrecording/FMRecordingService.java
@@ -233,11 +233,25 @@
         mSampleFile = null;
         File sampleDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/FMRecording");
 
+        if (getResources().getBoolean(R.bool.def_save_name_prefix_enabled)) {
+            String fmRecordSavePath = getApplicationContext().getResources()
+                    .getString(R.string.def_fmRecord_savePath);
+            sampleDir = new File(Environment.getExternalStorageDirectory().toString()
+                    + fmRecordSavePath);
+            if (!sampleDir.exists()) {
+                sampleDir.mkdirs();
+            }
+        }
         if(!(sampleDir.mkdirs() || sampleDir.isDirectory()))
             return false;
 
         try {
              mSampleFile = File.createTempFile("FMRecording", ".3gpp", sampleDir);
+            if (getResources().getBoolean(R.bool.def_save_name_format_enabled)) {
+                String suffix = getResources().getString(R.string.def_save_name_suffix);
+                suffix = "".equals(suffix) ? ".3gpp" : suffix;
+                mSampleFile = createTempFile("FMRecording", suffix, sampleDir);
+            }
         } catch (IOException e) {
              Log.e(TAG, "Not able to access SD Card");
              Toast.makeText(this, "Not able to access SD Card", Toast.LENGTH_SHORT).show();
@@ -602,4 +616,30 @@
        }
    }
 
+    public File createTempFile(String prefix, String suffix, File directory)
+            throws IOException {
+        prefix = getResources().getString(R.string.def_save_name_prefix) + '-';
+        // Force a prefix null check first
+        if (prefix.length() < 3) {
+            throw new IllegalArgumentException("prefix must be at least 3 characters");
+        }
+        if (suffix == null) {
+            suffix = ".tmp";
+        }
+        File tmpDirFile = directory;
+        if (tmpDirFile == null) {
+            String tmpDir = System.getProperty("java.io.tmpdir", ".");
+            tmpDirFile = new File(tmpDir);
+        }
+
+        String nameFormat = getResources().getString(R.string.def_save_name_format);
+        SimpleDateFormat df = new SimpleDateFormat(nameFormat);
+        String currentTime = df.format(System.currentTimeMillis());
+
+        File result;
+        do {
+            result = new File(tmpDirFile, prefix + currentTime + suffix);
+        } while (!result.createNewFile());
+        return result;
+   }
 }
diff --git a/fmapp2/res/values/arrays.xml b/fmapp2/res/values/arrays.xml
index 442ffc3..16b48e4 100644
--- a/fmapp2/res/values/arrays.xml
+++ b/fmapp2/res/values/arrays.xml
@@ -38,6 +38,14 @@
     <item>1</item>
   </string-array>
 
+  <string-array name="ster_entries">
+    <item>Stereo</item>
+  </string-array>
+
+  <string-array name="ster_values">
+    <item>0</item>
+  </string-array>
+
   <string-array name="record_durations_entries">
     <item>5 minutes</item>
     <item>15 minutes</item>
diff --git a/fmapp2/res/values/customize.xml b/fmapp2/res/values/customize.xml
new file mode 100644
index 0000000..f24c67c
--- /dev/null
+++ b/fmapp2/res/values/customize.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (c) 2014, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of The Linux Foundation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<resources>
+
+    <!-- enabled the headset button function to seek next station or not,default value is false -->
+    <bool name="def_headset_next_enabled">false</bool>
+
+    <!--
+        customize the the country for fm,
+        default value is false,true is for INDIA
+    -->
+    <bool name="def_fm_country_location_enabled">false</bool>
+
+    <!--
+        customize the the special carrier for fm,
+        default value is false,true is for Micromax
+    -->
+    <bool name="def_fm_special_carrier_enabled">false</bool>
+
+    <!--
+        customize the output list,true is stereo only, false is stereo and mono,
+            default value is false
+    -->
+    <bool name="def_only_stereo_enabled">false</bool>
+
+</resources>
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index f643ec3..71e59ed 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -440,6 +440,12 @@
                          int keycode = event.getKeyCode();
                          switch (keycode) {
                              case KeyEvent.KEYCODE_HEADSETHOOK :
+                                 if (isFmOn() && getResources()
+                                        .getBoolean(R.bool.def_headset_next_enabled)) {
+                                     Log.d(LOGTAG, "enabled the headset button function to seek next station");
+                                     seek(true);
+                                     break;
+                                 }
                                  toggleFM();
                                  if (isOrderedBroadcast()) {
                                      abortBroadcast();
diff --git a/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java b/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
index 1bed45c..2e2aa70 100644
--- a/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
+++ b/fmapp2/src/com/caf/fmradio/FmSharedPreferences.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -39,6 +39,7 @@
 import android.content.SharedPreferences;
 import qcom.fmradio.FmReceiver;
 import qcom.fmradio.FmConfig;
+import android.os.SystemProperties;
 import android.util.Log;
 
 public class FmSharedPreferences
@@ -167,6 +168,7 @@
    private static boolean mAFAutoSwitch = true;
    private static int mRecordDuration = 0;
    private static int mLastAudioMode = -1;
+   private static boolean mSpecialCarrierFlag = false;
 
    FmSharedPreferences(Context context){
       mContext = context.getApplicationContext();
@@ -446,6 +448,8 @@
       {
          return;
       }
+      mSpecialCarrierFlag = mContext.getResources().getBoolean(
+              R.bool.def_fm_special_carrier_enabled);
       SharedPreferences sp = mContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
       mTunedFrequency = sp.getInt(PREF_LAST_TUNED_FREQUENCY, DEFAULT_NO_FREQUENCY);
       mRecordDuration = sp.getInt(LAST_RECORD_DURATION, RECORD_DUR_INDEX_0_VAL);
@@ -498,6 +502,9 @@
       /* Load Configuration */
       if (Locale.getDefault().equals(Locale.CHINA)) {
           setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_CHINA));
+        } else if (mContext.getResources()
+                .getBoolean(R.bool.def_fm_country_location_enabled)) {
+            setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_INDIA));
       } else {
           setCountry(sp.getInt(FMCONFIG_COUNTRY, REGIONAL_BAND_NORTH_AMERICA));
       }
@@ -929,9 +936,15 @@
         }
         case REGIONAL_BAND_INDIA:
         {
-          /*INDIA : 91000 TO 106400 IN 100 KHZ STEPS*/
-          mFMConfiguration.setLowerLimit(91000);
-          mFMConfiguration.setUpperLimit(106400);
+          if (mSpecialCarrierFlag) {
+              /*87500 TO 108000 IN 100 KHZ STEPS*/
+              mFMConfiguration.setLowerLimit(87500);
+              mFMConfiguration.setUpperLimit(108000);
+          } else {
+              /*91000 TO 106400 IN 100 KHZ STEPS*/
+              mFMConfiguration.setLowerLimit(91000);
+              mFMConfiguration.setUpperLimit(106400);
+          }
           mFrequencyBand_Stepsize = 100;
           break;
         }
diff --git a/fmapp2/src/com/caf/fmradio/Settings.java b/fmapp2/src/com/caf/fmradio/Settings.java
index 83df2e1..e6adb21 100644
--- a/fmapp2/src/com/caf/fmradio/Settings.java
+++ b/fmapp2/src/com/caf/fmradio/Settings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -158,22 +158,32 @@
            root.addPreference(mUserBandMinPref);
            root.addPreference(mUserBandMaxPref);
 
+           boolean audiomode = FmSharedPreferences.getAudioOutputMode();
            if (mRxMode) {
                // Audio Output (Stereo or Mono)
-               summaryAudioModeItems = getResources().getStringArray(
-                                        R.array.ster_mon_entries);
-               mAudioPreference = new ListPreference(this);
-               mAudioPreference.setEntries(R.array.ster_mon_entries);
-               mAudioPreference.setEntryValues(R.array.ster_mon_values);
+               if (getResources().getBoolean(R.bool.def_only_stereo_enabled)) {
+                   summaryAudioModeItems = getResources()
+                           .getStringArray(R.array.ster_entries);
+                   mAudioPreference = new ListPreference(this);
+                   mAudioPreference.setEntries(R.array.ster_entries);
+                   mAudioPreference.setEntryValues(R.array.ster_values);
+                   index = 0;
+               } else {
+                   summaryAudioModeItems = getResources()
+                           .getStringArray(R.array.ster_mon_entries);
+                   mAudioPreference = new ListPreference(this);
+                   mAudioPreference.setEntries(R.array.ster_mon_entries);
+                   mAudioPreference.setEntryValues(R.array.ster_mon_values);
+                   if (audiomode) {
+                      index = 0;
+                   } else {
+                      index = 1;
+                   }
+               }
                mAudioPreference.setDialogTitle(R.string.sel_audio_output);
                mAudioPreference.setKey(AUDIO_OUTPUT_KEY);
                mAudioPreference.setTitle(R.string.aud_output_mode);
-               boolean audiomode = FmSharedPreferences.getAudioOutputMode();
-               if (audiomode) {
-                   index = 0;
-               } else {
-                   index = 1;
-               }
+
                Log.d(LOGTAG, "createPreferenceHierarchy: audiomode: " + audiomode);
                mAudioPreference.setSummary(summaryAudioModeItems[index]);
                mAudioPreference.setValueIndex(index);
