diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h
index d2feab36e9c1338eeb727f56b8c2598d56664e4d..01ff200a329857205fb37d8d392bb606e4bc5f0c 100644
--- a/coreapi/private_functions.h
+++ b/coreapi/private_functions.h
@@ -143,10 +143,6 @@ void linphone_call_params_set_sent_video_definition(LinphoneCallParams *params,
 void linphone_call_params_set_received_video_definition(LinphoneCallParams *params, LinphoneVideoDefinition *vdef);
 void linphone_call_params_set_sent_fps(LinphoneCallParams *params, float value);
 void linphone_call_params_set_received_fps(LinphoneCallParams *params, float value);
-void linphone_call_params_set_used_audio_codec(LinphoneCallParams *params, OrtpPayloadType *codec);
-void linphone_call_params_set_used_video_codec(LinphoneCallParams *params, OrtpPayloadType *codec);
-void linphone_call_params_set_used_fec_codec(LinphoneCallParams *params, OrtpPayloadType *codec);
-void linphone_call_params_set_used_text_codec(LinphoneCallParams *params, OrtpPayloadType *codec);
 bool_t linphone_call_params_get_no_user_consent(const LinphoneCallParams *params);
 time_t linphone_call_params_get_start_time(const LinphoneCallParams *params);
 time_t linphone_call_params_get_end_time(const LinphoneCallParams *params);
diff --git a/src/c-wrapper/api/c-call-params.cpp b/src/c-wrapper/api/c-call-params.cpp
index 2fa745243d6175b129b5f3412245292b1b1eb5cd..e62e5a4bd3f8e65fdf86b57f7c088553c183c2e5 100644
--- a/src/c-wrapper/api/c-call-params.cpp
+++ b/src/c-wrapper/api/c-call-params.cpp
@@ -356,22 +356,6 @@ const LinphonePayloadType *linphone_call_params_get_used_text_payload_type(const
 	return bellesip::toC(L_GET_CPP_PTR_FROM_C_OBJECT(params)->getUsedRealtimeTextPayloadType());
 }
 
-void linphone_call_params_set_used_audio_codec(LinphoneCallParams *params, OrtpPayloadType *codec) {
-	L_GET_PRIVATE_FROM_C_OBJECT(params)->setUsedAudioCodec(codec);
-}
-
-void linphone_call_params_set_used_video_codec(LinphoneCallParams *params, OrtpPayloadType *codec) {
-	L_GET_PRIVATE_FROM_C_OBJECT(params)->setUsedVideoCodec(codec);
-}
-
-void linphone_call_params_set_used_fec_codec(LinphoneCallParams *params, OrtpPayloadType *codec) {
-	L_GET_PRIVATE_FROM_C_OBJECT(params)->setUsedFecCodec(codec);
-}
-
-void linphone_call_params_set_used_text_codec(LinphoneCallParams *params, OrtpPayloadType *codec) {
-	L_GET_PRIVATE_FROM_C_OBJECT(params)->setUsedRealtimeTextCodec(codec);
-}
-
 bool_t linphone_call_params_low_bandwidth_enabled(const LinphoneCallParams *params) {
 	return L_GET_CPP_PTR_FROM_C_OBJECT(params)->lowBandwidthEnabled();
 }
diff --git a/src/conference/params/media-session-params-p.h b/src/conference/params/media-session-params-p.h
index f413ce40a66e2683f45f145b57cdbc863f79f136..9d7cc7a33a224b1360f10e7d31410d89e1921059 100644
--- a/src/conference/params/media-session-params-p.h
+++ b/src/conference/params/media-session-params-p.h
@@ -97,17 +97,17 @@ public:
 		sentFps = value;
 	}
 	void setSentVideoDefinition(LinphoneVideoDefinition *value);
