diff --git a/coreapi/misc.c b/coreapi/misc.c
index 4173fdcebcb6baf0f2310cbd7f4195b6536ea48a..8dfc242f52713e7b4386c67ce02c4528e5e504b1 100644
--- a/coreapi/misc.c
+++ b/coreapi/misc.c
@@ -624,12 +624,10 @@ LinphoneStatus linphone_core_migrate_to_multi_transport(LinphoneCore *lc) {
 	return 0;
 }
 
-LinphoneToneDescription *
-linphone_tone_description_new(LinphoneReason reason, LinphoneToneID id, const char *audiofile) {
-	LinphoneToneDescription *obj = ms_new0(LinphoneToneDescription, 1);
-	obj->reason = reason;
-	obj->toneid = id;
-	obj->audiofile = audiofile ? ms_strdup(audiofile) : NULL;
+LinphoneToneDescription * linphone_tone_description_new(LinphoneToneID id, const char *audiofile){
+	LinphoneToneDescription *obj=ms_new0(LinphoneToneDescription,1);
+	obj->toneid=id;
+	obj->audiofile=audiofile ? ms_strdup(audiofile) : NULL;
 	return obj;
 }
 
@@ -638,12 +636,8 @@ void linphone_tone_description_destroy(LinphoneToneDescription *obj) {
 	ms_free(obj);
 }
 
-void linphone_core_set_call_error_tone(LinphoneCore *lc, LinphoneReason reason, const char *audiofile) {
-	L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().setTone(reason, LinphoneToneUndefined, audiofile);
-}
-
-void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *audiofile) {
-	L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().setTone(LinphoneReasonNone, id, audiofile);
+void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *audiofile){
+	L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().setTone(id, audiofile);
 }
 
 const MSCryptoSuite *linphone_core_generate_srtp_crypto_suites_array_from_string(LinphoneCore *lc, const char *config) {
diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h
index ef963d7b284aca10b51176e29c7436cc6398d090..f6bb34c75523301d560dabd360848ea26064f192 100644
--- a/coreapi/private_functions.h
+++ b/coreapi/private_functions.h
@@ -539,7 +539,7 @@ void _linphone_magic_search_notify_ldap_have_more_results(LinphoneMagicSearch *m
 const LinphoneParticipantImdnState *
 _linphone_participant_imdn_state_from_cpp_obj(const LinphonePrivate::ParticipantImdnState &state);
 
-LinphoneToneDescription *linphone_tone_description_new(LinphoneReason reason, LinphoneToneID id, const char *audiofile);
+LinphoneToneDescription * linphone_tone_description_new(LinphoneToneID id, const char *audiofile);
 void linphone_tone_description_destroy(LinphoneToneDescription *obj);
 
 void linphone_task_list_init(LinphoneTaskList *t);
diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h
index c3be9c72068dcf3e3f7395ca7de403f3229c8a1b..be802641531ab7fde9f2791c5546ecdf883addc3 100644
--- a/coreapi/private_structs.h
+++ b/coreapi/private_structs.h
@@ -298,8 +298,7 @@ struct autoreplier_config {
 	const char *message; /* the path of the file to be played */
 };
 
-struct _LinphoneToneDescription {
-	LinphoneReason reason; /*the call error code*/
+struct _LinphoneToneDescription{
 	LinphoneToneID toneid; /*A tone type to play when this error arrives. This is played using tone generator*/
 	char *audiofile;       /*An override audio file to play instead, when this error arrives*/
 	/*Note that some tones are not affected to any error, in which case it is affected LinphoneReasonNone*/
diff --git a/coreapi/tester_utils.cpp b/coreapi/tester_utils.cpp
index 5e41807dfabb62f26938d1020ebbefae4ac3833c..a12ef932f6fb9986ba887ba9d4e26de923c06c53 100644
--- a/coreapi/tester_utils.cpp
+++ b/coreapi/tester_utils.cpp
@@ -236,8 +236,8 @@ void linphone_core_reset_tone_manager_stats(LinphoneCore *lc) {
 	L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().resetStats();
 }
 
-const char *linphone_core_get_tone_file(LinphoneCore *lc, LinphoneToneID id) {
-	LinphoneToneDescription *tone = L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().getToneFromId(id);
+const char *linphone_core_get_tone_file(LinphoneCore *lc, LinphoneToneID id){
+	LinphoneToneDescription *tone = L_GET_PRIVATE_FROM_C_OBJECT(lc)->getToneManager().getTone(id);
 	return tone ? tone->audiofile : NULL;
 }
 
diff --git a/coreapi/tester_utils.h b/coreapi/tester_utils.h
index 0c8b23fc7b9a596221e11b279916f56040bf3796..e9ea6c6401e4c5a1653bd25e5afdaa8b1933fcbd 100644
--- a/coreapi/tester_utils.h
+++ b/coreapi/tester_utils.h
@@ -66,7 +66,6 @@ typedef enum _LinphoneProxyConfigAddressComparisonResult {
 typedef struct _LinphoneCoreToneManagerStats {
 	int number_of_startRingbackTone;
 	int number_of_startRingtone;
-	int number_of_startErrorTone;
 	int number_of_startNamedTone;
 	int number_of_stopRingbackTone;
 	int number_of_stopRingtone;
diff --git a/include/linphone/core.h b/include/linphone/core.h
index cd7879fe6021cb8e869d8db15e7f5cb4f39e9767..bf36edfba13ebdd66b7230c8f3487ed2a0953d6f 100644
--- a/include/linphone/core.h
+++ b/include/linphone/core.h
@@ -5180,16 +5180,6 @@ LINPHONE_PUBLIC void linphone_core_enable_sdp_200_ack(LinphoneCore *core, bool_t
  **/
 LINPHONE_PUBLIC bool_t linphone_core_sdp_200_ack_enabled(const LinphoneCore *core);
 
-/**
- * Assign an audio file to be played locally upon call failure, for a given reason.
- * @param core the core @notnil
- * @param reason the #LinphoneReason representing the failure error code.
- * @param audiofile a wav file to be played when such call failure happensd or NULL to disable it. @maybenil
- * @ingroup misc
- **/
-LINPHONE_PUBLIC void
-linphone_core_set_call_error_tone(LinphoneCore *core, LinphoneReason reason, const char *audiofile);
-
 /**
  * Assign an audio file to be played as a specific tone id.
  * This function typically allows to customize telephony tones per country.
diff --git a/include/linphone/types.h b/include/linphone/types.h
index f96f5a17ee2f4e9b5472faf1adbbb4bc4eb58760..e2b324342971a5f95599fbd528d293bf7d3a3691 100644
--- a/include/linphone/types.h
+++ b/include/linphone/types.h
@@ -1215,12 +1215,13 @@ typedef enum _LinphoneSubscriptionState {
  * @ingroup misc
  **/
 typedef enum _LinphoneToneID {
-	LinphoneToneUndefined = 0,   /**< Not a tone */
-	LinphoneToneBusy = 1,        /**< Busy tone */
-	LinphoneToneCallWaiting = 2, /**< Call waiting tone */
-	LinphoneToneCallOnHold = 3,  /**< Call on hold tone */
-	LinphoneToneCallLost = 4,    /**< Tone played when call is abruptly disconnected (media lost)*/
-	LinphoneToneCallEnd = 5      /**< When the call end for any reason but lost */
+	LinphoneToneUndefined = 0,	/**< Not a tone */
+	LinphoneToneBusy = 1,		/**< Busy tone */
+	LinphoneToneCallWaiting = 2,	/**< Call waiting tone */
+	LinphoneToneCallOnHold = 3,	/**< Call on hold tone */
+	LinphoneToneCallLost = 4,	/**< Tone played when call is abruptly disconnected (media lost)*/
+	LinphoneToneCallEnd = 5,	/**< When the call end for any reason but lost */
+	LinphoneToneCallNotAnswered = 6	/**< When the call is not answered */
 } LinphoneToneID;
 
 /**
diff --git a/src/conference/session/tone-manager.cpp b/src/conference/session/tone-manager.cpp
index 68575636f7f00761fbb59fc7197f4adfe769b7f0..fb64cbf8437cb8b173577978f76989d812e09f3c 100644
--- a/src/conference/session/tone-manager.cpp
+++ b/src/conference/session/tone-manager.cpp
@@ -37,19 +37,14 @@ LINPHONE_BEGIN_NAMESPACE
 
 ToneManager::ToneManager(Core &core) : mCore(core) {
 	lInfo() << "[ToneManager] create ToneManager()";
-	mStats = {0, 0, 0, 0, 0, 0, 0};
+	mStats = {0, 0, 0, 0, 0, 0};
 
 	/* Assign default tones */
-	setTone(LinphoneReasonBusy, LinphoneToneBusy, NULL);
-	setTone(LinphoneReasonGone, LinphoneToneCallEnd, NULL);
-	setTone(LinphoneReasonNoResponse, LinphoneToneCallEnd, NULL);
-	setTone(LinphoneReasonDeclined, LinphoneToneCallEnd, NULL);
-	setTone(LinphoneReasonNone, LinphoneToneCallEnd, NULL);
-	setTone(LinphoneReasonTransferred, LinphoneToneCallEnd, NULL);
-	setTone(LinphoneReasonIOError, LinphoneToneCallLost, NULL);
-	setTone(LinphoneReasonNotAnswered, LinphoneToneCallLost, NULL);
-	setTone(LinphoneReasonServerTimeout, LinphoneToneCallLost, NULL);
-	setTone(LinphoneReasonUnknown, LinphoneToneCallLost, NULL);
+	setTone(LinphoneToneBusy, NULL);
+	setTone(LinphoneToneCallEnd, NULL);
+	setTone(LinphoneToneCallLost, NULL);
+	setTone(LinphoneToneCallNotAnswered, NULL);
+	setTone(LinphoneToneCallLost, NULL);
 }
 
 ToneManager::~ToneManager() {
@@ -144,26 +139,10 @@ void ToneManager::stopRingtone() {
 	}
 }
 
-void ToneManager::startErrorTone(LinphoneReason reason) {
-	lInfo() << "[ToneManager] " << __func__;
-	mStats.number_of_startErrorTone++;
-	LinphoneToneDescription *tone = getToneFromReason(reason);
-
-	if (tone) {
-		if (tone->audiofile) {
-			playFile(tone->audiofile);
-		} else if (tone->toneid != LinphoneToneUndefined) {
-			MSDtmfGenCustomTone dtmfTone = generateToneFromId(tone->toneid);
-			playTone(dtmfTone);
-		}
-	}
-}
-
 void ToneManager::startNamedTone(LinphoneToneID toneId) {
 	lInfo() << "[ToneManager] " << __func__;
 	mStats.number_of_startNamedTone++;
-	LinphoneToneDescription *tone = getToneFromId(toneId);
-
+	LinphoneToneDescription *tone = getTone(toneId);
 	if (tone && tone->audiofile) {
 		playFile(tone->audiofile);
 	} else {
@@ -402,16 +381,7 @@ void ToneManager::freeAudioResources() {
 // setup tones
 // ---------------------------------------------------
 
-LinphoneToneDescription *ToneManager::getToneFromReason(LinphoneReason reason) {
-	const bctbx_list_t *elem;
-	for (elem = getCore().getCCore()->tones; elem != NULL; elem = elem->next) {
-		LinphoneToneDescription *tone = (LinphoneToneDescription *)elem->data;
-		if (tone->reason == reason) return tone;
-	}
-	return NULL;
-}
-
-LinphoneToneDescription *ToneManager::getToneFromId(LinphoneToneID id) {
+LinphoneToneDescription *ToneManager::getTone(LinphoneToneID id) {
 	const bctbx_list_t *elem;
 	for (elem = getCore().getCCore()->tones; elem != NULL; elem = elem->next) {
 		LinphoneToneDescription *tone = (LinphoneToneDescription *)elem->data;
@@ -420,15 +390,14 @@ LinphoneToneDescription *ToneManager::getToneFromId(LinphoneToneID id) {
 	return NULL;
 }
 
-void ToneManager::setTone(LinphoneReason reason, LinphoneToneID id, const char *audiofile) {
+void ToneManager::setTone(LinphoneToneID id, const char *audiofile) {
 	LinphoneCore *lc = getCore().getCCore();
-	LinphoneToneDescription *tone = getToneFromReason(reason);
-
+	LinphoneToneDescription *tone = getTone(id);
 	if (tone) {
 		lc->tones = bctbx_list_remove(lc->tones, tone);
 		linphone_tone_description_destroy(tone);
 	}
-	tone = linphone_tone_description_new(reason, id, audiofile);
+	tone = linphone_tone_description_new(id, audiofile);
 	lc->tones = bctbx_list_append(lc->tones, tone);
 }
 
@@ -437,7 +406,7 @@ const LinphoneCoreToneManagerStats *ToneManager::getStats() const {
 }
 
 void ToneManager::resetStats() {
-	mStats = {0, 0, 0, 0, 0, 0, 0};
+	mStats = {0, 0, 0, 0, 0, 0};
 }
 
 MSDtmfGenCustomTone ToneManager::generateToneFromId(LinphoneToneID toneId) {
@@ -458,11 +427,17 @@ MSDtmfGenCustomTone ToneManager::generateToneFromId(LinphoneToneID toneId) {
 			def.interval = 2000;
 			break;
 		case LinphoneToneBusy:
-			def.duration = 500;
-			def.frequencies[0] = 440;
-			def.interval = 500;
-			def.repeat_count = 3;
-			break;
+			def.duration=500;
+			def.frequencies[0]=440;
+			def.interval=500;
+			def.repeat_count=3;
+		break;
+		case LinphoneToneCallNotAnswered:
+			def.duration=250;
+			def.frequencies[0]=440;
+			def.interval=250;
+			def.repeat_count=3;
+		break;
 		case LinphoneToneCallLost:
 			def.duration = 250;
 			// def.frequencies[0]=480;  // Second frequency that is hide
@@ -566,7 +541,29 @@ void ToneManager::notifyOutgoingCallRinging(const std::shared_ptr<CallSession> &
 
 void ToneManager::notifyToneIndication(LinphoneReason reason) {
 	if (!linphone_core_tone_indications_enabled(getCore().getCCore())) return;
-	startErrorTone(reason);
+
+	lInfo() << "[ToneManager] " << __func__ << " reason " << std::string(linphone_reason_to_string(reason));
+
+	switch (reason) {
+		case LinphoneReasonUnknown:
+		case LinphoneReasonNone:
+			startNamedTone(LinphoneToneCallEnd);
+			break;
+		case LinphoneReasonNotAnswered:
+			startNamedTone(LinphoneToneCallNotAnswered);
+			break;
+		case LinphoneReasonBusy:
+			startNamedTone(LinphoneToneBusy);
+			break;
+		case LinphoneReasonTransferred:
+		case LinphoneReasonIOError:
+		case LinphoneReasonServerTimeout:
+			startNamedTone(LinphoneToneCallLost);
+			break;
+		default:
+			startNamedTone(LinphoneToneUndefined);
+			break;
+	}
 }
 
 bool ToneManager::inCallOrConference() const {
diff --git a/src/conference/session/tone-manager.h b/src/conference/session/tone-manager.h
index 79a7242793b626c35fc32147ccc0f56be5d3dd58..aeb0361414ccba7f3966f2a70dbca64d258aff03 100644
--- a/src/conference/session/tone-manager.h
+++ b/src/conference/session/tone-manager.h
@@ -70,9 +70,8 @@ public:
 	void resetStats();
 
 	// Tone configuration.
-	LinphoneToneDescription *getToneFromReason(LinphoneReason reason);
-	LinphoneToneDescription *getToneFromId(LinphoneToneID id);
-	void setTone(LinphoneReason reason, LinphoneToneID id, const char *audiofile);
+	LinphoneToneDescription *getTone(LinphoneToneID id);
+	void setTone(LinphoneToneID id, const char *audiofile);
 
 private:
 	using AudioResourceType = enum { ToneGenerator = 0, LocalPlayer = 1 };
diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c
index 093e30ab4031cfa6cc26d71f9fe67838a98c549b..8ea5dba951c1416d7ccd34a48e86f62b46bf5155 100644
--- a/tester/call_single_tester.c
+++ b/tester/call_single_tester.c
@@ -1290,8 +1290,9 @@ static void terminate_call_with_error(void) {
 	LinphoneCoreManager *callee_mgr = linphone_core_manager_new("marie_rc");
 	LinphoneCoreManager *caller_mgr =
 	    linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc");
+	const LinphoneCoreToneManagerStats *caller_tone_mgr_stats = linphone_core_get_tone_manager_stats(caller_mgr->lc);
 
-	LinphoneCall *out_call = linphone_core_invite_address(caller_mgr->lc, callee_mgr->identity);
+	LinphoneCall* out_call = linphone_core_invite_address(caller_mgr->lc,callee_mgr->identity);
 
 	linphone_call_ref(out_call);
 	ei = linphone_error_info_new();
@@ -1318,9 +1319,10 @@ static void terminate_call_with_error(void) {
 		BC_ASSERT_STRING_EQUAL(linphone_error_info_get_phrase(ei), "Call refused for security reason");
 		BC_ASSERT_STRING_EQUAL(linphone_error_info_get_protocol(ei), "SIP");
 	}
-	linphone_call_terminate_with_error_info(out_call, ei);
-	BC_ASSERT_TRUE(wait_for(caller_mgr->lc, callee_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallEnd, 1));
-	BC_ASSERT_TRUE(wait_for(caller_mgr->lc, callee_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallReleased, 1));
+	linphone_call_terminate_with_error_info(out_call,ei);
+	BC_ASSERT_TRUE(wait_for(caller_mgr->lc,callee_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallEnd,1));
+	BC_ASSERT_TRUE(wait_for(caller_mgr->lc,callee_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallReleased,1));
+	BC_ASSERT_EQUAL(caller_tone_mgr_stats->number_of_startNamedTone, caller_mgr->stat.number_of_LinphoneCallEnd, int, "%d");
 
 	rei = linphone_call_get_error_info(call_callee);
 	BC_ASSERT_PTR_NOT_NULL(rei);
@@ -1495,8 +1497,8 @@ static void cancel_other_device_after_decline(void) {
 		BC_ASSERT_EQUAL(linphone_call_decline(call_callee, LinphoneReasonDeclined), 0, int, "%d");
 		BC_ASSERT_TRUE(wait_for(caller_mgr->lc, callee_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallEnd, 1));
 		BC_ASSERT_EQUAL(linphone_core_get_tone_manager_stats(caller_mgr->lc)->number_of_stopRingbackTone, 1, int, "%d");
-		BC_ASSERT_EQUAL(linphone_core_get_tone_manager_stats(caller_mgr->lc)->number_of_startErrorTone, 1, int, "%d");
-		BC_ASSERT_TRUE(wait_for(caller_mgr->lc, callee_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallReleased, 1));
+		BC_ASSERT_EQUAL(linphone_core_get_tone_manager_stats(caller_mgr->lc)->number_of_startNamedTone, 1, int, "%d");
+		BC_ASSERT_TRUE(wait_for(caller_mgr->lc,callee_mgr->lc, &caller_mgr->stat.number_of_LinphoneCallReleased, 1));
 
 		BC_ASSERT_TRUE(wait_for(caller_mgr->lc, callee_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallEnd, 1));
 		BC_ASSERT_EQUAL(linphone_core_get_tone_manager_stats(callee_mgr->lc)->number_of_stopRingtone, 1, int, "%d");
@@ -1973,15 +1975,13 @@ static void call_declined_base(bool_t use_timeout, bool_t use_earlymedia, bool_t
 		BC_ASSERT_EQUAL(marieToneManagerStats->number_of_stopRingtone, 1, int, "%d");
 
 		if (request_timeout || use_timeout)
-			BC_ASSERT_EQUAL(marieToneManagerStats->number_of_startErrorTone, 0, int, "%d");
+			BC_ASSERT_EQUAL(marieToneManagerStats->number_of_startNamedTone, 0, int, "%d");
 
 		BC_ASSERT_EQUAL(paulineToneManagerStats->number_of_stopRingbackTone, 1, int, "%d");
-		BC_ASSERT_EQUAL(paulineToneManagerStats->number_of_startErrorTone, 1, int, "%d");
-		BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd, 1, int, "%d");
-		BC_ASSERT_EQUAL((use_timeout || request_timeout) ? pauline->stat.number_of_LinphoneCallError
-		                                                 : pauline->stat.number_of_LinphoneCallEnd,
-		                1, int, "%d");
-		BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, (int *)&paulineToneManagerStats->number_of_stopTone, 1));
+		BC_ASSERT_EQUAL(paulineToneManagerStats->number_of_startNamedTone, 1, int, "%d");
+		BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1, int, "%d");
+		BC_ASSERT_EQUAL((use_timeout || request_timeout) ? pauline->stat.number_of_LinphoneCallError : pauline->stat.number_of_LinphoneCallEnd,1, int, "%d");
+		BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc, (int*)&paulineToneManagerStats->number_of_stopTone, 1));
 		BC_ASSERT_EQUAL(linphone_call_get_reason(in_call), reason, int, "%d");
 		BC_ASSERT_EQUAL(linphone_call_log_get_status(linphone_call_get_call_log(in_call)),
 		                (use_timeout || request_timeout) ? LinphoneCallMissed : LinphoneCallDeclined, int, "%d");
diff --git a/tester/tester.c b/tester/tester.c
index ee97e6ea8899c56377f6d18e7f7cf85592adec1a..f0e0c836611b0a3c680c3bb95f44fc1262643e0c 100644
--- a/tester/tester.c
+++ b/tester/tester.c
@@ -4336,9 +4336,7 @@ bool_t call_with_params2(LinphoneCoreManager *caller_mgr,
 	         wait_for_until(callee_mgr->lc, caller_mgr->lc, &callee_mgr->stat.number_of_LinphoneCallStreamsRunning,
 	                        initial_callee.number_of_LinphoneCallStreamsRunning + 1, 2000);
 
-	BC_ASSERT_EQUAL(callee_stats->number_of_startErrorTone,
-	                callee_mgr->stat.number_of_LinphoneCallEnd + callee_mgr->stat.number_of_LinphoneCallError, int,
-	                "%d");
+	BC_ASSERT_GREATER(callee_stats->number_of_startNamedTone, callee_mgr->stat.number_of_LinphoneCallEnd + callee_mgr->stat.number_of_LinphoneCallError, int, "%d");
 
 	/* The ringtone, if it has started, must have stopped. */
 	BC_ASSERT_EQUAL(callee_stats->number_of_startRingtone - initial_callee_stats.number_of_startRingtone,