diff --git a/coreapi/conference.cpp b/coreapi/conference.cpp
index 94c4ce899883c0dd3c3aa7aaf260183acf0081d2..d113399dd6437b89aa7f2ccd3411bb420692df26 100644
--- a/coreapi/conference.cpp
+++ b/coreapi/conference.cpp
@@ -170,6 +170,75 @@ shared_ptr<AudioDevice> Conference::getOutputAudioDevice() const {
 	return nullptr;
 }
 
+int Conference::stopRecording() {
+	AudioControlInterface *aci = getAudioControlInterface();
+	if (aci) {
+		aci->stopRecording();
+	} else {
+		lError() << "LocalConference::stopRecording(): no audio mixer.";
+		return -1;
+	}
+	return 0;
+}
+
+bool Conference::isRecording() const {
+	AudioControlInterface *aci = getAudioControlInterface();
+	if (aci) {
+		return aci->isRecording();
+	}
+	return false;
+}
+
+bool Conference::getMicrophoneMuted() const {
+	AudioControlInterface *aci = getAudioControlInterface();
+	if (aci) {
+		return !aci->micEnabled();
+	}
+	lError() << "Unable to get status of microphone because the audio control interface of conference "
+	         << *getConferenceAddress() << " cannot be found";
+	return false;
+}
+
+void Conference::setMicrophoneMuted(bool muted) {
+	AudioControlInterface *aci = getAudioControlInterface();
+	if (aci) {
+		aci->enableMic(!muted);
+		for (const auto &participant : participants) {
+			for (const auto &device : participant->getDevices()) {
+				// If the core is holding a conference (conference server or client holding the conference because it
+				// has scheduled a conference without having a conference server set), every participant device has a
+				// media session associated to. In such a scenario all calls are muted one by one.
+				auto deviceSession = device->getSession();
+				if (deviceSession) {
+					auto op = deviceSession->getPrivate()->getOp();
+					shared_ptr<Call> call = op ? getCore()->getCallByCallId(op->getCallId()) : nullptr;
+					if (call) {
+						call->setMicrophoneMuted(muted);
+					}
+				}
+			}
+		}
+		bool coreMicrophoneEnabled = !!linphone_core_mic_enabled(getCore()->getCCore());
+		notifyLocalMutedDevices(muted || !coreMicrophoneEnabled);
+	} else {
+		const auto conferenceAddressStr =
+		    (getConferenceAddress() ? getConferenceAddress()->toString() : std::string("<address-not-defined>"));
+		lError() << "Unable to " << std::string(muted ? "disable" : "enable")
+		         << " microphone because the audio control interface of conference " << conferenceAddressStr
+		         << " cannot be found";
+	}
+}
+
+float Conference::getRecordVolume() const {
+	AudioControlInterface *aci = getAudioControlInterface();
+	if (aci) {
+		return aci->getRecordVolume();
+	}
+	lError() << "Unable to get record volume because the audio control interface of conference "
+	         << *getConferenceAddress() << " cannot be found";
+	return 0.0;
+}
+
 void Conference::setConferenceAddress(const std::shared_ptr<Address> &conferenceAddress) {
 	if ((getState() == ConferenceInterface::State::Instantiated) ||
 	    (getState() == ConferenceInterface::State::CreationPending)) {
diff --git a/coreapi/conference.h b/coreapi/conference.h
index f03047c86a07921313fe265e2a5961c9f9a1da37..437f00f5b9b66425c8885a773b476f52e85af419 100644
--- a/coreapi/conference.h
+++ b/coreapi/conference.h
@@ -152,11 +152,6 @@ public:
 	bool isConferenceEnded() const;
 	bool isConferenceStarted() const;
 
-	void setInputAudioDevice(const std::shared_ptr<AudioDevice> &audioDevice);
-	void setOutputAudioDevice(const std::shared_ptr<AudioDevice> &audioDevice);
-	std::shared_ptr<AudioDevice> getInputAudioDevice() const;
-	std::shared_ptr<AudioDevice> getOutputAudioDevice() const;
-
 	virtual AudioControlInterface *getAudioControlInterface() const = 0;
 	virtual VideoControlInterface *getVideoControlInterface() const = 0;
 	virtual AudioStream *getAudioStream() = 0; /* Used by the tone manager, revisit.*/
@@ -165,9 +160,18 @@ public:
 		return getParticipantCount() + (isIn() ? 1 : 0);
 	}
 
+	void setInputAudioDevice(const std::shared_ptr<AudioDevice> &audioDevice);
+	void setOutputAudioDevice(const std::shared_ptr<AudioDevice> &audioDevice);
+	std::shared_ptr<AudioDevice> getInputAudioDevice() const;
+	std::shared_ptr<AudioDevice> getOutputAudioDevice() const;
+
 	virtual int startRecording(const char *path) = 0;
-	virtual int stopRecording() = 0;
-	virtual bool isRecording() const = 0;
+	int stopRecording();
+	bool isRecording() const;
+
+	bool getMicrophoneMuted() const;
+	void setMicrophoneMuted(bool muted);
+	float getRecordVolume() const;
 
 	void setState(LinphonePrivate::ConferenceInterface::State state) override;
 	void setStateChangedCallback(LinphoneConferenceStateChangedCb cb, void *userData) {
diff --git a/coreapi/friend.c b/coreapi/friend.c
index a7631bab5c0816ccc5ff29008183872f67c933b5..1b73b77893df8190a5f53fa2aeb7c7fba77133de 100644
--- a/coreapi/friend.c
+++ b/coreapi/friend.c
@@ -2193,7 +2193,7 @@ int linphone_friend_get_capabilities(const LinphoneFriend *lf) {
 		if (!presence) continue;
 		capabilities |= linphone_presence_model_get_capabilities(presence);
 	}
-	bctbx_list_free(phones);
+	bctbx_list_free_with_data(phones, bctbx_free);
 
 	return capabilities;
 }
@@ -2226,7 +2226,7 @@ bool_t linphone_friend_has_capability_with_version(const LinphoneFriend *lf,
 		if (!presence) continue;
 		if (linphone_presence_model_has_capability_with_version(presence, capability, version)) result = TRUE;
 	}
-	bctbx_list_free(phones);
+	bctbx_list_free_with_data(phones, bctbx_free);
 
 	return result;
 }
@@ -2255,7 +2255,7 @@ bool_t linphone_friend_has_capability_with_version_or_more(const LinphoneFriend
 		if (!presence) continue;
 		if (linphone_presence_model_has_capability_with_version_or_more(presence, capability, version)) result = TRUE;
 	}
-	bctbx_list_free(phones);
+	bctbx_list_free_with_data(phones, bctbx_free);
 
 	return result;
 }
@@ -2284,7 +2284,7 @@ float linphone_friend_get_capability_version(const LinphoneFriend *lf, const Lin
 		float presence_version = linphone_presence_model_get_capability_version(presence, capability);
 		if (presence_version > version) version = presence_version;
 	}
-	bctbx_list_free(phones);
+	bctbx_list_free_with_data(phones, bctbx_free);
 
 	return version;
 }
diff --git a/coreapi/linphoneconference.c b/coreapi/linphoneconference.c
index e5035b04ad848c4dcd9e6fee0548c92db37ab641..24b977b9f14f5f7245b84ef88405856531476c60 100644
--- a/coreapi/linphoneconference.c
+++ b/coreapi/linphoneconference.c
@@ -257,27 +257,19 @@ int linphone_conference_get_participant_device_volume(LinphoneConference *confer
 	    ->getParticipantDeviceVolume(ParticipantDevice::toCpp(device)->getSharedFromThis());
 }
 