-	void setUsedAudioCodec(OrtpPayloadType *pt) {
-		usedAudioCodec = pt ? PayloadType::create(nullptr, pt) : nullptr;
+	void setUsedAudioCodec(std::shared_ptr<PayloadType> pt) {
+		usedAudioCodec = pt;
 	}
-	void setUsedVideoCodec(OrtpPayloadType *pt) {
-		usedVideoCodec = pt ? PayloadType::create(nullptr, pt) : nullptr;
+	void setUsedVideoCodec(std::shared_ptr<PayloadType> pt) {
+		usedVideoCodec = pt;
 	}
-	void setUsedRealtimeTextCodec(OrtpPayloadType *pt) {
-		usedRealtimeTextCodec = pt ? PayloadType::create(nullptr, pt) : nullptr;
+	void setUsedRealtimeTextCodec(std::shared_ptr<PayloadType> pt) {
+		usedRealtimeTextCodec = pt;
 	}
-	void setUsedFecCodec(OrtpPayloadType *pt) {
-		usedFecCodec = pt ? PayloadType::create(nullptr, pt) : nullptr;
+	void setUsedFecCodec(std::shared_ptr<PayloadType> pt) {
+		usedFecCodec = pt;
 	}
 	SalCustomSdpAttribute *getCustomSdpAttributes() const;
 	void setCustomSdpAttributes(const SalCustomSdpAttribute *csa);
diff --git a/src/conference/session/audio-stream.cpp b/src/conference/session/audio-stream.cpp
index ad5003f6d1789946d592f90a16dbdf7cc3ecd7d6..cfa738405426279862749cc973272ea65764eabf 100644
--- a/src/conference/session/audio-stream.cpp
+++ b/src/conference/session/audio-stream.cpp
@@ -413,8 +413,9 @@ void MS2AudioStream::render(const OfferAnswerContext &params, CallSession::State
 
 	bool ok = true;
 	if (isMain()) {
+		OrtpPayloadType *pt = rtp_profile_get_payload(audioProfile, usedPt);
 		getMediaSessionPrivate().getCurrentParams()->getPrivate()->setUsedAudioCodec(
-		    rtp_profile_get_payload(audioProfile, usedPt));
+		    pt ? PayloadType::create(getCore().getSharedFromThis(), pt) : nullptr);
 	}
 
 	if (stream.getDirection() == SalStreamSendOnly) media_stream_set_direction(&mStream->ms, MediaStreamSendOnly);
diff --git a/src/conference/session/rtt-stream.cpp b/src/conference/session/rtt-stream.cpp
index e2733974e6c7bb0b35424685640312731f6862b3..5c9274284e53a09d8e076d555a04f98729f16664 100644
--- a/src/conference/session/rtt-stream.cpp
+++ b/src/conference/session/rtt-stream.cpp
@@ -94,8 +94,9 @@ void MS2RTTStream::render(const OfferAnswerContext &params, CallSession::State t
 		stop();
 		return;
 	}
+	OrtpPayloadType *pt = rtp_profile_get_payload(textProfile, usedPt);
 	getMediaSessionPrivate().getCurrentParams()->getPrivate()->setUsedRealtimeTextCodec(
-	    rtp_profile_get_payload(textProfile, usedPt));
+	    pt ? PayloadType::create(getCore().getSharedFromThis(), pt) : nullptr);
 	getMediaSessionPrivate().getCurrentParams()->enableRealtimeText(true);
 
 	unsigned int interval = getMediaSessionPrivate().getParams()->realtimeTextKeepaliveInterval();
diff --git a/src/conference/session/video-stream.cpp b/src/conference/session/video-stream.cpp
index 92b6635e514aaa467ab2875ca0674d5bf5bb71e4..27e9d78adeb68292872a51160b47e1a0ae2474ad 100644
--- a/src/conference/session/video-stream.cpp
+++ b/src/conference/session/video-stream.cpp
@@ -378,8 +378,9 @@ void MS2VideoStream::render(const OfferAnswerContext &ctx, CallSession::State ta
 	video_stream_set_display_callback(mStream, sVideoStreamDisplayCb, this);
 	video_stream_set_camera_not_working_callback(mStream, sCameraNotWorkingCb, this);
 	if (isMain()) {
+		OrtpPayloadType *pt = rtp_profile_get_payload(videoProfile, usedPt);
 		getMediaSessionPrivate().getCurrentParams()->getPrivate()->setUsedVideoCodec(
-		    rtp_profile_get_payload(videoProfile, usedPt));
+		    pt ? PayloadType::create(getCore().getSharedFromThis(), pt) : nullptr);
 	}
 
 	if (getCCore()->video_conf.preview_vsize.width != 0)