diff --git a/ring-android/app/src/main/assets/ringtones/default.wav b/ring-android/app/src/main/assets/ringtones/default.wav
index d4db374267acfd87033482a76fd3115760d98fb9..f68346e5a2df863e1e6741532042db4c173014e0 100644
Binary files a/ring-android/app/src/main/assets/ringtones/default.wav and b/ring-android/app/src/main/assets/ringtones/default.wav differ
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index 3b1d0624d383df4a7399918830de0e1b0ea032ae..7be2dfc876202ce6a9f74bd377df19d4deee741a 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -287,7 +287,7 @@ public class HomeActivity extends AppCompatActivity implements LocalService.Call
     protected void onStart() {
         Log.d(TAG, "onStart");
 
-        String path = getFilesDir().getAbsolutePath() + "/ringtones";
+        String path = FileUtils.ringtonesPath(this);
         if (!(new File(path + "/default.wav")).exists()) {
             Log.d(TAG, "default.wav doesn't exist. Copying ringtones.");
             FileUtils.copyAssetFolder(getAssets(), "ringtones", path);
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
index 5bf01d1bdccdcdba7ea0869aaf2189ae359cc7f0..204546d6c40bd3bd205cb713ccf26e76e8b8ddba 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
@@ -33,6 +33,7 @@ import android.os.RemoteException;
 import android.support.annotation.NonNull;
 import android.support.v13.app.FragmentCompat;
 import android.support.v14.preference.PreferenceFragment;
+import android.support.v14.preference.SwitchPreference;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.preference.Preference;
@@ -61,6 +62,7 @@ public class MediaPreferenceFragment extends PreferenceFragment
 
     private CodecPreference audioCodecsPref = null;
     private CodecPreference videoCodecsPref = null;
+    private SwitchPreference mRingtoneCustom = null;
 
     protected AccountCallbacks mCallbacks = DUMMY_CALLBACKS;
 
@@ -97,6 +99,7 @@ public class MediaPreferenceFragment extends PreferenceFragment
 
     @Override
     public void accountChanged(Account account) {
+        Log.d(TAG, "accountChanged");
         setPreferenceDetails(account.getConfig());
         addPreferenceListener(account.getConfig(), changeAudioPreferenceListener);
         final ArrayList<Codec> audioCodec = new ArrayList<>();
@@ -119,6 +122,8 @@ public class MediaPreferenceFragment extends PreferenceFragment
 
         videoCodecsPref.setCodecs(videoCodec);
         videoCodecsPref.setOnPreferenceChangeListener(changeCodecListener);
+
+        mRingtoneCustom.setOnPreferenceChangeListener(changeAudioPreferenceListener);
     }
 
     @Override
@@ -148,13 +153,17 @@ public class MediaPreferenceFragment extends PreferenceFragment
                 builder.show();
                 Log.d(TAG, "The file is too big " + myFile.length() / 1024);
             } else {
-                findPreference(ConfigKey.RINGTONE_PATH.key()).setSummary(myFile.getName());
-                mCallbacks.getAccount().setDetail(ConfigKey.RINGTONE_PATH, myFile.getAbsolutePath());
-                mCallbacks.saveAccount();
+                setRingtonepath(myFile);
             }
         }
     }
 