-int linphone_conference_mute_microphone(LinphoneConference *conference, bool_t val) {
+float linphone_conference_get_input_volume(const LinphoneConference *conference) {
 	LinphonePrivate::MediaConference::ConferenceLogContextualizer logContextualizer(conference);
-	MediaConference::Conference::toCpp(conference)->notifyLocalMutedDevices(val);
-	AudioControlInterface *aci = MediaConference::Conference::toCpp(conference)->getAudioControlInterface();
-	if (!aci) return -1;
-	aci->enableMic(!val);
-	return 0;
+	return MediaConference::Conference::toCpp(conference)->getRecordVolume();
 }
 
-bool_t linphone_conference_microphone_is_muted(const LinphoneConference *conference) {
+bool_t linphone_conference_get_microphone_muted(const LinphoneConference *conference) {
 	LinphonePrivate::MediaConference::ConferenceLogContextualizer logContextualizer(conference);
-	AudioControlInterface *aci = MediaConference::Conference::toCpp(conference)->getAudioControlInterface();
-	if (!aci) return FALSE;
-	return aci->micEnabled() ? FALSE : TRUE;
+	return MediaConference::Conference::toCpp(conference)->getMicrophoneMuted();
 }
 
-float linphone_conference_get_input_volume(const LinphoneConference *conference) {
+void linphone_conference_set_microphone_muted(LinphoneConference *conference, bool_t muted) {
 	LinphonePrivate::MediaConference::ConferenceLogContextualizer logContextualizer(conference);
-	AudioControlInterface *aci = MediaConference::Conference::toCpp(conference)->getAudioControlInterface();
-	if (!aci) return 0.0;
-	return aci->getRecordVolume();
+	MediaConference::Conference::toCpp(conference)->setMicrophoneMuted(!!muted);
 }
 
 int linphone_conference_get_participant_count(const LinphoneConference *conference) {
diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c
index 04a85224c6c33e8cc3f896258d4fca726cba8a89..753b8c9809f5be2c68d19e1730a447b6b733c95a 100644
--- a/coreapi/linphonecore.c
+++ b/coreapi/linphonecore.c
@@ -6138,14 +6138,6 @@ bool_t linphone_core_echo_limiter_enabled(const LinphoneCore *lc) {
 	return lc->sound_conf.ea;
 }
 
-void linphone_core_mute_mic(LinphoneCore *lc, bool_t val) {
-	linphone_core_enable_mic(lc, !val);
-}
-
-bool_t linphone_core_is_mic_muted(LinphoneCore *lc) {
-	return !linphone_core_mic_enabled(lc);
-}
-
 void linphone_core_enable_mic(LinphoneCore *lc, bool_t enable) {
 	CoreLogContextualizer logContextualizer(lc);
 	LinphoneCall *call;
@@ -6157,14 +6149,19 @@ void linphone_core_enable_mic(LinphoneCore *lc, bool_t enable) {
 	lc->sound_conf.mic_enabled = enable; /* this is a global switch read everywhere the microphone is used. */
 	/* apply to conference and calls */
 	if (linphone_core_is_in_conference(lc)) {
-		linphone_conference_mute_microphone(lc->conf_ctx, linphone_conference_microphone_is_muted(lc->conf_ctx));
+		linphone_conference_set_microphone_muted(lc->conf_ctx, linphone_conference_get_microphone_muted(lc->conf_ctx));
 	}
 	list = linphone_core_get_calls(lc);
 	for (elem = list; elem != NULL; elem = elem->next) {
 		call = (LinphoneCall *)elem->data;
 		/* re-apply the same setting; we don't modify the call's switch. However the setter will
 		 * take action on the stream in order to take into account the core's new switch state.*/
-		linphone_call_set_microphone_muted(call, linphone_call_get_microphone_muted(call));
+		LinphoneConference *conference = linphone_call_get_conference(call);
+		if (conference) {
+			linphone_conference_set_microphone_muted(conference, linphone_conference_get_microphone_muted(conference));
+		} else {
+			linphone_call_set_microphone_muted(call, linphone_call_get_microphone_muted(call));
+		}
 	}
 }
 
@@ -9328,9 +9325,8 @@ LinphoneConference *linphone_core_create_conference_with_params(LinphoneCore *lc
 				if (strcasecmp(conf_method_name, "remote") == 0) {
 					LinphoneAccount *account = linphone_core_get_default_account(lc);
 					if (account) {
-						const char *uri = linphone_account_params_get_conference_factory_uri(
-						    linphone_account_get_params(linphone_core_get_default_account(lc)));
-						factory_uri = linphone_address_new(uri);
+						factory_uri = linphone_address_clone(linphone_account_params_get_conference_factory_address(
+						    linphone_account_get_params(linphone_core_get_default_account(lc))));
 						char *factory_uri_str = factory_uri ? linphone_address_as_string(factory_uri) : NULL;
 						lInfo() << "Creating remote conference with factory address from default account : "
 						        << std::string(factory_uri_str);
diff --git a/coreapi/local_conference.cpp b/coreapi/local_conference.cpp
index bb9a08b346559854f5e43ab12f42347071c43776..6d6ba533f01d6a17ec1489e2ca65ada6f184864d 100644
--- a/coreapi/local_conference.cpp
+++ b/coreapi/local_conference.cpp
@@ -1889,25 +1889,6 @@ int LocalConference::startRecording(const char *path) {
 	return 0;
 }
 
-int LocalConference::stopRecording() {
-	AudioControlInterface *aci = getAudioControlInterface();
-	if (aci) {
-		aci->stopRecording();
-	} else {
-		lError() << "LocalConference::stopRecording(): no audio mixer.";
-		return -1;
-	}
-	return 0;
-}
-
-bool LocalConference::isRecording() const {
-	AudioControlInterface *aci = getAudioControlInterface();
-	if (aci) {
-		return aci->isRecording();
-	}
-	return false;
-}
-
 bool LocalConference::isIn() const {
 	return mIsIn;
 }
diff --git a/coreapi/local_conference.h b/coreapi/local_conference.h
index 5985c9061776f89bb0cc0fdd39408f2f154fbf21..2ffe107058cfc892c9d311171a1fd73081df8b39 100644
--- a/coreapi/local_conference.h
+++ b/coreapi/local_conference.h
@@ -75,8 +75,6 @@ public:
 	virtual bool isIn() const override;
 
 	virtual int startRecording(const char *path) override;
-	virtual int stopRecording() override;
-	virtual bool isRecording() const override;
 
 	virtual void setLocalParticipantStreamCapability(const LinphoneMediaDirection &direction,
 	                                                 const LinphoneStreamType type) override;
diff --git a/coreapi/proxy.c b/coreapi/proxy.c
index f5acc0d842c84ebe326848609d4de78113edf2c2..79eaf4c5cb5c1bdb1aa1f607e929fbfef785824d 100644
--- a/coreapi/proxy.c
+++ b/coreapi/proxy.c
@@ -885,7 +885,7 @@ void linphone_core_remove_account(LinphoneCore *core, LinphoneAccount *account)
 
 	// Update the associated linphone specs on the core
 	LinphoneAccountParams *params = linphone_account_params_clone(linphone_account_get_params(account));
-	linphone_account_params_set_conference_factory_uri(params, NULL);
+	linphone_account_params_set_conference_factory_address(params, NULL);
 	linphone_account_set_params(account, params);
 	linphone_account_params_unref(params);
 }
diff --git a/coreapi/remote_conference.cpp b/coreapi/remote_conference.cpp
index 09d5f72f213b5ffeae78196e2bc6f672143cfb09..f5e747176ef9b1f27a9dcf9bb4b234d6b73e06df 100644
--- a/coreapi/remote_conference.cpp
+++ b/coreapi/remote_conference.cpp
@@ -226,25 +226,6 @@ int RemoteConference::startRecording(const char *path) {
 	return 0;
 }
 
-int RemoteConference::stopRecording() {
-	auto session = static_pointer_cast<MediaSession>(getMainSession());
-	if (session) {
-		session->stopRecording();
-	} else {
-		lError() << "RemoteConference::stopRecording(): no audio session.";
-		return -1;
-	}
-	return 0;
-}
-
-bool RemoteConference::isRecording() const {
-	auto session = static_pointer_cast<MediaSession>(getMainSession());
-	if (session) {
-		return session->isRecording();
-	}
-	return false;
-}
-
 void RemoteConference::notifyStateChanged(LinphonePrivate::ConferenceInterface::State state) {
 	// Call callbacks before calling listeners because listeners may change state
 	linphone_core_notify_conference_state_changed(getCore()->getCCore(), toC(), (LinphoneConferenceState)getState());
diff --git a/coreapi/remote_conference.h b/coreapi/remote_conference.h
index 2f594d26c74865a4b1ff622d43c3e38105ecb141..b3d508a0fe2cdd0ad09acc3651440f2f2c515403 100644
--- a/coreapi/remote_conference.h
+++ b/coreapi/remote_conference.h
@@ -82,8 +82,6 @@ public:
 	virtual const std::shared_ptr<Address> getOrganizer() const override;
 
 	virtual int startRecording(const char *path) override;
-	virtual int stopRecording() override;
-	virtual bool isRecording() const override;
 
 	virtual void setLocalParticipantStreamCapability(const LinphoneMediaDirection &direction,
 	                                                 const LinphoneStreamType type) override;
diff --git a/include/linphone/api/c-account-params.h b/include/linphone/api/c-account-params.h
index 195c83938db2f493112287d72eb26478d8bb8c60..9956be6fe511e97f5adae054aaaf3c7b6fd95e50 100644
--- a/include/linphone/api/c-account-params.h
+++ b/include/linphone/api/c-account-params.h
@@ -110,8 +110,8 @@ LINPHONE_PUBLIC LinphoneStatus linphone_account_params_set_server_address(Linpho
  * @return 0 if successful, -1 otherwise.
  * @deprecated 01/03/2021 Use #linphone_account_params_set_server_address() instead.
  **/
-LINPHONE_PUBLIC LinphoneStatus linphone_account_params_set_server_addr(LinphoneAccountParams *params,
-                                                                       const char *server_address);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneStatus
+linphone_account_params_set_server_addr(LinphoneAccountParams *params, const char *server_address);
 
 /**
  * Sets the user identity as a SIP address.
@@ -153,7 +153,8 @@ LINPHONE_PUBLIC void linphone_account_params_set_expires(LinphoneAccountParams *
  * @param enable If TRUE, registration will be engaged.
  * @deprecated 16/12/2021 Use linphone_account_params_enable_register() instead.
  */
-LINPHONE_PUBLIC void linphone_account_params_set_register_enabled(LinphoneAccountParams *params, bool_t enable);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_account_params_set_register_enabled(LinphoneAccountParams *params,
+                                                                                      bool_t enable);
 
 /**
  * Indicates  either or not, REGISTRATION must be issued for this #LinphoneAccountParams.
@@ -168,7 +169,8 @@ LINPHONE_PUBLIC void linphone_account_params_enable_register(LinphoneAccountPara
  * @param enable If TRUE, publish will be engaged.
  * @deprecated 16/12/2021 Use linphone_account_params_enable_publish() instead.
  */
-LINPHONE_PUBLIC void linphone_account_params_set_publish_enabled(LinphoneAccountParams *params, bool_t enable);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_account_params_set_publish_enabled(LinphoneAccountParams *params,
+                                                                                     bool_t enable);
 
 /**
  * Indicates either or not, PUBLISH must be issued for this #LinphoneAccountParams.
@@ -198,7 +200,8 @@ LINPHONE_PUBLIC int linphone_account_params_get_publish_expires(const LinphoneAc
  * @param enable TRUE to replace + by the international prefix, FALSE otherwise.
  * @deprecated 16/12/2021 Use linphone_account_params_enable_dial_escape_plus() instead.
  **/
-LINPHONE_PUBLIC void linphone_account_params_set_dial_escape_plus_enabled(LinphoneAccountParams *params, bool_t enable);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void
+linphone_account_params_set_dial_escape_plus_enabled(LinphoneAccountParams *params, bool_t enable);
 
 /**
  * Set whether liblinphone should replace "+" by international calling prefix in dialed numbers (passed to
@@ -232,8 +235,8 @@ linphone_account_params_set_use_international_prefix_for_calls_and_chats(Linphon
  * @param enable TRUE to store quality statistics and send them to the collector, FALSE to disable it.
  * @deprecated 16/12/2021 Use linphone_account_params_enable_quality_reporting() instead.
  */
-LINPHONE_PUBLIC void linphone_account_params_set_quality_reporting_enabled(LinphoneAccountParams *params,
-                                                                           bool_t enable);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void
+linphone_account_params_set_quality_reporting_enabled(LinphoneAccountParams *params, bool_t enable);
 
 /**
  * Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
@@ -248,7 +251,8 @@ LINPHONE_PUBLIC void linphone_account_params_enable_quality_reporting(LinphoneAc
  * @return TRUE if quality repotring is enabled, FALSE otherwise.
  * @deprecated 16/12/2021 Use linphone_account_params_quality_reporting_enabled() instead.
  */
-LINPHONE_PUBLIC bool_t linphone_account_params_get_quality_reporting_enabled(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t
+linphone_account_params_get_quality_reporting_enabled(const LinphoneAccountParams *params);
 
 /**
  * Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
@@ -340,7 +344,8 @@ linphone_account_params_get_identity_address(const LinphoneAccountParams *params
  * @return The SIP identity that belongs to this account params. @maybenil
  * @deprecated 01/03/2021 Use linphone_account_params_get_identity_address() instead.
  **/
-LINPHONE_PUBLIC const char *linphone_account_params_get_identity(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC const char *
+linphone_account_params_get_identity(const LinphoneAccountParams *params);
 
 /**
  * Tell if the PUBLISH is enabled.
@@ -348,7 +353,8 @@ LINPHONE_PUBLIC const char *linphone_account_params_get_identity(const LinphoneA
  * @return TRUE if PUBLISH request is enabled for this proxy.
  * @deprecated 16/12/2021 Use linphone_account_params_publish_enabled() instead.
  **/
-LINPHONE_PUBLIC bool_t linphone_account_params_get_publish_enabled(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t
+linphone_account_params_get_publish_enabled(const LinphoneAccountParams *params);
 
 /**
  * Tell if the PUBLISH is enabled.
@@ -370,7 +376,8 @@ LINPHONE_PUBLIC const LinphoneAddress *linphone_account_params_get_server_addres
  * @return The proxy's SIP address. @maybenil
  * @deprecated 01/03/2021 Use linphone_account_params_get_server_address() instead.
  **/
-LINPHONE_PUBLIC const char *linphone_account_params_get_server_addr(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC const char *
+linphone_account_params_get_server_addr(const LinphoneAccountParams *params);
 
 /**
  * Get the account params expires.
@@ -385,7 +392,8 @@ LINPHONE_PUBLIC int linphone_account_params_get_expires(const LinphoneAccountPar
  * @return TRUE if registration to the proxy is enabled.
  * @deprecated 16/12/2021 Use linphone_account_params_register_enabled() instead.
  **/
-LINPHONE_PUBLIC bool_t linphone_account_params_get_register_enabled(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t
+linphone_account_params_get_register_enabled(const LinphoneAccountParams *params);
 
 /**
  * Returns whether the account params is enabled or not.
@@ -441,7 +449,8 @@ LINPHONE_PUBLIC const char *linphone_account_params_get_contact_uri_parameters(c
  * @return Whether liblinphone should replace "+" by "00" in dialed numbers (passed to #linphone_core_invite()).
  * @deprecated 16/12/2021 Use linphone_account_params_dial_escape_plus_enabled() instead.
  **/
-LINPHONE_PUBLIC bool_t linphone_account_params_get_dial_escape_plus_enabled(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t
+linphone_account_params_get_dial_escape_plus_enabled(const LinphoneAccountParams *params);
 
 /**
  * Return whether or not the + should be replaced by 00.
@@ -591,8 +600,19 @@ LINPHONE_PUBLIC void linphone_account_params_set_nat_policy(LinphoneAccountParam
  * Set the conference factory uri.
  * @param params The #LinphoneAccountParams object @notnil
  * @param uri The uri of the conference factory. @maybenil
+ * @deprecated 16/08/2023 Use linphone_account_params_set_conference_factory_address() instead.
  */
-LINPHONE_PUBLIC void linphone_account_params_set_conference_factory_uri(LinphoneAccountParams *params, const char *uri);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void
+linphone_account_params_set_conference_factory_uri(LinphoneAccountParams *params, const char *uri);
+
+/**
+ * Set the conference factory uri.
+ * @param params The #LinphoneAccountParams object @notnil
+ * @param address The #LinphoneAddress to set. @maybenil
+ * @param uri The uri of the conference factory as a #LinphoneAddress. @maybenil
+ */
+LINPHONE_PUBLIC void linphone_account_params_set_conference_factory_address(LinphoneAccountParams *params,
+                                                                            const LinphoneAddress *address);
 
 /**
  * Set the audio video conference factory uri.
@@ -609,7 +629,8 @@ LINPHONE_PUBLIC void linphone_account_params_set_audio_video_conference_factory_
  * @param enable TRUE to enable, FALSE otherwise.
  * @deprecated 16/12/2021 Use linphone_account_params_enable_outbound_proxy() instead.
  */
-LINPHONE_PUBLIC void linphone_account_params_set_outbound_proxy_enabled(LinphoneAccountParams *params, bool_t enable);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void
+linphone_account_params_set_outbound_proxy_enabled(LinphoneAccountParams *params, bool_t enable);
 
 /**
  * If enabled, the proxy will be used as the only route.
@@ -624,7 +645,8 @@ LINPHONE_PUBLIC void linphone_account_params_enable_outbound_proxy(LinphoneAccou
  * @return enable TRUE if enabled, FALSE otherwise.
  * @deprecated 16/12/2021 Use linphone_account_params_outbound_proxy_enabled() instead.
  */
-LINPHONE_PUBLIC bool_t linphone_account_params_get_outbound_proxy_enabled(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t
+linphone_account_params_get_outbound_proxy_enabled(const LinphoneAccountParams *params);
 
 /**
  * Tell if the proxy is used as the only route.
@@ -638,7 +660,16 @@ LINPHONE_PUBLIC bool_t linphone_account_params_outbound_proxy_enabled(const Linp
  * @param params The #LinphoneAccountParams object @notnil
  * @return The uri of the conference factory. @maybenil
  */
-LINPHONE_PUBLIC const char *linphone_account_params_get_conference_factory_uri(const LinphoneAccountParams *params);
+LINPHONE_DEPRECATED LINPHONE_PUBLIC const char *
+linphone_account_params_get_conference_factory_uri(const LinphoneAccountParams *params);
+
+/**
+ * Get the conference factory uri.
+ * @param params The #LinphoneAccountParams object @notnil
+ * @return The #LinphoneAddress of the conference factory. @maybenil
+ */
+LINPHONE_PUBLIC const LinphoneAddress *
+linphone_account_params_get_conference_factory_address(const LinphoneAccountParams *params);
 
 /**
  * Get the audio video conference factory uri.
diff --git a/include/linphone/api/c-call.h b/include/linphone/api/c-call.h
index aaac8119bb540413721cae162b7322cea465e452..1b3b7a5f36e9481b56dffab604ec79b91c96e89b 100644
--- a/include/linphone/api/c-call.h
+++ b/include/linphone/api/c-call.h
@@ -747,6 +747,9 @@ LINPHONE_PUBLIC void linphone_call_set_speaker_muted(LinphoneCall *call, bool_t
  * linphone_core_enable_mic().
  * @param call The #LinphoneCall object. @notnil
  * @return The microphone muted state.
+ * @warning This method returns state of the mute capability of the call passed as argument. If this call is part of a
+ *conference, it is strongly recommended to call linphone_conference_get_microphone_muted() to know whether this device
+ *is muted or not.
  **/
 LINPHONE_PUBLIC bool_t linphone_call_get_microphone_muted(const LinphoneCall *call);
 
@@ -756,6 +759,9 @@ LINPHONE_PUBLIC bool_t linphone_call_get_microphone_muted(const LinphoneCall *ca
  * linphone_core_enable_mic().
  * @param call The #LinphoneCall object. @notnil
  * @param muted The microphone muted state.
+ * @warning This method only mutes the call passed as argument. If this call is part of a conference, it is strongly
+ *recommended to call linphone_conference_set_microphone_muted() to ensure that the setting is correctly apply across
+ *all participants and the conference callbacks are called.
  **/
 LINPHONE_PUBLIC void linphone_call_set_microphone_muted(LinphoneCall *call, bool_t muted);
 
diff --git a/include/linphone/conference.h b/include/linphone/conference.h
index 2ccc0d8e564a7dc50f528cfafdba40d20acfb77a..9526d9b39fa524ef3465e3abac32ff476a94db00 100644
--- a/include/linphone/conference.h
+++ b/include/linphone/conference.h
@@ -671,6 +671,31 @@ LINPHONE_PUBLIC bool_t linphone_conference_is_recording(const LinphoneConference
  */
 LINPHONE_PUBLIC LinphoneCall *linphone_conference_get_call(const LinphoneConference *conference);
 
+/**
+ * Retrieves the volume of a specific participant
+ * @param conference A #LinphoneConference object @notnil
+ * @param device The Participant @notnil
+ * @return The volume of the participant expressed in dbm0.
+ */
+LINPHONE_PUBLIC bool_t linphone_conference_get_microphone_muted(const LinphoneConference *conference);
+
+/**
+ * Get microphone muted state.
+ * Note that the microphone may be disabled globally if FALSE was given to
+ * linphone_core_enable_mic().
+ * @param conference A #LinphoneConference object @notnil
+ * @return The microphone muted state.
+ **/
+LINPHONE_PUBLIC void linphone_conference_set_microphone_muted(LinphoneConference *conference, bool_t muted);
+
+/**
+ * Retrieves the volume of a specific participant
+ * @param conference A #LinphoneConference object @notnil
+ * @param device The Participant @notnil
+ * @return The volume of the participant expressed in dbm0.
+ */
+LINPHONE_PUBLIC float linphone_conference_get_input_volume(const LinphoneConference *conference);
+
 /************ */
 /* DEPRECATED */
 /* ********** */
@@ -705,10 +730,6 @@ LinphoneConference *linphone_remote_conference_new_with_params(LinphoneCore *cor
 /* This is actually only used by the ToneManager. TODO: encapsulate this better. */
 AudioStream *linphone_conference_get_audio_stream(LinphoneConference *conference);
 
-LINPHONE_PUBLIC int linphone_conference_mute_microphone(LinphoneConference *conference, bool_t val);
-LINPHONE_PUBLIC bool_t linphone_conference_microphone_is_muted(const LinphoneConference *conference);
-float linphone_conference_get_input_volume(const LinphoneConference *conference);
-
 void linphone_conference_on_call_terminating(LinphoneConference *conference, LinphoneCall *call);
 
 LINPHONE_PUBLIC bool_t linphone_conference_check_class(LinphoneConference *conference, LinphoneConferenceClass _class);
diff --git a/include/linphone/core.h b/include/linphone/core.h
index 6f0d74c38dba1bf8e5341a2b20c6aeed009f6427..ea26994ce4384045278077809531a1a18f355715 100644
--- a/include/linphone/core.h
+++ b/include/linphone/core.h
@@ -8059,18 +8059,18 @@ LINPHONE_DEPRECATED char linphone_core_get_sound_source(LinphoneCore *core);
 
 LINPHONE_DEPRECATED void linphone_core_set_sound_source(LinphoneCore *core, char source);
 
-/**
- * @deprecated 09/10/2013 Use #linphone_core_enable_mic() instead.
- * @donotwrap
- **/
-LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_mute_mic(LinphoneCore *core, bool_t muted);
-
-/**
- * Get mic state.
- * @deprecated 05/06/2014 Use #linphone_core_mic_enabled() instead
- * @donotwrap
+/*
+ * Get the list of call logs (past calls) that matches the given #LinphoneAddress.
+ * At the contrary of linphone_core_get_call_logs, it is your responsibility to unref the logs and free this list once
+ *you are done using it. Requires ENABLE_DB_STORAGE to work.
+ * @param core #LinphoneCore object @notnil
+ * @param address #LinphoneAddress object @notnil
+ * @return A list of #LinphoneCallLog. \bctbx_list{LinphoneCallLog} @tobefreed @maybenil
+ * @deprecated 29/10/2018 Use #linphone_core_get_call_history_2() instead.
+ * @ingroup call_logs
  **/
-LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_is_mic_muted(LinphoneCore *core);
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bctbx_list_t *
+linphone_core_get_call_history_for_address(LinphoneCore *core, const LinphoneAddress *address);
 
 /**
  * Enables video globally.
diff --git a/src/account/account-params.cpp b/src/account/account-params.cpp
index fe213e0a3f6600bb0ec5d0863edfafcb452fd75b..1221b11bec7a07ebe3188956ca310d37d1e5fb88 100644
--- a/src/account/account-params.cpp
+++ b/src/account/account-params.cpp
@@ -250,8 +250,8 @@ AccountParams::AccountParams(LinphoneCore *lc, int index) : AccountParams(nullpt
 		mNatPolicy = NatPolicy::toCpp(natPolicy)->toSharedPtr();
 	}
 
-	mConferenceFactoryUri =
-	    linphone_config_get_string(config, key, "conference_factory_uri", mConferenceFactoryUri.c_str());
+	setConferenceFactoryUri(L_C_TO_STRING(linphone_config_get_string(config, key, "conference_factory_uri", "")));
+
 	string audioVideoConferenceFactoryUri =
 	    linphone_config_get_string(config, key, "audio_video_conference_factory_uri", "");
 	mAudioVideoConferenceFactoryAddress = nullptr;
@@ -264,6 +264,7 @@ AccountParams::AccountParams(LinphoneCore *lc, int index) : AccountParams(nullpt
 	setCustomContact(linphone_config_get_string(config, key, "custom_contact", ""));
 
 	setLimeServerUrl(linphone_config_get_string(config, key, "lime_server_url", mLimeServerUrl.c_str()));
+
 	setPictureUri(linphone_config_get_string(config, key, "picture_uri", mPictureUri.c_str()));
 
 	readCustomParamsFromConfigFile(config, key);
@@ -296,7 +297,13 @@ AccountParams::AccountParams(const AccountParams &other) : HybridObject(other),
 	mRefKey = other.mRefKey;
 	mDependsOn = other.mDependsOn;
 	mIdKey = other.mIdKey;
-	mConferenceFactoryUri = other.mConferenceFactoryUri;
+
+	if (other.mConferenceFactoryAddress) {
+		mConferenceFactoryAddress = other.mConferenceFactoryAddress->clone()->toSharedPtr();
+	} else {
+		mConferenceFactoryAddress = nullptr;
+	}
+
 	if (other.mAudioVideoConferenceFactoryAddress) {
 		mAudioVideoConferenceFactoryAddress = other.mAudioVideoConferenceFactoryAddress->clone()->toSharedPtr();
 	} else {
@@ -469,7 +476,26 @@ void AccountParams::setIdKey(const std::string &idKey) {
 }
 
 void AccountParams::setConferenceFactoryUri(const std::string &conferenceFactoryUri) {
-	mConferenceFactoryUri = conferenceFactoryUri;
+	setConferenceFactoryAddress(conferenceFactoryUri.empty() ? nullptr : Address::create(conferenceFactoryUri));
+}
+
+void AccountParams::setConferenceFactoryAddress(const std::shared_ptr<const Address> conferenceFactoryAddress) {
+	if (mConferenceFactoryAddress != nullptr) {
+		mConferenceFactoryAddress = nullptr;
+	}
+	if (conferenceFactoryAddress != nullptr) {
+		mConferenceFactoryAddress = conferenceFactoryAddress->clone()->toSharedPtr();
+	}
+}
+
+void AccountParams::setAudioVideoConferenceFactoryAddress(
+    const std::shared_ptr<const Address> audioVideoConferenceFactoryAddress) {
+	if (mAudioVideoConferenceFactoryAddress != nullptr) {
+		mAudioVideoConferenceFactoryAddress = nullptr;
+	}
+	if (audioVideoConferenceFactoryAddress != nullptr) {
+		mAudioVideoConferenceFactoryAddress = audioVideoConferenceFactoryAddress->clone()->toSharedPtr();
+	}
 }
 
 void AccountParams::setFileTranferServer(const std::string &fileTransferServer) {
@@ -541,16 +567,6 @@ void AccountParams::setPushNotificationConfig(PushNotificationConfig *pushNotifi
 	mPushNotificationConfig->ref();
 }
 
-void AccountParams::setAudioVideoConferenceFactoryAddress(
-    const std::shared_ptr<const Address> audioVideoConferenceFactoryAddress) {
-	if (mAudioVideoConferenceFactoryAddress != nullptr) {
-		mAudioVideoConferenceFactoryAddress = nullptr;
-	}
-	if (audioVideoConferenceFactoryAddress != nullptr) {
-		mAudioVideoConferenceFactoryAddress = audioVideoConferenceFactoryAddress->clone()->toSharedPtr();
-	}
-}
-
 void AccountParams::enableRtpBundle(bool value) {
 	mRtpBundleEnabled = value;
 }
@@ -693,8 +709,23 @@ const std::string &AccountParams::getIdKey() const {
 	return mIdKey;
 }
 
-const std::string &AccountParams::getConferenceFactoryUri() const {
-	return mConferenceFactoryUri;
+const char *AccountParams::getConferenceFactoryCstr() const {
+	if (mConferenceFactoryAddressCstr) {
+		ms_free(mConferenceFactoryAddressCstr);
+		mConferenceFactoryAddressCstr = nullptr;
+	}
+	if (mConferenceFactoryAddress) {
+		mConferenceFactoryAddressCstr = mConferenceFactoryAddress->asStringUriOnlyCstr();
+	}
+	return mConferenceFactoryAddressCstr;
+}
+
+const std::shared_ptr<Address> &AccountParams::getConferenceFactoryAddress() const {
+	return mConferenceFactoryAddress;
+}
+
+const std::shared_ptr<Address> &AccountParams::getAudioVideoConferenceFactoryAddress() const {
+	return mAudioVideoConferenceFactoryAddress;
 }
 
 const std::string &AccountParams::getFileTransferServer() const {
@@ -752,10 +783,6 @@ PushNotificationConfig *AccountParams::getPushNotificationConfig() const {
 	return mPushNotificationConfig;
 }
 
-const std::shared_ptr<Address> &AccountParams::getAudioVideoConferenceFactoryAddress() const {
-	return mAudioVideoConferenceFactoryAddress;
-}
-
 bool AccountParams::rtpBundleEnabled() const {
 	return mRtpBundleEnabled;
 }
@@ -915,7 +942,9 @@ void AccountParams::writeToConfigFile(LinphoneConfig *config, int index) {
 		linphone_config_set_string(config, key, "nat_policy_ref", mNatPolicy->getRef().c_str());
 	}
 
-	linphone_config_set_string(config, key, "conference_factory_uri", mConferenceFactoryUri.c_str());
+	if (mConferenceFactoryAddress != nullptr) {
+		linphone_config_set_string(config, key, "conference_factory_uri", getConferenceFactoryCstr());
+	}
 
 	if (mAudioVideoConferenceFactoryAddress != nullptr) {
 		char *factory_address = mAudioVideoConferenceFactoryAddress->asStringUriOnlyCstr();
diff --git a/src/account/account-params.h b/src/account/account-params.h
index ef00a096d23a48d016c70fbcd5ae2eec605023a4..9a35d2d8273f6c1dff4b6c702af50b2019c0057b 100644
--- a/src/account/account-params.h
+++ b/src/account/account-params.h
@@ -71,6 +71,8 @@ public:
 	void setDependsOn(const std::string &dependsOn);
 	void setIdKey(const std::string &idKey);
 	void setConferenceFactoryUri(const std::string &conferenceFactoryUri);
+	void setConferenceFactoryAddress(const std::shared_ptr<const Address> factoryAddress);
+	void setAudioVideoConferenceFactoryAddress(const std::shared_ptr<const Address> audioVideoConferenceFactoryAddress);
 	void setFileTranferServer(const std::string &fileTransferServer);
 	void setPrivacy(LinphonePrivacyMask privacy);
 	void setAvpfMode(LinphoneAVPFMode avpfMode);
@@ -79,7 +81,6 @@ public:
 	LinphoneStatus setIdentityAddress(const std::shared_ptr<Address> identityAddress);
 	LinphoneStatus setRoutes(const std::list<std::shared_ptr<Address>> &routes);
 	LinphoneStatus setRoutesFromStringList(const bctbx_list_t *routes);
-	void setAudioVideoConferenceFactoryAddress(const std::shared_ptr<const Address> audioVideoConferenceFactoryAddress);
 	void enableRtpBundle(bool value);
 	void enableRtpBundleAssumption(bool value);
 	void setCustomContact(const std::shared_ptr<Address> contact);
@@ -112,10 +113,12 @@ public:
 	const std::string &getRefKey() const;
 	const std::string &getDependsOn() const;
 	const std::string &getIdKey() const;
-	const std::string &getConferenceFactoryUri() const;
+	const std::shared_ptr<Address> &getConferenceFactoryAddress() const;
+	const std::shared_ptr<Address> &getAudioVideoConferenceFactoryAddress() const;
 	const std::string &getFileTransferServer() const;
 	const std::string &getIdentity() const;
 	const char *getDomainCstr() const;
+	const char *getConferenceFactoryCstr() const;
 	const std::string getDomain() const;
 	const std::list<std::shared_ptr<Address>> &getRoutes() const;
 	const std::list<std::string> getRoutesString() const;
@@ -125,7 +128,6 @@ public:
 	LinphoneAVPFMode getAvpfMode() const;
 	std::shared_ptr<NatPolicy> getNatPolicy() const;
 	PushNotificationConfig *getPushNotificationConfig() const;
-	const std::shared_ptr<Address> &getAudioVideoConferenceFactoryAddress() const;
 	bool rtpBundleEnabled() const;
 	bool rtpBundleAssumptionEnabled() const;
 	const std::shared_ptr<Address> &getCustomContact() const;
@@ -168,6 +170,8 @@ private:
 
 	void *mUserData;
 
+	mutable char *mConferenceFactoryAddressCstr = nullptr;
+
 	std::string mInternationalPrefix;
 	std::string mProxy;
 	std::string mRealm;
@@ -177,7 +181,6 @@ private:
 	std::string mRefKey;
 	std::string mDependsOn;
 	std::string mIdKey;
-	std::string mConferenceFactoryUri;
 	std::string mFileTransferServer;
 	std::string mLimeServerUrl;
 	std::string mIdentity;
@@ -197,6 +200,7 @@ private:
 
 	PushNotificationConfig *mPushNotificationConfig;
 
+	std::shared_ptr<Address> mConferenceFactoryAddress = nullptr;
 	std::shared_ptr<Address> mAudioVideoConferenceFactoryAddress = nullptr;
 	std::shared_ptr<Address> mCustomContact = nullptr;
 };
diff --git a/src/account/account.cpp b/src/account/account.cpp
index 787407e5c93d2ade787c57835dedb9971f654226..126e0feed09bfc869b8c3f3d7f2a49da734d2c43 100644
--- a/src/account/account.cpp
+++ b/src/account/account.cpp
@@ -206,16 +206,21 @@ void Account::applyParamsChanges() {
 	if (mOldParams == nullptr || mOldParams->mInternationalPrefix != mParams->mInternationalPrefix)
 		onInternationalPrefixChanged();
 
-	if (mOldParams == nullptr || mOldParams->mConferenceFactoryUri != mParams->mConferenceFactoryUri)
-		onConferenceFactoryUriChanged(mParams->mConferenceFactoryUri);
+	if (mOldParams == nullptr ||
+	    ((mOldParams->mConferenceFactoryAddress != nullptr) ^ (mParams->mConferenceFactoryAddress != nullptr)) ||
+	    ((mOldParams->mConferenceFactoryAddress != nullptr) && (mParams->mConferenceFactoryAddress != nullptr) &&
+	     (*mOldParams->mConferenceFactoryAddress == *mParams->mConferenceFactoryAddress))) {
+		onConferenceFactoryAddressChanged(mParams->mConferenceFactoryAddress);
+	}
 
 	if (mOldParams == nullptr ||
 	    ((mOldParams->mAudioVideoConferenceFactoryAddress != nullptr) ^
 	     (mParams->mAudioVideoConferenceFactoryAddress != nullptr)) ||
 	    ((mOldParams->mAudioVideoConferenceFactoryAddress != nullptr) &&
 	     (mParams->mAudioVideoConferenceFactoryAddress != nullptr) &&
-	     (*mOldParams->mAudioVideoConferenceFactoryAddress == *mParams->mAudioVideoConferenceFactoryAddress)))
+	     (*mOldParams->mAudioVideoConferenceFactoryAddress == *mParams->mAudioVideoConferenceFactoryAddress))) {
 		onAudioVideoConferenceFactoryAddressChanged(mParams->mAudioVideoConferenceFactoryAddress);
+	}
 
 	if (mOldParams == nullptr || mOldParams->mNatPolicy != mParams->mNatPolicy)
 		if (mParams->mNatPolicy != nullptr) onNatPolicyChanged(mParams->mNatPolicy);
@@ -1126,10 +1131,16 @@ int Account::sendPublish() {
 }
 
 bool Account::check() {
-	if (mParams->mProxy.empty()) return false;
-	if (mParams->mIdentityAddress == NULL) return false;
+	if (mParams->mProxy.empty()) {
+		lWarning() << "No proxy given for account " << this;
+		return false;
+	}
+	if (mParams->mIdentityAddress == NULL) {
+		lWarning() << "Identity address of account " << this << " has not been set";
+		return false;
+	}
 	resolveDependencies();
-	return TRUE;
+	return true;
 }
 
 void Account::releaseOps() {
@@ -1202,10 +1213,9 @@ void Account::onInternationalPrefixChanged() {
 	}
 }
 
-void Account::onConferenceFactoryUriChanged(const std::string &conferenceFactoryUri) {
+void Account::onConferenceFactoryAddressChanged(const std::shared_ptr<Address> &conferenceFactoryAddress) {
 	auto core = getCCore();
 	if (!core) return;
-
 	std::string conferenceSpec("conference/");
 	conferenceSpec.append(Core::conferenceVersionAsString());
 	std::string groupchatSpec("groupchat/");
@@ -1213,7 +1223,7 @@ void Account::onConferenceFactoryUriChanged(const std::string &conferenceFactory
 	std::string ephemeralSpec("ephemeral/");
 	ephemeralSpec.append(Core::ephemeralVersionAsString());
 
-	if (!conferenceFactoryUri.empty()) {
+	if (conferenceFactoryAddress && conferenceFactoryAddress->isValid()) {
 		linphone_core_add_linphone_spec(core, L_STRING_TO_C(conferenceSpec));
 		linphone_core_add_linphone_spec(core, L_STRING_TO_C(groupchatSpec));
 		linphone_core_add_linphone_spec(core, L_STRING_TO_C(ephemeralSpec));
@@ -1223,9 +1233,9 @@ void Account::onConferenceFactoryUriChanged(const std::string &conferenceFactory
 		// Check that no other account needs the specs before removing it
 		for (bctbx_list_t *it = core->sip_conf.accounts; it; it = it->next) {
 			if (it->data != this->toC()) {
-				const char *confUri = linphone_account_params_get_conference_factory_uri(
+				const auto confUri = linphone_account_params_get_conference_factory_address(
 				    linphone_account_get_params((LinphoneAccount *)it->data));
-				if (confUri && strlen(confUri)) {
+				if (confUri) {
 					remove = false;
 					removeAudioVideoConfAddress = false;
 					break;
@@ -1263,11 +1273,11 @@ void Account::onAudioVideoConferenceFactoryAddressChanged(
 		// Check that no other account needs the specs before removing it
 		for (bctbx_list_t *it = core->sip_conf.accounts; it; it = it->next) {
 			if (it->data != this->toC()) {
-				const char *confUri = linphone_account_params_get_conference_factory_uri(
+				const auto confUri = linphone_account_params_get_conference_factory_address(
 				    linphone_account_get_params((LinphoneAccount *)it->data));
 				const auto audioVideoConfUri = linphone_account_params_get_audio_video_conference_factory_address(
 				    linphone_account_get_params((LinphoneAccount *)it->data));
-				if ((confUri && strlen(confUri)) || audioVideoConfUri) {
+				if (confUri || audioVideoConfUri) {
 					remove = false;
 					break;
 				}
diff --git a/src/account/account.h b/src/account/account.h
index d359c9dcee83913e7ae96a3d2b70ec22528cfbd7..b50971cbe44449e3f93bddb87e3e16e8f3f6ef71 100644
--- a/src/account/account.h
+++ b/src/account/account.h
@@ -153,7 +153,7 @@ private:
 	std::shared_ptr<Address> guessContactForRegister();
 
 	void onInternationalPrefixChanged();
-	void onConferenceFactoryUriChanged(const std::string &conferenceFactoryUri);
+	void onConferenceFactoryAddressChanged(const std::shared_ptr<Address> &conferenceFactoryAddress);
 	void
 	onAudioVideoConferenceFactoryAddressChanged(const std::shared_ptr<Address> &audioVideoConferenceFactoryAddress);
 	void onNatPolicyChanged(const std::shared_ptr<NatPolicy> &policy);
diff --git a/src/c-wrapper/api/c-account-params.cpp b/src/c-wrapper/api/c-account-params.cpp
index 62f3ad9a08591098d24425c90a1bce6f9cc2defd..a087521971a5e3dd5b88d598d37e4cbc4fe2e700 100644
--- a/src/c-wrapper/api/c-account-params.cpp
+++ b/src/c-wrapper/api/c-account-params.cpp
@@ -315,12 +315,23 @@ void linphone_account_params_set_conference_factory_uri(LinphoneAccountParams *p
 }
 
 const char *linphone_account_params_get_conference_factory_uri(const LinphoneAccountParams *params) {
-	return L_STRING_TO_C(AccountParams::toCpp(params)->getConferenceFactoryUri());
+	return AccountParams::toCpp(params)->getConferenceFactoryCstr();
 }
 
+void linphone_account_params_set_conference_factory_address(LinphoneAccountParams *params,
+                                                            const LinphoneAddress *address) {
+	AccountParams::toCpp(params)->setConferenceFactoryAddress(address ? Address::toCpp(address)->getSharedFromThis()
+	                                                                  : nullptr);
+}
+
+const LinphoneAddress *linphone_account_params_get_conference_factory_address(const LinphoneAccountParams *params) {
+	const auto &address = AccountParams::toCpp(params)->getConferenceFactoryAddress();
+	return address != nullptr ? address->toC() : nullptr;
+}
 void linphone_account_params_set_audio_video_conference_factory_address(LinphoneAccountParams *params,
                                                                         const LinphoneAddress *address) {
-	AccountParams::toCpp(params)->setAudioVideoConferenceFactoryAddress(Address::toCpp(address)->getSharedFromThis());
+	AccountParams::toCpp(params)->setAudioVideoConferenceFactoryAddress(
+	    address ? Address::toCpp(address)->getSharedFromThis() : nullptr);
 }
 
 const LinphoneAddress *
diff --git a/src/call/call.cpp b/src/call/call.cpp
index b4ee2e5b4848f192037c6c274f538ab6d48dfc8a..f309344f005d651a79a907207fc22d7ecc095766 100644
--- a/src/call/call.cpp
+++ b/src/call/call.cpp
@@ -170,9 +170,6 @@ bool Call::getMicrophoneMuted() const {
 
 void Call::setMicrophoneMuted(bool muted) {
 	static_pointer_cast<MediaSession>(getActiveSession())->getPrivate()->setMicrophoneMuted(muted);
-	if (getConference()) {
-		getConference()->notifyLocalMutedDevices(muted || !linphone_core_mic_enabled(getCore()->getCCore()));
-	}
 }
 
 LinphoneCallStats *Call::getPrivateStats(LinphoneStreamType type) const {
diff --git a/src/chat/chat-room/client-group-chat-room-p.h b/src/chat/chat-room/client-group-chat-room-p.h
index 1fd9af20a1b6362de1daea59d10c020787bca0d1..8f7edbb8390fe535e3a60a2fde6b21877c4204ed 100644
--- a/src/chat/chat-room/client-group-chat-room-p.h
+++ b/src/chat/chat-room/client-group-chat-room-p.h
@@ -41,7 +41,7 @@ public:
 	virtual ~ClientGroupChatRoomPrivate() = default;
 
 	std::list<std::shared_ptr<Address>> cleanAddressesList(const std::list<std::shared_ptr<Address>> &addresses) const;
-	std::shared_ptr<CallSession> createSessionTo(std::shared_ptr<Address> sessionTo);
+	std::shared_ptr<CallSession> createSessionTo(const std::shared_ptr<Address> &sessionTo);
 	std::shared_ptr<CallSession> createSession();
 	void multipartNotifyReceived(const std::shared_ptr<Event> &notifyLev, const Content &content);
 	void notifyReceived(const std::shared_ptr<Event> &notifyLev, const Content &content);
diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp
index f3a6995d1f8fb914c8b0cdd71a940570ebefc2f0..2258b25b7dd390af4f46b15874c6c45c6ffe2087 100644
--- a/src/chat/chat-room/client-group-chat-room.cpp
+++ b/src/chat/chat-room/client-group-chat-room.cpp
@@ -70,7 +70,7 @@ ClientGroupChatRoomPrivate::cleanAddressesList(const list<std::shared_ptr<Addres
 	return cleanedList;
 }
 
-shared_ptr<CallSession> ClientGroupChatRoomPrivate::createSessionTo(std::shared_ptr<Address> sessionTo) {
+shared_ptr<CallSession> ClientGroupChatRoomPrivate::createSessionTo(const std::shared_ptr<Address> &sessionTo) {
 	L_Q();
 
 	CallSessionParams csp;
@@ -872,8 +872,8 @@ void ClientGroupChatRoom::exhume() {
 		content.setContentEncoding("deflate");
 	}
 
-	string conferenceFactoryUri = Core::getConferenceFactoryUri(getCore(), getConferenceId().getLocalAddress());
-	std::shared_ptr<Address> conferenceFactoryAddress = Address::create(conferenceFactoryUri);
+	const auto &conferenceFactoryAddress =
+	    Core::getConferenceFactoryAddress(getCore(), getConferenceId().getLocalAddress());
 	auto session = d->createSessionTo(conferenceFactoryAddress);
 	session->startInvite(nullptr, getUtf8Subject(), &content);
 	setState(ConferenceInterface::State::CreationPending);
diff --git a/src/conference/handlers/remote-conference-list-event-handler.cpp b/src/conference/handlers/remote-conference-list-event-handler.cpp
index a6f6d40bf65fdd69b881a30df6e90adee9355225..e2d48333dfd42cccfa3b2940520fd4ccf3e75217 100644
--- a/src/conference/handlers/remote-conference-list-event-handler.cpp
+++ b/src/conference/handlers/remote-conference-list-event-handler.cpp
@@ -121,16 +121,15 @@ void RemoteConferenceListEventHandler::subscribe(const shared_ptr<Account> &acco
 
 	if (account->getState() != LinphoneRegistrationOk) return;
 
-	const auto &factoryUri = accountParams->getConferenceFactoryUri();
-	if (factoryUri.empty()) {
-		lError() << "Couldn't send chat room list subscription for account " << account << " (" << identityAddress
+	const auto &factoryUri = accountParams->getConferenceFactoryAddress();
+	if (!factoryUri || !factoryUri->isValid()) {
+		lError() << "Couldn't send chat room list subscription for account " << account << " (" << *identityAddress
 		         << ") because there's no conference factory uri";
 		return;
 	}
 
-	auto rlsAddr = Address::create(factoryUri);
 	auto evSub = dynamic_pointer_cast<EventSubscribe>(
-	    (new EventSubscribe(getCore(), rlsAddr, "conference", 600))->toSharedPtr());
+	    (new EventSubscribe(getCore(), factoryUri, "conference", 600))->toSharedPtr());
 	std::string from = account->getContactAddress()->toString();
 	evSub->getOp()->setFrom(from);
 	evSub->setInternal(true);
@@ -267,6 +266,9 @@ void RemoteConferenceListEventHandler::addHandler(RemoteConferenceEventHandler *
 	}
 
 	if (!isHandlerInSameDomainAsCore(conferenceId)) {
+		lWarning() << "The chatroom with conference id " << conferenceId
+		           << " is not in the same domain as the conference factory of the account is linked to hence not "
+		              "adding to the list of subscribes";
 		return;
 	}
 
@@ -281,14 +283,17 @@ void RemoteConferenceListEventHandler::addHandler(RemoteConferenceEventHandler *
 bool RemoteConferenceListEventHandler::isHandlerInSameDomainAsCore(const ConferenceId &conferenceId) const {
 	// Ensure that conference and conference factory are in the same domain
 	const std::shared_ptr<Address> &localAddress = conferenceId.getLocalAddress();
-	const std::shared_ptr<Address> &peerAddress = conferenceId.getPeerAddress();
-	std::shared_ptr<Address> conferenceFactoryUri =
-	    Address::create(Core::getConferenceFactoryUri(getCore(), localAddress));
+	const auto conferenceFactoryUri = Core::getConferenceFactoryAddress(getCore(), localAddress);
 
+	if (!conferenceFactoryUri) {
+		lWarning() << "Account with local address " << *localAddress << " hasn't a conference factory URI defined";
+		return false;
+	}
+
+	const std::shared_ptr<Address> &peerAddress = conferenceId.getPeerAddress();
 	if (peerAddress->getDomain() != conferenceFactoryUri->getDomain()) {
-		lWarning() << "Peer address " << peerAddress->toString()
-		           << " is not in the same domain as the conference factory URI " << conferenceFactoryUri->toString()
-		           << " hence not adding to the list of subscribes";
+		lWarning() << "Peer address " << *peerAddress << " is not in the same domain as the conference factory URI "
+		           << *conferenceFactoryUri;
 		return false;
 	}
 
@@ -303,6 +308,9 @@ void RemoteConferenceListEventHandler::removeHandler(RemoteConferenceEventHandle
 	}
 
 	if (!isHandlerInSameDomainAsCore(conferenceId)) {
+		lWarning() << "The chatroom with conference id " << conferenceId
+		           << " is not in the same domain as the conference factory of the account is linked to hence no need "
+		              "to remove it from the list of subscribes";
 		return;
 	}
 
diff --git a/src/conference/session/audio-mixer.cpp b/src/conference/session/audio-mixer.cpp
index 3107c3fcaa59a50c622a8972c8bae98d2bc0d74f..86f26db58f6d1755da79747aed7b709280adff32 100644
--- a/src/conference/session/audio-mixer.cpp
+++ b/src/conference/session/audio-mixer.cpp
@@ -150,9 +150,16 @@ void MS2AudioMixer::setRecordPath(const std::string &path) {
 
 void MS2AudioMixer::enableMic(bool value) {
 	mLocalMicEnabled = value;
-	if (mLocalEndpoint)
-		ms_audio_conference_mute_member(mConference, mLocalEndpoint,
-		                                !(value && linphone_core_mic_enabled(mSession.getCore().getCCore())));
+	if (mLocalEndpoint) {
+		bool coreMicrophoneEnabled = !!linphone_core_mic_enabled(mSession.getCore().getCCore());
+		if (!coreMicrophoneEnabled) {
+			lWarning() << "Microphone of the local participant of conference will be muted because the microphone is disabled in the core settings";
+		}
+		bool enabled = (value && coreMicrophoneEnabled);
+		bctbx_message("AudioMixer[%p]: mic of local participnt is [%s].", this, enabled ? "enabled" : "disabled");
+
+		ms_audio_conference_mute_member(mConference, mLocalEndpoint, !enabled);
+	}
 }
 
 bool MS2AudioMixer::micEnabled() const {
diff --git a/src/core/core-call.cpp b/src/core/core-call.cpp
index fe16054507059d46cab67c7ea9892d6a813ec2db..f7349188ae8c2397450a08a8be06c94a80412c4a 100644
--- a/src/core/core-call.cpp
+++ b/src/core/core-call.cpp
@@ -363,10 +363,10 @@ void Core::reportConferenceCallEvent(EventLog::Type type,
 		LinphoneAccount *account = linphone_core_lookup_known_account(getCCore(), to->toC());
 		std::shared_ptr<Address> from = callLog->getFromAddress() ? callLog->getFromAddress() : nullptr;
 		if (account) {
-			string conferenceFactoryUri = Account::toCpp(account)->getAccountParams()->getConferenceFactoryUri();
-			if (!conferenceFactoryUri.empty()) {
-				std::shared_ptr<Address> conferenceFactory = Address::create(conferenceFactoryUri);
-				if (to->weakEqual(*conferenceFactory)) {
+			const auto &conferenceFactoryUri =
+			    Account::toCpp(account)->getAccountParams()->getConferenceFactoryAddress();
+			if (conferenceFactoryUri && conferenceFactoryUri->isValid()) {
+				if (to->weakEqual(*conferenceFactoryUri)) {
 					return;
 				}
 			}
diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp
index bcf9f0ec7e434c71461750678c08df818ca8161e..b1a02e01da0e3960370bf28e0f2ccdd3172d0b5c 100644
--- a/src/core/core-chat-room.cpp
+++ b/src/core/core-chat-room.cpp
@@ -196,8 +196,7 @@ CorePrivate::createClientGroupChatRoom(const string &subject, bool fallback, boo
 	L_Q();
 
 	auto defaultLocalAddress = getDefaultLocalAddress(nullptr, true);
-	std::shared_ptr<Address> conferenceFactoryUri =
-	    Address::create(Core::getConferenceFactoryUri(q->getSharedFromThis(), defaultLocalAddress));
+	const auto &conferenceFactoryUri = Core::getConferenceFactoryAddress(q->getSharedFromThis(), defaultLocalAddress);
 	shared_ptr<ChatRoomParams> params =
 	    ChatRoomParams::create(subject, encrypted, !fallback, ChatRoomParams::ChatRoomBackend::FlexisipChat);
 
@@ -212,7 +211,8 @@ shared_ptr<AbstractChatRoom> CorePrivate::createBasicChatRoom(const ConferenceId
 
 	shared_ptr<AbstractChatRoom> chatRoom;
 	BasicChatRoom *basicChatRoom = new BasicChatRoom(q->getSharedFromThis(), conferenceId, params);
-	string conferenceFactoryUri = Core::getConferenceFactoryUri(q->getSharedFromThis(), conferenceId.getLocalAddress());
+	const auto &conferenceFactoryUri =
+	    Core::getConferenceFactoryAddress(q->getSharedFromThis(), conferenceId.getLocalAddress());
 	if (basicToFlexisipChatroomMigrationEnabled()) {
 		capabilities.set(ChatRoom::Capabilities::Migratable);
 	} else {
@@ -220,7 +220,8 @@ shared_ptr<AbstractChatRoom> CorePrivate::createBasicChatRoom(const ConferenceId
 	}
 
 #ifdef HAVE_ADVANCED_IM
-	if ((capabilities & ChatRoom::Capabilities::Migratable) && !conferenceFactoryUri.empty()) {
+	if ((capabilities & ChatRoom::Capabilities::Migratable) && conferenceFactoryUri &&
+	    conferenceFactoryUri->isValid()) {
 		chatRoom.reset(new BasicToClientGroupChatRoom(shared_ptr<BasicChatRoom>(basicChatRoom)));
 	} else {
 #endif
@@ -316,8 +317,8 @@ shared_ptr<AbstractChatRoom> CorePrivate::createChatRoom(const shared_ptr<ChatRo
 	shared_ptr<AbstractChatRoom> chatRoom;
 	if (params->getChatRoomBackend() == ChatRoomParams::ChatRoomBackend::FlexisipChat) {
 #ifdef HAVE_ADVANCED_IM
-		string conferenceFactoryUri = Core::getConferenceFactoryUri(q->getSharedFromThis(), localAddr);
-		if (conferenceFactoryUri.empty()) {
+		const auto &conferenceFactoryUri = Core::getConferenceFactoryAddress(q->getSharedFromThis(), localAddr);
+		if (!conferenceFactoryUri || !conferenceFactoryUri->isValid()) {
 			lWarning() << "Not creating group chat room: no conference factory uri for local address [" << localAddr
 			           << "]";
 			return nullptr;
@@ -344,8 +345,7 @@ shared_ptr<AbstractChatRoom> CorePrivate::createChatRoom(const shared_ptr<ChatRo
 			}
 		}
 
-		std::shared_ptr<Address> conferenceFactory = Address::create(conferenceFactoryUri);
-		chatRoom = createClientGroupChatRoom(params->getSubject(), conferenceFactory, conferenceId, Content(),
+		chatRoom = createClientGroupChatRoom(params->getSubject(), conferenceFactoryUri, conferenceId, Content(),
 		                                     ChatRoomParams::toCapabilities(params), params, false);
 
 		if (!chatRoom) {
@@ -651,23 +651,26 @@ static bool compare_chat_room(const shared_ptr<AbstractChatRoom> &first, const s
 	return first->getLastUpdateTime() > second->getLastUpdateTime();
 }
 
-string Core::getConferenceFactoryUri(const shared_ptr<Core> &core, const std::shared_ptr<const Address> &localAddress) {
-	LinphoneAccount *account = linphone_core_lookup_account_by_identity(core->getCCore(), localAddress->toC());
+const std::shared_ptr<Address> Core::getConferenceFactoryAddress(const shared_ptr<Core> &core,
+                                                                 const std::shared_ptr<const Address> &localAddress) {
+	LinphoneAccount *account =
+	    linphone_core_lookup_account_by_identity(core->getCCore(), localAddress ? localAddress->toC() : nullptr);
 	if (!account) {
 		lWarning() << "No account found for local address: [" << localAddress->toString() << "]";
-		return string();
-	} else return getConferenceFactoryUri(core, account);
+		return nullptr;
+	} else return getConferenceFactoryAddress(core, Account::toCpp(account)->getSharedFromThis());
 }
 
-string Core::getConferenceFactoryUri(BCTBX_UNUSED(const shared_ptr<Core> &core), const LinphoneAccount *account) {
-	const LinphoneAccountParams *params = linphone_account_get_params(account);
+const std::shared_ptr<Address> Core::getConferenceFactoryAddress(BCTBX_UNUSED(const shared_ptr<Core> &core),
+                                                                 const std::shared_ptr<Account> account) {
+	const auto &params = account->getAccountParams();
 	if (params) {
-		const char *uri = linphone_account_params_get_conference_factory_uri(params);
+		const auto &uri = params->getConferenceFactoryAddress();
 		if (uri) {
 			return uri;
 		}
 	}
-	return string();
+	return nullptr;
 }
 
 // -----------------------------------------------------------------------------
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 9be7a0830c6eca84ab338d8c6a8a8b7437dfc624..75aeecb89e8548b32fc7dd3d7124e90332ba87c7 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -1724,12 +1724,11 @@ shared_ptr<CallSession> Core::createOrUpdateConferenceOnServer(const std::shared
 	if (confAddr) {
 		conferenceFactoryUri = confAddr;
 	} else {
-		LinphoneAddress *factoryUri = Core::getAudioVideoConferenceFactoryAddress(getSharedFromThis(), localAddr);
-		if (factoryUri == nullptr) {
+		conferenceFactoryUri = Core::getAudioVideoConferenceFactoryAddress(getSharedFromThis(), localAddr);
+		if (!conferenceFactoryUri || !conferenceFactoryUri->isValid()) {
 			lWarning() << "Not creating conference: no conference factory uri for local address [" << *localAddr << "]";
 			return nullptr;
 		}
-		conferenceFactoryUri = Address::toCpp(factoryUri)->getSharedFromThis();
 		conferenceFactoryUri->setUriParam(Conference::SecurityModeParameter,
 		                                  ConferenceParams::getSecurityLevelAttribute(confParams->getSecurityLevel()));
 	}
@@ -1822,29 +1821,29 @@ const std::list<LinphoneMediaEncryption> Core::getSupportedMediaEncryptions() co
 	return encEnumList;
 }
 
-LinphoneAddress *Core::getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
-                                                             const std::shared_ptr<Address> &localAddress) {
+const std::shared_ptr<Address>
+Core::getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
+                                            const std::shared_ptr<Address> &localAddress) {
 	std::shared_ptr<Address> addr = localAddress;
 	LinphoneAccount *account = linphone_core_lookup_known_account(core->getCCore(), addr->toC());
 
 	if (!account) {
-		lWarning() << "No account found for local address: [" << localAddress->toString() << "]";
+		lWarning() << "No account found for local address: [" << *localAddress << "]";
 		return nullptr;
-	} else return getAudioVideoConferenceFactoryAddress(core, account);
+	} else return getAudioVideoConferenceFactoryAddress(core, Account::toCpp(account)->getSharedFromThis());
 }
 
-LinphoneAddress *Core::getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
-                                                             const LinphoneAccount *account) {
-	const auto &address = Account::toCpp(account)->getAccountParams()->getAudioVideoConferenceFactoryAddress();
+const std::shared_ptr<Address> Core::getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
+                                                                           const std::shared_ptr<Account> account) {
+	const auto &address = account->getAccountParams()->getAudioVideoConferenceFactoryAddress();
 	if (address == nullptr) {
-		string conferenceFactoryUri = getConferenceFactoryUri(core, account);
+		const auto &conferenceFactoryUri = getConferenceFactoryAddress(core, account);
 		lWarning() << "Audio/video conference factory is null, fallback to default conference factory URI ["
-		           << conferenceFactoryUri << "]";
-		if (conferenceFactoryUri.empty()) return nullptr;
-		return linphone_address_new(conferenceFactoryUri.c_str());
+		           << *conferenceFactoryUri << "]";
+		if (!conferenceFactoryUri || !conferenceFactoryUri->isValid()) return nullptr;
+		return conferenceFactoryUri;
 	}
-	LinphoneAddress *factory_address = address->toC();
-	return factory_address;
+	return address;
 }
 
 void Core::initPlugins() {
diff --git a/src/core/core.h b/src/core/core.h
index 68e6918bdb2550bcf252c0d8663117f831e0fadf..d5ee872e4e8e4876dc80722bb0a3cc40f4e03bd7 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -125,13 +125,15 @@ public:
 	// Return a new Core instance. Entry point of Linphone.
 	static std::shared_ptr<Core> create(LinphoneCore *cCore);
 
-	static std::string getConferenceFactoryUri(const std::shared_ptr<Core> &core,
-	                                           const std::shared_ptr<const Address> &localAddress);
-	static std::string getConferenceFactoryUri(const std::shared_ptr<Core> &core, const LinphoneAccount *account);
-	static LinphoneAddress *getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
-	                                                              const std::shared_ptr<Address> &localAddress);
-	static LinphoneAddress *getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
-	                                                              const LinphoneAccount *account);
+	static const std::shared_ptr<Address>
+	getConferenceFactoryAddress(const std::shared_ptr<Core> &core, const std::shared_ptr<const Address> &localAddress);
+	static const std::shared_ptr<Address> getConferenceFactoryAddress(const std::shared_ptr<Core> &core,
+	                                                                  const std::shared_ptr<Account> account);
+	static const std::shared_ptr<Address>
+	getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
+	                                      const std::shared_ptr<Address> &localAddress);
+	static const std::shared_ptr<Address> getAudioVideoConferenceFactoryAddress(const std::shared_ptr<Core> &core,
+	                                                                            const std::shared_ptr<Account> account);
 
 	// ---------------------------------------------------------------------------
 	// Application lifecycle.
diff --git a/tester/audio_video_conference_tester.c b/tester/audio_video_conference_tester.c
index 9ae4d222972ea4f2a5122c0b0dec7798f488cc4d..f34da0c012b0d035da6f8e87a22badda3e1528cc 100644
--- a/tester/audio_video_conference_tester.c
+++ b/tester/audio_video_conference_tester.c
@@ -1111,13 +1111,13 @@ static void simple_conference_notify_muted_device(void) {
 	}
 	bctbx_list_free_with_data(participant_devices, (void (*)(void *))linphone_participant_device_unref);
 
-	linphone_core_mute_mic(pauline->lc, TRUE);
+	linphone_core_enable_mic(pauline->lc, FALSE);
 	BC_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneParticipantDeviceMuted, 1, 5000));
 
-	linphone_core_mute_mic(pauline->lc, FALSE);
+	linphone_core_enable_mic(pauline->lc, TRUE);
 	BC_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneParticipantDeviceUnmuted, 1, 5000));
 
-	linphone_core_mute_mic(laure->lc, TRUE);
+	linphone_core_enable_mic(laure->lc, FALSE);
 	BC_ASSERT_TRUE(wait_for_list(lcs, &laure->stat.number_of_LinphoneParticipantDeviceMuted, 2, 5000));
 
 	terminate_conference(new_participants, marie, NULL, NULL);
@@ -2985,8 +2985,8 @@ static void simple_conference_with_subject_change_from_admin_base(bool_t enable_
 	linphone_proxy_config_set_route(laure_proxy_config, laure_proxy_uri);
 	linphone_proxy_config_done(laure_proxy_config);
 
-	// Remove conference spec after setting conference factory uri as the callback onConferenceFactoryUriChanged sets
-	// ephemeral, groupchat and conference versions
+	// Remove conference spec after setting conference factory uri as the callback onConferenceFactoryAddressChanged
+	// sets ephemeral, groupchat and conference versions
 	if (remove_conference_version) {
 		linphone_core_remove_linphone_spec(marie->lc, "conference");
 	}
diff --git a/tester/local_chat_imdn_tester.cpp b/tester/local_chat_imdn_tester.cpp
index 4b9d5be6677b0e6352ca375c04965dec7406d308..e408eee728dd2cffd557fda9cd5454817c7d4586 100644
--- a/tester/local_chat_imdn_tester.cpp
+++ b/tester/local_chat_imdn_tester.cpp
@@ -233,11 +233,11 @@ static void
 group_chat_room_with_client_idmn_after_restart_base(bool_t encrypted, bool_t add_participant, bool_t stop_core) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle2("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle2("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -358,7 +358,7 @@ group_chat_room_with_client_idmn_after_restart_base(bool_t encrypted, bool_t add
 		ms_message("%s goes offline", linphone_core_get_identity(laure.getLc()));
 		linphone_core_set_network_reachable(laure.getLc(), FALSE);
 
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 		focus.registerAsParticipantDevice(berthe);
 		linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(berthe.getLc()));
 		stats berthe_stat = berthe.getStats();
@@ -696,9 +696,9 @@ static void group_chat_room_lime_session_corrupted(void) {
 	{ // to make sure focus is destroyed after clients.
 		linphone_core_enable_lime_x3dh(focus.getLc(), true);
 
-		ClientConference marie("marie_rc", focus.getIdentity(), true);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), true);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), true);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), true);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_chat_tester.cpp b/tester/local_chat_tester.cpp
index 2a1ff017b0eee4719888e332cc4498729872010d..f08158fe6e6c99e7c923d30868ac3a226cb1f80f 100644
--- a/tester/local_chat_tester.cpp
+++ b/tester/local_chat_tester.cpp
@@ -28,9 +28,9 @@ namespace LinphoneTest {
 static void group_chat_room_creation_server(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -133,9 +133,9 @@ static void group_chat_room_creation_server(void) {
 static void group_chat_room_server_deletion(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference pauline2("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline2("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -224,8 +224,8 @@ static void group_chat_room_server_deletion(void) {
 static void group_chat_room_server_deletion_with_rmt_lst_event_handler(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -328,9 +328,9 @@ static void group_chat_room_server_deletion_with_rmt_lst_event_handler(void) {
 static void group_chat_room_with_client_removed_added(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -404,7 +404,7 @@ static void group_chat_room_with_client_removed_added(void) {
 		initialMichelleStats = michelle.getStats();
 		initialPaulineStats = pauline.getStats();
 
-		ClientConference michelle2("michelle_rc", focus.getIdentity());
+		ClientConference michelle2("michelle_rc", focus.getConferenceFactoryAddress());
 		stats initialMichelle2Stats = michelle2.getStats();
 		coresList = bctbx_list_append(coresList, michelle2.getLc());
 		focus.registerAsParticipantDevice(michelle2);
@@ -566,10 +566,10 @@ static void group_chat_room_with_client_deletes_chatroom_after_restart(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool encrypted = false;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -739,9 +739,9 @@ static void group_chat_room_with_client_registering_with_short_register_expires(
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool_t encrypted = FALSE;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -947,9 +947,9 @@ static void group_chat_room_with_client_restart_removed_from_server(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool_t encrypted = FALSE;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -1137,9 +1137,9 @@ static void group_chat_room_with_client_removed_while_stopped_base(bool_t use_re
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool_t encrypted = FALSE;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -1302,8 +1302,8 @@ static void group_chat_room_with_client_removed_while_stopped_base(bool_t use_re
 			LinphoneAccount *account = linphone_core_get_default_account(michelle.getLc());
 			const LinphoneAccountParams *account_params = linphone_account_get_params(account);
 			LinphoneAccountParams *new_account_params = linphone_account_params_clone(account_params);
-			linphone_account_params_set_conference_factory_uri(new_account_params,
-			                                                   focus.getIdentity().asString().c_str());
+			linphone_account_params_set_conference_factory_address(new_account_params,
+			                                                       focus.getConferenceFactoryAddress().toC());
 			linphone_account_set_params(account, new_account_params);
 			linphone_account_params_unref(new_account_params);
 		}
@@ -1343,7 +1343,7 @@ static void group_chat_room_with_client_removed_while_stopped_base(bool_t use_re
 
 		// A second device for Berthe is added in order to verify that the server will not send a NOTIFY full state
 		// where Michelle is still a participant but she has no devices associated
-		ClientConference berthe2("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference berthe2("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 		stats initialBerthe2Stats = berthe2.getStats();
 		coresList = bctbx_list_append(coresList, berthe2.getLc());
 
@@ -1473,10 +1473,10 @@ static void group_chat_room_with_creator_without_groupchat_capability_in_registe
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool_t encrypted = FALSE;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference marie2("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference marie2("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		stats initialMarieStats = marie.getStats();
 		stats initialMarie2Stats = marie2.getStats();
@@ -1610,9 +1610,9 @@ static void group_chat_room_with_creator_without_groupchat_capability(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
 		bool_t encrypted = FALSE;
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		bctbx_list_t *coresList = bctbx_list_append(NULL, focus.getLc());
 		coresList = bctbx_list_append(coresList, marie.getLc());
@@ -1694,9 +1694,9 @@ static void group_chat_room_with_subscribe_error(void) {
 static void group_chat_room_bulk_notify_to_participant(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1766,7 +1766,7 @@ static void group_chat_room_bulk_notify_to_participant(void) {
 		linphone_core_set_network_reachable(pauline.getLc(), FALSE);
 
 		// Adding Laure
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 		coresList = bctbx_list_append(coresList, laure.getLc());
 		focus.registerAsParticipantDevice(laure);
 
@@ -1955,8 +1955,8 @@ static void group_chat_room_bulk_notify_to_participant(void) {
 static void one_to_one_chatroom_exhumed_while_offline(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -2163,9 +2163,9 @@ static void multidomain_group_chat_room(void) {
 	Focus focusExampleDotOrg("chloe_rc");
 	Focus focusAuth1DotExampleDotOrg("arthur_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focusExampleDotOrg.getIdentity());
-		ClientConference pauline("pauline_rc", focusExampleDotOrg.getIdentity());
-		ClientConference michelle("michelle_rc", focusExampleDotOrg.getIdentity());
+		ClientConference marie("marie_rc", focusExampleDotOrg.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focusExampleDotOrg.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focusExampleDotOrg.getConferenceFactoryAddress());
 
 		focusExampleDotOrg.registerAsParticipantDevice(marie);
 		focusExampleDotOrg.registerAsParticipantDevice(pauline);
@@ -2300,7 +2300,7 @@ static void multidomain_group_chat_room(void) {
 		BC_ASSERT_TRUE(wait_for_list(coresList, &marie.getStats().number_of_LinphoneSubscriptionActive, 2,
 		                             liblinphone_tester_sip_timeout));
 
-		ClientConference laure("laure_tcp_rc", focusExampleDotOrg.getIdentity());
+		ClientConference laure("laure_tcp_rc", focusExampleDotOrg.getConferenceFactoryAddress());
 		coresList = bctbx_list_append(coresList, laure.getLc());
 		Address laureAddr = laure.getIdentity();
 		focusExampleDotOrg.registerAsParticipantDevice(laure);
@@ -2395,9 +2395,9 @@ static void one_to_one_group_chat_room_deletion_by_server_client(void) {
 static void group_chat_room_add_participant_with_invalid_address(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -2532,7 +2532,7 @@ static void group_chat_room_add_participant_with_invalid_address(void) {
 static void group_chat_room_with_only_participant_with_invalid_address(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 
diff --git a/tester/local_conference_edition_tester.cpp b/tester/local_conference_edition_tester.cpp
index abdbabca03e09cc6c5c99e01f4d1ddcbc84d684d..2930cd0b81beb2ed06da65482dbfe1525e154f3e 100644
--- a/tester/local_conference_edition_tester.cpp
+++ b/tester/local_conference_edition_tester.cpp
@@ -35,11 +35,11 @@ static void edit_simple_conference_base(bool_t from_organizer,
 
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference lise("lise_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference lise("lise_rc", focus.getConferenceFactoryAddress());
 
 		LinphoneCoreManager *manager_editing = (from_organizer) ? marie.getCMgr() : laure.getCMgr();
 		linphone_core_enable_rtp_bundle(manager_editing->lc, enable_bundle_mode);
@@ -956,10 +956,10 @@ static void conference_edition_with_simultaneous_participant_add_remove_base(boo
 	{ // to make sure focus is destroyed after clients.
 		linphone_core_enable_lime_x3dh(focus.getLc(), true);
 
-		ClientConference marie("marie_rc", focus.getIdentity(), true);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), true);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), true);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), true);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), true);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1252,10 +1252,10 @@ static void conference_edition_with_organizer_codec_mismatch(void) {
 static void conference_cancelled_through_edit_base(bool_t server_restart) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_conference_tester_functions.cpp b/tester/local_conference_tester_functions.cpp
index 7cb2bcbf74478fc4962eaa4327503b6e9386cfcf..e9faf8e6fcca58652c4fa9961e59932c62f0f06e 100644
--- a/tester/local_conference_tester_functions.cpp
+++ b/tester/local_conference_tester_functions.cpp
@@ -174,8 +174,8 @@ bool checkChatroom(Focus &focus, const ConfCoreManager &core, const time_t baseJ
 void group_chat_room_server_admin_managed_messages_base(bool_t encrypted) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -272,10 +272,10 @@ void group_chat_room_server_admin_managed_messages_base(bool_t encrypted) {
 void group_chat_room_with_client_restart_base(bool encrypted) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(michelle);
@@ -377,7 +377,7 @@ void group_chat_room_with_client_restart_base(bool encrypted) {
 			        .waitUntil(chrono::seconds(10), [&focus, &core] { return checkChatroom(focus, core, -1); }));
 		};
 
-		ClientConference michelle2("michelle_rc", focus.getIdentity(), encrypted);
+		ClientConference michelle2("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
 		stats initialMichelle2Stats = michelle2.getStats();
 		coresList = bctbx_list_append(coresList, michelle2.getLc());
 		if (encrypted) {
@@ -648,12 +648,12 @@ server_core_chat_room_state_changed_sip_error(LinphoneCore *core, LinphoneChatRo
 void group_chat_room_with_sip_errors_base(bool invite_error, bool subscribe_error, bool encrypted) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), encrypted);
-		ClientConference berthe("berthe_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), encrypted);
-		ClientConference michelle2("michelle_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference michelle2("michelle_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		stats initialFocusStats = focus.getStats();
 		stats initialMarieStats = marie.getStats();
@@ -1252,9 +1252,9 @@ void group_chat_room_lime_server_message(bool encrypted) {
 	{ // to make sure focus is destroyed after clients.
 		linphone_core_enable_lime_x3dh(focus.getLc(), true);
 
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
-		ClientConference laure("laure_tcp_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1401,8 +1401,8 @@ void one_to_one_group_chat_room_deletion_by_server_client_base(bool encrypted) {
 	{ // to make sure focus is destroyed after clients.
 		linphone_core_enable_lime_x3dh(focus.getLc(), true);
 
-		ClientConference marie("marie_rc", focus.getIdentity(), encrypted);
-		ClientConference pauline("pauline_rc", focus.getIdentity(), encrypted);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), encrypted);
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress(), encrypted);
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -2651,11 +2651,11 @@ void create_conference_base(time_t start_time,
                             bool_t all_speakers) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -3063,7 +3063,7 @@ void create_conference_base(time_t start_time,
 		LinphoneConference *marie_conference = linphone_core_search_conference_2(marie.getLc(), confAddr);
 		BC_ASSERT_PTR_NOT_NULL(marie_conference);
 		if (marie_conference) {
-			linphone_conference_mute_microphone(marie_conference, TRUE);
+			linphone_conference_set_microphone_muted(marie_conference, TRUE);
 		}
 
 		for (auto mgr : conferenceMgrs) {
@@ -4877,11 +4877,11 @@ void create_conference_with_late_participant_addition_base(time_t start_time,
                                                            LinphoneConferenceSecurityLevel security_level) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -5608,11 +5608,11 @@ void create_conference_with_late_participant_addition_base(time_t start_time,
 void two_overlapping_conferences_base(bool_t same_organizer, bool_t dialout) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -6518,9 +6518,9 @@ void create_one_participant_conference_toggle_video_base(LinphoneConferenceLayou
                                                          bool_t enable_stun) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 
@@ -7201,11 +7201,11 @@ void create_one_participant_conference_toggle_video_base(LinphoneConferenceLayou
 void create_conference_with_active_call_base(bool_t dialout) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -7817,9 +7817,9 @@ void create_simple_conference_merging_calls_base(bool_t enable_ice,
                                                  LinphoneConferenceSecurityLevel security_level) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_conference_tester_functions.h b/tester/local_conference_tester_functions.h
index ff660bf560f7f011aaa1219f1b47eab9a56a4d44..89cce82b8a48c09c8d6903aeb7a835d1da77022e 100644
--- a/tester/local_conference_tester_functions.h
+++ b/tester/local_conference_tester_functions.h
@@ -246,6 +246,13 @@ public:
 		configureFocus();
 	}
 
+	const Address getConferenceFactoryAddress() const {
+		LinphoneAccount *account = linphone_core_get_default_account(getLc());
+		const LinphoneAccountParams *account_params = linphone_account_get_params(account);
+		const LinphoneAddress *factory_uri = linphone_account_params_get_conference_factory_address(account_params);
+		return *Address::toCpp(factory_uri);
+	}
+
 private:
 	static void server_core_chat_room_conference_address_generation(LinphoneChatRoom *cr) {
 		Focus *focus =
@@ -327,7 +334,8 @@ private:
 		const LinphoneAccountParams *account_params = linphone_account_get_params(account);
 		LinphoneAccountParams *new_account_params = linphone_account_params_clone(account_params);
 		linphone_account_params_enable_rtp_bundle(new_account_params, TRUE);
-		linphone_account_params_set_conference_factory_uri(new_account_params, getIdentity().toString().c_str());
+		Address factoryAddress = getIdentity();
+		linphone_account_params_set_conference_factory_address(new_account_params, factoryAddress.toC());
 		linphone_account_set_params(account, new_account_params);
 		linphone_account_params_unref(new_account_params);
 		BC_ASSERT_TRUE(linphone_account_params_rtp_bundle_enabled(linphone_account_get_params(account)));
diff --git a/tester/local_ephemeral_chat_tester.cpp b/tester/local_ephemeral_chat_tester.cpp
index 4fa7ccea208d5c4b6c8dc59df9162311f528f9ef..176cd07f698e29b388aac3940e5e9886bb3cca5c 100644
--- a/tester/local_ephemeral_chat_tester.cpp
+++ b/tester/local_ephemeral_chat_tester.cpp
@@ -31,8 +31,8 @@ static void group_chat_room_server_admin_managed_messages_unencrypted(void) {
 static void group_chat_room_server_admin_managed_messages_ephemeral_enabled_after_creation(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -186,8 +186,8 @@ static void group_chat_room_server_admin_managed_messages_ephemeral_enabled_afte
 static void group_chat_room_server_admin_managed_messages_ephemeral_disabled_after_creation(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -395,8 +395,8 @@ static void group_chat_room_server_admin_managed_messages_ephemeral_disabled_aft
 static void group_chat_room_server_admin_managed_messages_ephemeral_lifetime_update(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		linphone_core_set_default_ephemeral_lifetime(marie.getLc(), 5);
 
@@ -518,8 +518,8 @@ static void group_chat_room_server_admin_managed_messages_ephemeral_lifetime_upd
 static void group_chat_room_server_admin_managed_messages_ephemeral_lifetime_toggle_using_different_methods(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -708,8 +708,8 @@ static void group_chat_room_server_admin_managed_messages_ephemeral_lifetime_tog
 static void group_chat_room_server_ephemeral_mode_changed(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_ice_conference_tester.cpp b/tester/local_ice_conference_tester.cpp
index 43fe0a6cd729ea8d6323fd6d58087f9a267a9403..4641f02c7c1e5826c18dd42af5afb81ca8e68f12 100644
--- a/tester/local_ice_conference_tester.cpp
+++ b/tester/local_ice_conference_tester.cpp
@@ -102,9 +102,9 @@ static void create_simple_ice_conference_merging_calls(void) {
 static void abort_call_to_ice_conference(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_inpromptu_conference_tester.cpp b/tester/local_inpromptu_conference_tester.cpp
index 335714a2b79b977d285f886ed3898eb6d0be2030..ae3a06173587d47ac8611d985cd9ff61c7921951 100644
--- a/tester/local_inpromptu_conference_tester.cpp
+++ b/tester/local_inpromptu_conference_tester.cpp
@@ -35,11 +35,11 @@ static void create_conference_dial_out_base(bool_t send_ics,
                                             LinphoneConferenceSecurityLevel security_level) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -916,11 +916,11 @@ static void create_simple_conference_dial_out_with_video_not_initiated(void) {
 static void create_simple_conference_dial_out_organizer_codec_mismatch(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1004,11 +1004,11 @@ static void create_simple_conference_dial_out_organizer_codec_mismatch(void) {
 static void create_simple_conference_dial_out_with_some_calls_declined_base(LinphoneReason reason) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1663,11 +1663,11 @@ static void create_dial_out_conference_with_active_call(void) {
 static void simple_dial_out_conference_with_no_payloads(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_scheduled_conference_tester.cpp b/tester/local_scheduled_conference_tester.cpp
index 13d8f1b1460bd584beb46fda3f7dccd0206a2c4c..2fb666b5f5696f223b2674f4a91960bf6c886345 100644
--- a/tester/local_scheduled_conference_tester.cpp
+++ b/tester/local_scheduled_conference_tester.cpp
@@ -28,7 +28,7 @@ namespace LinphoneTest {
 static void call_to_inexisting_conference_address(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
 
 		bctbx_list_t *coresList = NULL;
 		coresList = bctbx_list_append(coresList, focus.getLc());
@@ -61,7 +61,7 @@ static void call_to_inexisting_conference_address(void) {
 static void create_conference_on_unresponsive_server(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 
@@ -295,10 +295,10 @@ static void two_overlapping_scheduled_conferences_from_different_organizers(void
 static void create_conference_with_audio_only_participants_base(LinphoneConferenceSecurityLevel security_level) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -832,11 +832,11 @@ static void create_end_to_end_encryption_conference_with_audio_only_participants
 static void create_conference_with_codec_mismatch_base(bool_t organizer_codec_mismatch) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
-		ClientConference berthe("berthe_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
+		ClientConference berthe("berthe_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1230,9 +1230,9 @@ static void create_conference_with_participant_codec_mismatch(void) {
 static void create_conference_with_server_restart_base(bool_t organizer_first) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -1574,10 +1574,10 @@ static void create_conference_with_server_restart_participant_first(void) {
 static void create_simple_conference_with_update_deferred(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
-		ClientConference michelle("michelle_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
@@ -2044,9 +2044,9 @@ static void create_simple_conference_with_update_deferred(void) {
 static void change_active_speaker(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity()); // audio only
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress()); // audio only
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		setup_conference_info_cbs(marie.getCMgr());
@@ -2328,9 +2328,9 @@ static void create_scheduled_conference_with_active_call(void) {
 static void conference_with_participant_added_outside_valid_time_slot (bool_t before_start) {
 	Focus focus("chloe_rc");
 	{//to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity());
-		ClientConference pauline("pauline_rc", focus.getIdentity());
-		ClientConference laure("laure_tcp_rc", focus.getIdentity());
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress());
+		ClientConference pauline("pauline_rc", focus.getConferenceFactoryAddress());
+		ClientConference laure("laure_tcp_rc", focus.getConferenceFactoryAddress());
 
 		focus.registerAsParticipantDevice(marie);
 		focus.registerAsParticipantDevice(pauline);
diff --git a/tester/local_secure_chat_tester.cpp b/tester/local_secure_chat_tester.cpp
index 1e17d89792df643a714eb4b8f84abeff45a787bd..dcdbdaece793f2584eaa17c7cf170359086d0a78 100644
--- a/tester/local_secure_chat_tester.cpp
+++ b/tester/local_secure_chat_tester.cpp
@@ -39,10 +39,10 @@ static void secure_group_chat_room_with_subscribe_error(void) {
 static void secure_group_chat_room_with_chat_room_deleted_before_server_restart(void) {
 	Focus focus("chloe_rc");
 	{ // to make sure focus is destroyed after clients.
-		ClientConference marie("marie_rc", focus.getIdentity(), true);
-		ClientConference marie2("marie_rc", focus.getIdentity(), true);
-		ClientConference michelle("michelle_rc", focus.getIdentity(), true);
-		ClientConference michelle2("michelle_rc", focus.getIdentity(), true);
+		ClientConference marie("marie_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference marie2("marie_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference michelle("michelle_rc", focus.getConferenceFactoryAddress(), true);
+		ClientConference michelle2("michelle_rc", focus.getConferenceFactoryAddress(), true);
 
 		stats initialFocusStats = focus.getStats();
 		stats initialMarieStats = marie.getStats();
diff --git a/tester/vcard_tester.c b/tester/vcard_tester.c
index 95e6e588f995e7201cd27e9f0e27467c8cdb96e7..487688bf675adc8cbc6f2fc2c28bf476e5a3253e 100644
--- a/tester/vcard_tester.c
+++ b/tester/vcard_tester.c
@@ -165,7 +165,7 @@ static void linphone_vcard_phone_numbers_and_sip_addresses(void) {
 
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(sip_addresses), 2, unsigned int, "%u");
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(phone_numbers), 1, unsigned int, "%u");
-	if (phone_numbers) bctbx_list_free(phone_numbers);
+	if (phone_numbers) bctbx_list_free_with_data(phone_numbers, ms_free);
 	linphone_friend_unref(lf);
 
 	lvc = linphone_vcard_context_get_vcard_from_buffer(
@@ -180,7 +180,7 @@ static void linphone_vcard_phone_numbers_and_sip_addresses(void) {
 
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(sip_addresses), 0, unsigned int, "%u");
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(phone_numbers), 2, unsigned int, "%u");
-	if (phone_numbers) bctbx_list_free(phone_numbers);
+	if (phone_numbers) bctbx_list_free_with_data(phone_numbers, ms_free);
 
 	addr = linphone_address_new("sip:sylvain@sip.linphone.org");
 	linphone_friend_add_address(lf, addr);
@@ -190,12 +190,12 @@ static void linphone_vcard_phone_numbers_and_sip_addresses(void) {
 	linphone_friend_remove_phone_number(lf, "0952636505");
 	phone_numbers = linphone_friend_get_phone_numbers(lf);
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(phone_numbers), 1, unsigned int, "%u");
-	if (phone_numbers) bctbx_list_free(phone_numbers);
+	if (phone_numbers) bctbx_list_free_with_data(phone_numbers, ms_free);
 
 	linphone_friend_remove_phone_number(lf, "0476010203");
 	phone_numbers = linphone_friend_get_phone_numbers(lf);
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(phone_numbers), 0, unsigned int, "%u");
-	if (phone_numbers) bctbx_list_free(phone_numbers);
+	if (phone_numbers) bctbx_list_free_with_data(phone_numbers, ms_free);
 
 	linphone_friend_edit(lf);
 	linphone_friend_remove_address(lf, addr);
@@ -206,7 +206,7 @@ static void linphone_vcard_phone_numbers_and_sip_addresses(void) {
 	linphone_friend_add_phone_number(lf, "+33952636505");
 	phone_numbers = linphone_friend_get_phone_numbers(lf);
 	BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(phone_numbers), 1, unsigned int, "%u");
-	if (phone_numbers) bctbx_list_free(phone_numbers);
+	if (phone_numbers) bctbx_list_free_with_data(phone_numbers, ms_free);
 
 	linphone_address_unref(addr);
 	linphone_friend_unref(lf);