+    private void setRingtonepath(File file) {
+        findPreference(ConfigKey.RINGTONE_PATH.key()).setSummary(file.getName());
+        mCallbacks.getAccount().setDetail(ConfigKey.RINGTONE_PATH, file.getAbsolutePath());
+        mCallbacks.saveAccount();
+    }
+
     public void performFileSearch(int requestCodeToSet) {
         Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
         intent.addCategory(Intent.CATEGORY_OPENABLE);
@@ -164,13 +173,19 @@ public class MediaPreferenceFragment extends PreferenceFragment
 
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
+        Log.d(TAG, "onCreatePreferences");
         addPreferencesFromResource(R.xml.account_media_prefs);
         audioCodecsPref = (CodecPreference) findPreference("Account.audioCodecs");
         videoCodecsPref = (CodecPreference) findPreference("Account.videoCodecs");
-        boolean isChecked = Boolean.valueOf(mCallbacks.getAccount().getDetail(ConfigKey.RINGTONE_ENABLED));
-        findPreference(ConfigKey.RINGTONE_PATH.key()).setEnabled(isChecked);
+        mRingtoneCustom = (SwitchPreference) findPreference("Account.ringtoneCustom");
+
+        boolean isRingtoneEnabled = Boolean.valueOf(mCallbacks.getAccount().getDetail(ConfigKey.RINGTONE_ENABLED));
+        mRingtoneCustom.setEnabled(isRingtoneEnabled);
+        boolean isCustomRingtoneEnabled = isRingtoneEnabled && mRingtoneCustom.isChecked();
+        findPreference(ConfigKey.RINGTONE_PATH.key()).setEnabled(isCustomRingtoneEnabled);
 
         addPreferenceListener(ConfigKey.VIDEO_ENABLED, changeVideoPreferenceListener);
+        mRingtoneCustom.setOnPreferenceChangeListener(changeAudioPreferenceListener);
         final Account acc = mCallbacks.getAccount();
         if (acc != null) {
             accountChanged(acc);
@@ -203,9 +218,18 @@ public class MediaPreferenceFragment extends PreferenceFragment
             final ConfigKey key = ConfigKey.fromString(preference.getKey());
             if (preference instanceof TwoStatePreference) {
                 if (key == ConfigKey.RINGTONE_ENABLED) {
+                    mRingtoneCustom.setEnabled((Boolean) newValue);
+                    Boolean isEnabled = (Boolean) newValue && mRingtoneCustom.isChecked();
+                    getPreferenceScreen().findPreference(ConfigKey.RINGTONE_PATH.key()).setEnabled(isEnabled);
+                } else if (preference == mRingtoneCustom) {
                     getPreferenceScreen().findPreference(ConfigKey.RINGTONE_PATH.key()).setEnabled((Boolean) newValue);
+                    if (newValue.toString().contentEquals("false")) {
+                        setRingtonepath(new File(FileUtils.ringtonesPath(getActivity()) + File.separator + "default.wav"));
+                    }
+                }
+                if (key != null) {
+                    account.setDetail(key, newValue.toString());
                 }
-                account.setDetail(key, newValue.toString());
             } else if (key == ConfigKey.ACCOUNT_DTMF_TYPE) {
                 preference.setSummary(((String) newValue).contentEquals("overrtp") ? "RTP" : "SIP");
             } else {
diff --git a/ring-android/app/src/main/java/cx/ring/utils/FileUtils.java b/ring-android/app/src/main/java/cx/ring/utils/FileUtils.java
index c022da6f08824c32aa40118fcf453b66501ce4d9..d4aee988bf4a08951b3876e895eb9d57a7b303d1 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/FileUtils.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/FileUtils.java
@@ -160,4 +160,8 @@ public class FileUtils {
         }
         return path;
     }
+
+    public static String ringtonesPath(Context context) {
+        return context.getFilesDir().getAbsolutePath() + File.separator + "ringtones";
+    }
 }
diff --git a/ring-android/app/src/main/res/values/strings_account.xml b/ring-android/app/src/main/res/values/strings_account.xml
index bc587f6b2e79db950e2793765e6541c65ec43ce5..3d3137e8daed4853c1753c95efc9a3947c15ef3d 100644
--- a/ring-android/app/src/main/res/values/strings_account.xml
+++ b/ring-android/app/src/main/res/values/strings_account.xml
@@ -80,6 +80,7 @@ along with this program; if not, write to the Free Software
     <string name="account_ringtone_label">Ringtones</string>
     <string name="account_ringtone_enabled_label">Activate ringtones</string>
     <string name="account_ringtone_path_label">Ringtone path</string>
+    <string name="account_ringtone_custom_label">Use custom ringtone</string>
 
     <!-- Video Details -->
     <string name="account_video_label">Video</string>
diff --git a/ring-android/app/src/main/res/xml/account_media_prefs.xml b/ring-android/app/src/main/res/xml/account_media_prefs.xml
index 488f5569fbebfadaa65f07c46a5aaeadb03a6fe4..051b17ced6e37b48d9ba70d4be80318cf020a785 100644
--- a/ring-android/app/src/main/res/xml/account_media_prefs.xml
+++ b/ring-android/app/src/main/res/xml/account_media_prefs.xml
@@ -29,6 +29,12 @@ along with this program; if not, write to the Free Software
             android:persistent="false"
             android:title="@string/account_ringtone_enabled_label" />
 
+        <android.support.v14.preference.SwitchPreference
+            android:id="@+id/audio_ringtone_custom"
+            android:key="Account.ringtoneCustom"
+            android:persistent="true"
+            android:title="@string/account_ringtone_custom_label" />
+
         <android.support.v7.preference.Preference
             android:id="@+id/audio_ringtone_path"
             android:key="Account.ringtonePath"