diff --git a/coreapi/chat.c b/coreapi/chat.c
index da49ebfa0bec7ffa64deedc64c5b5618179ae6a9..823c2f1f58b7766c6a16200b4488adf23d9c1f0f 100644
--- a/coreapi/chat.c
+++ b/coreapi/chat.c
@@ -374,9 +374,9 @@ void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage
 		
 		if (imee) {
 			LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-			LinphoneImEncryptionEngineOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
+			LinphoneImEncryptionEngineCbsOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
 			if (cb_process_outgoing_message) {
-				retval = cb_process_outgoing_message(lc, cr, msg);
+				retval = cb_process_outgoing_message(imee, cr, msg);
 			}
 		}
 		
@@ -520,9 +520,9 @@ LinphoneReason linphone_core_message_received(LinphoneCore *lc, SalOp *op, const
 	
 	if (imee) {
 		LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-		LinphoneImEncryptionEngineIncomingMessageCb cb_process_incoming_message = linphone_im_encryption_engine_cbs_get_process_incoming_message(imee_cbs);
+		LinphoneImEncryptionEngineCbsIncomingMessageCb cb_process_incoming_message = linphone_im_encryption_engine_cbs_get_process_incoming_message(imee_cbs);
 		if (cb_process_incoming_message) {
-			retval = cb_process_incoming_message(lc, cr, msg);
+			retval = cb_process_incoming_message(imee, cr, msg);
 		}
 	}
 	
@@ -728,9 +728,9 @@ LinphoneReason linphone_core_is_composing_received(LinphoneCore *lc, SalOp *op,
 		msg->content_type = ms_strdup("application/im-iscomposing+xml");
 		if (imee) {
 			LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-			LinphoneImEncryptionEngineIncomingMessageCb cb_process_incoming_message = linphone_im_encryption_engine_cbs_get_process_incoming_message(imee_cbs);
+			LinphoneImEncryptionEngineCbsIncomingMessageCb cb_process_incoming_message = linphone_im_encryption_engine_cbs_get_process_incoming_message(imee_cbs);
 			if (cb_process_incoming_message) {
-				retval = cb_process_incoming_message(lc, cr, msg);
+				retval = cb_process_incoming_message(imee, cr, msg);
 			}
 		}
 		if (retval <= 0) {
@@ -894,9 +894,9 @@ static void linphone_chat_room_send_is_composing_notification(LinphoneChatRoom *
 		
 		if (imee) {
 			LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-			LinphoneImEncryptionEngineOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
+			LinphoneImEncryptionEngineCbsOutgoingMessageCb cb_process_outgoing_message = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imee_cbs);
 			if (cb_process_outgoing_message) {
-				retval = cb_process_outgoing_message(cr->lc, cr, msg);
+				retval = cb_process_outgoing_message(imee, cr, msg);
 			}
 		}
 
diff --git a/coreapi/chat_file_transfer.c b/coreapi/chat_file_transfer.c
index c73dc245048555030884a9eb0a087ae3e64b4ffa..7a72ffded7ca065e0097af4c324821a3624146e2 100644
--- a/coreapi/chat_file_transfer.c
+++ b/coreapi/chat_file_transfer.c
@@ -130,10 +130,10 @@ static int on_send_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t *
 	imee = linphone_core_get_im_encryption_engine(lc);
 	if (imee) {
 		LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-		LinphoneImEncryptionEngineUploadingFileCb cb_process_uploading_file = linphone_im_encryption_engine_cbs_get_process_uploading_file(imee_cbs);
+		LinphoneImEncryptionEngineCbsUploadingFileCb cb_process_uploading_file = linphone_im_encryption_engine_cbs_get_process_uploading_file(imee_cbs);
 		if (cb_process_uploading_file) {
 			char *encrypted_buffer = (char *)ms_malloc0(*size);
-			retval = cb_process_uploading_file(lc, msg, offset, (char *)buffer, size, encrypted_buffer);
+			retval = cb_process_uploading_file(imee, msg, offset, (char *)buffer, size, encrypted_buffer);
 			if (retval == 0) {
 				memcpy(buffer, encrypted_buffer, *size);
 			}
@@ -151,9 +151,9 @@ static void on_send_end(belle_sip_user_body_handler_t *bh, void *data) {
 	
 	if (imee) {
 		LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-		LinphoneImEncryptionEngineUploadingFileCb cb_process_uploading_file = linphone_im_encryption_engine_cbs_get_process_uploading_file(imee_cbs);
+		LinphoneImEncryptionEngineCbsUploadingFileCb cb_process_uploading_file = linphone_im_encryption_engine_cbs_get_process_uploading_file(imee_cbs);
 		if (cb_process_uploading_file) {
-			cb_process_uploading_file(lc, msg, 0, NULL, NULL, NULL);
+			cb_process_uploading_file(imee, msg, 0, NULL, NULL, NULL);
 		}
 	}
 }
@@ -181,19 +181,19 @@ static void linphone_chat_message_process_response_from_post_file(void *data,
 			LinphoneImEncryptionEngine *imee = linphone_core_get_im_encryption_engine(msg->chat_room->lc);
 			if (imee) {
 				LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-				LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb is_encryption_enabled_for_file_transfer_cb = 
+				LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb is_encryption_enabled_for_file_transfer_cb = 
 					linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(imee_cbs);
 				if (is_encryption_enabled_for_file_transfer_cb) {
-					is_file_encryption_enabled = is_encryption_enabled_for_file_transfer_cb(msg->chat_room->lc, msg->chat_room);
+					is_file_encryption_enabled = is_encryption_enabled_for_file_transfer_cb(imee, msg->chat_room);
 				}
 			}
 			/* shall we encrypt the file */
 			if (is_file_encryption_enabled) {
 				LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-				LinphoneImEncryptionEngineGenerateFileTransferKeyCb generate_file_transfer_key_cb = 
+				LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb generate_file_transfer_key_cb = 
 					linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(imee_cbs);
 				if (generate_file_transfer_key_cb) {
-					generate_file_transfer_key_cb(msg->chat_room->lc, msg->chat_room, msg);
+					generate_file_transfer_key_cb(imee, msg->chat_room, msg);
 				}
 				/* temporary storage for the Content-disposition header value : use a generic filename to not leak it
 				* Actual filename stored in msg->file_transfer_information->name will be set in encrypted msg
@@ -362,9 +362,9 @@ static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t
 	imee = linphone_core_get_im_encryption_engine(lc);
 	if (imee) {
 		LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-		LinphoneImEncryptionEngineDownloadingFileCb cb_process_downloading_file = linphone_im_encryption_engine_cbs_get_process_downloading_file(imee_cbs);
+		LinphoneImEncryptionEngineCbsDownloadingFileCb cb_process_downloading_file = linphone_im_encryption_engine_cbs_get_process_downloading_file(imee_cbs);
 		if (cb_process_downloading_file) {
-			retval = cb_process_downloading_file(lc, msg, (const char *)buffer, size, decrypted_buffer);
+			retval = cb_process_downloading_file(imee, msg, (const char *)buffer, size, decrypted_buffer);
 			if (retval == 0) {
 				memcpy(buffer, decrypted_buffer, size);
 			}
@@ -397,9 +397,9 @@ static void on_recv_end(belle_sip_user_body_handler_t *bh, void *data) {
 	
 	if (imee) {
 		LinphoneImEncryptionEngineCbs *imee_cbs = linphone_im_encryption_engine_get_callbacks(imee);
-		LinphoneImEncryptionEngineDownloadingFileCb cb_process_downloading_file = linphone_im_encryption_engine_cbs_get_process_downloading_file(imee_cbs);
+		LinphoneImEncryptionEngineCbsDownloadingFileCb cb_process_downloading_file = linphone_im_encryption_engine_cbs_get_process_downloading_file(imee_cbs);
 		if (cb_process_downloading_file) {
-			retval = cb_process_downloading_file(lc, msg, NULL, 0, NULL);
+			retval = cb_process_downloading_file(imee, msg, NULL, 0, NULL);
 		}
 	}
 	
diff --git a/coreapi/im_encryption_engine.c b/coreapi/im_encryption_engine.c
index 2e6eed779c5771cc5d288bca8d42b64c0728f255..b9699af4c894e3d78e1bad44bebc3f3f6ad6e9f5 100644
--- a/coreapi/im_encryption_engine.c
+++ b/coreapi/im_encryption_engine.c
@@ -19,29 +19,43 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 #include "linphone/core.h"
 #include "linphone/im_encryption_engine.h"
+#include "private.h"
 
-struct _LinphoneImEncryptionEngineCbs {
-	void *user_data;
-	LinphoneImEncryptionEngineIncomingMessageCb process_incoming_message;
-	LinphoneImEncryptionEngineOutgoingMessageCb process_outgoing_message;
-	LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb is_encryption_enabled_for_file_transfer;
-	LinphoneImEncryptionEngineGenerateFileTransferKeyCb generate_file_transfer_key;
-	LinphoneImEncryptionEngineDownloadingFileCb process_downlading_file;
-	LinphoneImEncryptionEngineUploadingFileCb process_uploading_file;
-};
-
-struct _LinphoneImEncryptionEngine {
-	void *user_data;
-	LinphoneImEncryptionEngineCbs *callbacks;
-};
+BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneImEncryptionEngineCbs);
+
+BELLE_SIP_INSTANCIATE_VPTR(LinphoneImEncryptionEngineCbs, belle_sip_object_t,
+	NULL, // destroy
+	NULL, // clone
+	NULL, // marshal
+	TRUE
+);
+
+static void linphone_im_encryption_engine_destroy(LinphoneImEncryptionEngine *imee) {
+	if (imee->callbacks) linphone_im_encryption_engine_cbs_unref(imee->callbacks);
+}
+
+BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneImEncryptionEngine);
+
+BELLE_SIP_INSTANCIATE_VPTR(LinphoneImEncryptionEngine, belle_sip_object_t,
+	(belle_sip_object_destroy_t)linphone_im_encryption_engine_destroy,
+	NULL, // clone
+	NULL, // marshal
+	TRUE
+);
 
 LinphoneImEncryptionEngineCbs *linphone_im_encryption_engine_cbs_new(void) {
-	LinphoneImEncryptionEngineCbs *cbs = ms_new0(LinphoneImEncryptionEngineCbs, 1);
+	LinphoneImEncryptionEngineCbs *cbs = belle_sip_object_new(LinphoneImEncryptionEngineCbs);
+	belle_sip_object_ref(cbs);
 	return cbs;
 }
 
-void linphone_im_encryption_engine_cbs_destory(LinphoneImEncryptionEngineCbs *cbs) {
-	ms_free(cbs);
+LinphoneImEncryptionEngineCbs * linphone_im_encryption_engine_cbs_ref(LinphoneImEncryptionEngineCbs *cbs) {
+	belle_sip_object_ref(cbs);
+	return cbs;
+}
+
+void linphone_im_encryption_engine_cbs_unref(LinphoneImEncryptionEngineCbs *cbs) {
+	belle_sip_object_unref(cbs);
 }
 
 void *linphone_im_encryption_engine_cbs_get_user_data(const LinphoneImEncryptionEngineCbs *cbs) {
@@ -52,15 +66,20 @@ void linphone_im_encryption_engine_cbs_set_user_data(LinphoneImEncryptionEngineC
 	cbs->user_data = data;
 }
 
-LinphoneImEncryptionEngine *linphone_im_encryption_engine_new(void) {
+LinphoneImEncryptionEngine *linphone_im_encryption_engine_new(LinphoneCore *lc) {
 	LinphoneImEncryptionEngine *imee = ms_new0(LinphoneImEncryptionEngine, 1);
+	imee->lc = lc;
 	imee->callbacks = linphone_im_encryption_engine_cbs_new();
 	return imee;
 }
 
-void linphone_im_encryption_engine_destory(LinphoneImEncryptionEngine *imee) {
-	if (imee->callbacks) linphone_im_encryption_engine_cbs_destory(imee->callbacks);
-	ms_free(imee);
+LinphoneImEncryptionEngine * linphone_im_encryption_engine_ref(LinphoneImEncryptionEngine *imee) {
+	belle_sip_object_ref(imee);
+	return imee;
+}
+
+void linphone_im_encryption_engine_unref(LinphoneImEncryptionEngine *imee) {
+	belle_sip_object_unref(imee);
 }
 
 void *linphone_im_encryption_engine_get_user_data(const LinphoneImEncryptionEngine *imee) {
@@ -75,50 +94,50 @@ LinphoneImEncryptionEngineCbs* linphone_im_encryption_engine_get_callbacks(const
 	return imee->callbacks;
 }
 
-LinphoneImEncryptionEngineIncomingMessageCb linphone_im_encryption_engine_cbs_get_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsIncomingMessageCb linphone_im_encryption_engine_cbs_get_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->process_incoming_message;
 }
 
-void linphone_im_encryption_engine_cbs_set_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineIncomingMessageCb cb) {
+void linphone_im_encryption_engine_cbs_set_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIncomingMessageCb cb) {
 	cbs->process_incoming_message = cb;
 }
 
-LinphoneImEncryptionEngineOutgoingMessageCb linphone_im_encryption_engine_cbs_get_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsOutgoingMessageCb linphone_im_encryption_engine_cbs_get_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->process_outgoing_message;
 }
 
-void linphone_im_encryption_engine_cbs_set_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineOutgoingMessageCb cb) {
+void linphone_im_encryption_engine_cbs_set_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsOutgoingMessageCb cb) {
 	cbs->process_outgoing_message = cb;
 }
 
-LinphoneImEncryptionEngineDownloadingFileCb linphone_im_encryption_engine_cbs_get_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsDownloadingFileCb linphone_im_encryption_engine_cbs_get_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->process_downlading_file;
 }
 
-void linphone_im_encryption_engine_cbs_set_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineDownloadingFileCb cb) {
+void linphone_im_encryption_engine_cbs_set_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsDownloadingFileCb cb) {
 	cbs->process_downlading_file = cb;
 }
 
-LinphoneImEncryptionEngineUploadingFileCb linphone_im_encryption_engine_cbs_get_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsUploadingFileCb linphone_im_encryption_engine_cbs_get_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->process_uploading_file;
 }
 
-void linphone_im_encryption_engine_cbs_set_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineUploadingFileCb cb) {
+void linphone_im_encryption_engine_cbs_set_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsUploadingFileCb cb) {
 	cbs->process_uploading_file = cb;
 }
 
-LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->is_encryption_enabled_for_file_transfer;
 }
 
-void linphone_im_encryption_engine_cbs_set_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb cb) {
+void linphone_im_encryption_engine_cbs_set_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb cb) {
 	cbs->is_encryption_enabled_for_file_transfer = cb;
 }
 
-LinphoneImEncryptionEngineGenerateFileTransferKeyCb linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs) {
+LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs) {
 	return cbs->generate_file_transfer_key;
 }
 
-void linphone_im_encryption_engine_cbs_set_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineGenerateFileTransferKeyCb cb) {
+void linphone_im_encryption_engine_cbs_set_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb cb) {
 		cbs->generate_file_transfer_key = cb;
 }
diff --git a/coreapi/lime.c b/coreapi/lime.c
index bcb79e8d32de136ce59ecd9289be57b83811f2e7..773dd46279cdf8cb1ae3d80f44c0e4ffad9bb44f 100644
--- a/coreapi/lime.c
+++ b/coreapi/lime.c
@@ -858,7 +858,8 @@ bool_t linphone_chat_room_lime_available(LinphoneChatRoom *cr) {
 	return FALSE;
 }
 
-int lime_im_encryption_engine_process_incoming_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+int lime_im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+	LinphoneCore *lc = linphone_im_encryption_engine_get_core(engine);
 	int errcode = -1;
 	/* check if we have a xml/cipher message to be decrypted */
 	if (msg->content_type && (strcmp("xml/cipher", msg->content_type) == 0 || strcmp("application/cipher.vnd.gsma.rcs-ft-http+xml", msg->content_type) == 0)) {
@@ -928,7 +929,8 @@ int lime_im_encryption_engine_process_incoming_message_cb(LinphoneCore* lc, Linp
 	return errcode;
 }
 
-int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+	LinphoneCore *lc = linphone_im_encryption_engine_get_core(engine);
 	int errcode = -1;
 	char *content_type = "xml/cipher";
 	
@@ -1001,7 +1003,7 @@ int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneCore* lc, Linp
 	return errcode;
 }
 
-int lime_im_encryption_engine_process_downloading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer) {
+int lime_im_encryption_engine_process_downloading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer) {
 	if (linphone_content_get_key(msg->file_transfer_information) == NULL) return -1;
 	
 	if (buffer == NULL || size == 0) {
@@ -1013,7 +1015,7 @@ int lime_im_encryption_engine_process_downloading_file_cb(LinphoneCore *lc, Linp
 						 (char *)buffer);
 }
 
-int lime_im_encryption_engine_process_uploading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer) {
+int lime_im_encryption_engine_process_uploading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer) {
 	if (linphone_content_get_key(msg->file_transfer_information) == NULL) return -1;
 	
 	if (buffer == NULL || *size == 0) {
@@ -1029,11 +1031,12 @@ int lime_im_encryption_engine_process_uploading_file_cb(LinphoneCore *lc, Linpho
 					(char *)buffer, encrypted_buffer);
 }
 
-bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneCore *lc, LinphoneChatRoom *room) {
+bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room) {
+	LinphoneCore *lc = linphone_im_encryption_engine_get_core(engine);
 	return linphone_chat_room_lime_available(room) && linphone_core_lime_for_file_sharing_enabled(lc);
 }
 
-void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
 	char keyBuffer [FILE_TRANSFER_KEY_SIZE]; /* temporary storage of generated key: 192 bits of key + 64 bits of initial vector */
 	/* generate a random 192 bits key + 64 bits of initial vector and store it into the
 		* file_transfer_information->key field of the msg */
@@ -1068,22 +1071,22 @@ int lime_decryptMessage(limeKey_t *key, uint8_t *encryptedMessage, uint32_t mess
 bool_t linphone_chat_room_lime_available(LinphoneChatRoom *cr) {
 	return FALSE;
 }
-int lime_im_encryption_engine_process_incoming_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+int lime_im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
 	return 500;
 }
-int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
 	return 500;
 }
-int lime_im_encryption_engine_process_downloading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer) {
+int lime_im_encryption_engine_process_downloading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer) {
 	return 500;
 }
-int lime_im_encryption_engine_process_uploading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer) {
+int lime_im_encryption_engine_process_uploading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer) {
 	return 500;
 }
-bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneCore *lc, LinphoneChatRoom *room) {
+bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room) {
 	return FALSE;
 }
-void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
+void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
 	
 }
 #endif /* HAVE_LIME */
diff --git a/coreapi/lime.h b/coreapi/lime.h
index 4487d38608c0e46a4a4f2e23c735cddfe3e44fbe..18fc98885e27effbdb6c8b4ecc8764022ab668a8 100644
--- a/coreapi/lime.h
+++ b/coreapi/lime.h
@@ -205,16 +205,16 @@ LINPHONE_PUBLIC char *lime_error_code_to_string(int errorCode);
  */
 LINPHONE_PUBLIC bool_t lime_is_available(void);
 
-int lime_im_encryption_engine_process_incoming_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+int lime_im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
-int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+int lime_im_encryption_engine_process_outgoing_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
-int lime_im_encryption_engine_process_downloading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer);
+int lime_im_encryption_engine_process_downloading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer);
 
-int lime_im_encryption_engine_process_uploading_file_cb(LinphoneCore *lc, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer);
+int lime_im_encryption_engine_process_uploading_file_cb(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer);
 
-bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneCore *lc, LinphoneChatRoom *room);
+bool_t lime_im_encryption_engine_is_file_encryption_enabled_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room);
 
-void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+void lime_im_encryption_engine_generate_file_transfer_key_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
 #endif /* LIME_H */
diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c
index 187ef7623aa86d615d80045b7b8d0a79d23be5e8..0e6940e331d6ff1e6a34742c31128b975096e970 100644
--- a/coreapi/linphonecore.c
+++ b/coreapi/linphonecore.c
@@ -1965,7 +1965,7 @@ void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val){
 	}
 	
 	if (val != LinphoneLimeDisabled) {
-		LinphoneImEncryptionEngine *imee = linphone_im_encryption_engine_new();
+		LinphoneImEncryptionEngine *imee = linphone_im_encryption_engine_new(lc);
 		LinphoneImEncryptionEngineCbs *cbs = linphone_im_encryption_engine_get_callbacks(imee);
 		linphone_im_encryption_engine_cbs_set_process_incoming_message(cbs, lime_im_encryption_engine_process_incoming_message_cb);
 		linphone_im_encryption_engine_cbs_set_process_outgoing_message(cbs, lime_im_encryption_engine_process_outgoing_message_cb);
@@ -1976,7 +1976,7 @@ void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val){
 		lc->im_encryption_engine = imee;
 	} else {
 		if (lc->im_encryption_engine) {
-			linphone_im_encryption_engine_destory(lc->im_encryption_engine);
+			linphone_im_encryption_engine_unref(lc->im_encryption_engine);
 			lc->im_encryption_engine = NULL;
 		}
 	}
diff --git a/coreapi/private.h b/coreapi/private.h
index 89867737791604e1b880e7ab4595e70f4e291fa0..94b07c3fb9eb18b9873feedde810146153c98d86 100644
--- a/coreapi/private.h
+++ b/coreapi/private.h
@@ -1491,6 +1491,32 @@ MsZrtpCryptoTypesCount linphone_core_get_zrtp_hash_suites(LinphoneCore *lc, MSZr
 MsZrtpCryptoTypesCount linphone_core_get_zrtp_auth_suites(LinphoneCore *lc, MSZrtpAuthTag authTags[MS_MAX_ZRTP_CRYPTO_TYPES]);
 MsZrtpCryptoTypesCount linphone_core_get_zrtp_sas_suites(LinphoneCore *lc, MSZrtpSasType sasTypes[MS_MAX_ZRTP_CRYPTO_TYPES]);
 
+struct _LinphoneImEncryptionEngineCbs {
+	belle_sip_object_t *base;
+	void *user_data;
+	LinphoneImEncryptionEngineCbsIncomingMessageCb process_incoming_message;
+	LinphoneImEncryptionEngineCbsOutgoingMessageCb process_outgoing_message;
+	LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb is_encryption_enabled_for_file_transfer;
+	LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb generate_file_transfer_key;
+	LinphoneImEncryptionEngineCbsDownloadingFileCb process_downlading_file;
+	LinphoneImEncryptionEngineCbsUploadingFileCb process_uploading_file;
+};
+
+BELLE_SIP_DECLARE_VPTR(LinphoneImEncryptionEngineCbs);
+
+LinphoneImEncryptionEngineCbs * linphone_im_encryption_engine_cbs_new(void);
+
+struct _LinphoneImEncryptionEngine {
+	belle_sip_object_t *base;
+	void *user_data;
+	LinphoneCore *lc;
+	LinphoneImEncryptionEngineCbs *callbacks;
+};
+
+BELLE_SIP_DECLARE_VPTR(LinphoneImEncryptionEngine);
+
+LinphoneImEncryptionEngine *linphone_im_encryption_engine_new(LinphoneCore *lc);
+
 /** Belle Sip-based objects need unique ids
   */
 
@@ -1507,6 +1533,8 @@ BELLE_SIP_TYPE_ID(LinphoneChatMessage),
 BELLE_SIP_TYPE_ID(LinphoneChatMessageCbs),
 BELLE_SIP_TYPE_ID(LinphoneChatRoom),
 BELLE_SIP_TYPE_ID(LinphoneContent),
+BELLE_SIP_TYPE_ID(LinphoneImEncryptionEngine),
+BELLE_SIP_TYPE_ID(LinphoneImEncryptionEngineCbs),
 BELLE_SIP_TYPE_ID(LinphoneLDAPContactProvider),
 BELLE_SIP_TYPE_ID(LinphoneLDAPContactSearch),
 BELLE_SIP_TYPE_ID(LinphoneProxyConfig),
diff --git a/include/linphone/im_encryption_engine.h b/include/linphone/im_encryption_engine.h
index 68a14b7bb8a76fee5754f499f5fafbe039008e1c..63796ebf0628bf46c59ba1cb68e382ee237a5013 100644
--- a/include/linphone/im_encryption_engine.h
+++ b/include/linphone/im_encryption_engine.h
@@ -26,217 +26,232 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 #define LINPHONE_PUBLIC MS2_PUBLIC
 #endif
 
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * IM encryption engine.
+ */
+typedef struct _LinphoneImEncryptionEngine LinphoneImEncryptionEngine;
+
 /**
  * Callback to decrypt incoming LinphoneChatMessage
- * @param lc the LinphoneCore object
- * @param room the LinphoneChatRoom object
- * @param msg the LinphoneChatMessage object
+ * @param engine ImEncryptionEngine object
+ * @param room LinphoneChatRoom object
+ * @param msg LinphoneChatMessage object
  * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
 */
-typedef int (*LinphoneImEncryptionEngineIncomingMessageCb)(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+typedef int (*LinphoneImEncryptionEngineCbsIncomingMessageCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
 /**
- * Callback to encrypt outging LinphoneChatMessage
- * @param lc the LinphoneCore object
- * @param room the LinphoneChatRoom object
- * @param msg the LinphoneChatMessage object
+ * Callback to encrypt outgoing LinphoneChatMessage
+ * @param engine LinphoneImEncryptionEngine object
+ * @param room LinphoneChatRoom object
+ * @param msg LinphoneChatMessage object
  * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
 */
-typedef int (*LinphoneImEncryptionEngineOutgoingMessageCb)(LinphoneCore* lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+typedef int (*LinphoneImEncryptionEngineCbsOutgoingMessageCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
 /**
  * Callback to know whether or not the engine will encrypt files before uploading them
- * @param lc the LinphoneCore object
- * @param room the LinphoneChatRoom object
+ * @param engine LinphoneImEncryptionEngine object
+ * @param room LinphoneChatRoom object
  * @return TRUE if files will be encrypted, FALSE otherwise
 */
-typedef bool_t (*LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb)(LinphoneCore *lc, LinphoneChatRoom *room);
+typedef bool_t (*LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room);
 
 /**
  * Callback to generate the key used to encrypt the files before uploading them
  * Key can be stored in the LinphoneContent object inside the LinphoneChatMessage using linphone_content_set_key
- * @param lc the LinphoneCore object
- * @param room the LinphoneChatRoom object
- * @param msg the LinphoneChatMessage object
+ * @param engine LinphoneImEncryptionEngine object
+ * @param room LinphoneChatRoom object
+ * @param msg LinphoneChatMessage object
 */
-typedef void (*LinphoneImEncryptionEngineGenerateFileTransferKeyCb)(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+typedef void (*LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
 
 /**
  * Callback to decrypt downloading file
- * @param lc the LinphoneCore object
- * @param msg the LinphoneChatMessage object
- * @param buffer the encrypted data buffer
- * @param size the size of the encrypted data buffer
- * @param decrypted_buffer the buffer in which to write the decrypted data
+ * @param engine LinphoneImEncryptionEngine object
+ * @param msg LinphoneChatMessage object
+ * @param buffer Encrypted data buffer
+ * @param size Size of the encrypted data buffer
+ * @param decrypted_buffer Buffer in which to write the decrypted data
  * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
 */
-typedef int (*LinphoneImEncryptionEngineDownloadingFileCb)(LinphoneCore *lc, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer);
+typedef int (*LinphoneImEncryptionEngineCbsDownloadingFileCb)(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, const char *buffer, size_t size, char *decrypted_buffer);
 
 /**
  * Callback to encrypt uploading file
- * @param lc the LinphoneCore object
- * @param msg the LinphoneChatMessage object
- * @param buffer the encrypted data buffer
- * @param size the size of the plain data buffer and the size of the encrypted data buffer once encryption is done
- * @param encrypted_buffer the buffer in which to write the encrypted data
+ * @param engine LinphoneImEncryptionEngine object
+ * @param msg LinphoneChatMessage object
+ * @param buffer Encrypted data buffer
+ * @param size Size of the plain data buffer and the size of the encrypted data buffer once encryption is done
+ * @param encrypted_buffer Buffer in which to write the encrypted data
  * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
 */
-typedef int (*LinphoneImEncryptionEngineUploadingFileCb)(LinphoneCore *lc, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer);
+typedef int (*LinphoneImEncryptionEngineCbsUploadingFileCb)(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const char *buffer, size_t *size, char *encrypted_buffer);
 
+/**
+ * An object to handle the callbacks for the handling a LinphoneImEncryptionEngine object.
+ */
 typedef struct _LinphoneImEncryptionEngineCbs LinphoneImEncryptionEngineCbs;
 
-typedef struct _LinphoneImEncryptionEngine LinphoneImEncryptionEngine;
-
-LinphoneImEncryptionEngineCbs *linphone_im_encryption_engine_cbs_new(void);
+/**
+ * Acquire a reference to the LinphoneImEncryptionEngineCbs.
+ * @param[in] cbs LinphoneImEncryptionEngineCbs object.
+ * @return The same LinphoneImEncryptionEngineCbs object.
+**/
+LinphoneImEncryptionEngineCbs * linphone_im_encryption_engine_cbs_ref(LinphoneImEncryptionEngineCbs *cbs);
 
-void linphone_im_encryption_engine_cbs_destory(LinphoneImEncryptionEngineCbs *cbs);
+/**
+ * Release reference to the LinphoneImEncryptionEngineCbs.
+ * @param[in] cbs LinphoneImEncryptionEngineCbs object.
+**/
+void linphone_im_encryption_engine_cbs_unref(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Gets the user data in the LinphoneImEncryptionEngineCbs object
- * @param cbs the LinphoneImEncryptionEngineCbs
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs
  * @return the user data
- * @ingroup misc
 */
 LINPHONE_PUBLIC void *linphone_im_encryption_engine_cbs_get_user_data(const LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the user data in the LinphoneImEncryptionEngineCbs object
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param data the user data
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] data the user data
 */
 LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_user_data(LinphoneImEncryptionEngineCbs *cbs, void *data);
 
 /**
- * Creates a LinphoneImEncryptionEngine object
-*/
-LINPHONE_PUBLIC LinphoneImEncryptionEngine *linphone_im_encryption_engine_new(void);
+ * Acquire a reference to the LinphoneImEncryptionEngine.
+ * @param[in] imee LinphoneImEncryptionEngine object.
+ * @return The same LinphoneImEncryptionEngine object.
+**/
+LINPHONE_PUBLIC LinphoneImEncryptionEngine * linphone_im_encryption_engine_ref(LinphoneImEncryptionEngine *imee);
 
 /**
- * Destroys the LinphoneImEncryptionEngine
- * @param imee the LinphoneImEncryptionEngine object
- * @ingroup misc
-*/
-LINPHONE_PUBLIC void linphone_im_encryption_engine_destory(LinphoneImEncryptionEngine *imee);
+ * Release reference to the LinphoneImEncryptionEngine.
+ * @param[in] cbs LinphoneImEncryptionEngine object.
+**/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_unref(LinphoneImEncryptionEngine *imee);
 
 /**
  * Gets the user data in the LinphoneImEncryptionEngine object
- * @param imee the LinphoneImEncryptionEngine
+ * @param[in] imee the LinphoneImEncryptionEngine
  * @return the user data
- * @ingroup misc
 */
 LINPHONE_PUBLIC void *linphone_im_encryption_engine_get_user_data(const LinphoneImEncryptionEngine *imee);
 
 /**
  * Sets the user data in the LinphoneImEncryptionEngine object
- * @param imee the LinphoneImEncryptionEngine object
- * @param data the user data
- * @ingroup misc
+ * @param[in] imee the LinphoneImEncryptionEngine object
+ * @param[in] data the user data
 */
 LINPHONE_PUBLIC void linphone_im_encryption_engine_set_user_data(LinphoneImEncryptionEngine *imee, void *data);
 
+/**
+ * Gets the LinphoneCore object that created the IM encryption engine
+ * @param[in] imee LinphoneImEncryptionEngine object
+ * @return The LinphoneCore object that created the IM encryption engine
+ */
+LINPHONE_PUBLIC LinphoneCore * linphone_im_encryption_engine_get_core(LinphoneImEncryptionEngine *imee);
+
 /**
  * Gets the LinphoneImEncryptionEngineCbs object that holds the callbacks
- * @param imee the LinphoneImEncryptionEngine object
+ * @param[in] imee the LinphoneImEncryptionEngine object
  * @return the LinphoneImEncryptionEngineCbs object
- * @ingroup misc
 */
 LINPHONE_PUBLIC LinphoneImEncryptionEngineCbs* linphone_im_encryption_engine_get_callbacks(const LinphoneImEncryptionEngine *imee);
 
 /**
  * Gets the callback that will decrypt the chat messages upon reception
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineIncomingMessageCb linphone_im_encryption_engine_cbs_get_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsIncomingMessageCb linphone_im_encryption_engine_cbs_get_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback that will decrypt the chat messages upon reception
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineIncomingMessageCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIncomingMessageCb cb);
 
 /**
  * Gets the callback that will encrypt the chat messages before sending them
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineOutgoingMessageCb linphone_im_encryption_engine_cbs_get_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsOutgoingMessageCb linphone_im_encryption_engine_cbs_get_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback that will encrypt the chat messages before sending them
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineOutgoingMessageCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsOutgoingMessageCb cb);
 
 /**
  * Gets the callback that will decrypt the files while downloading them
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineDownloadingFileCb linphone_im_encryption_engine_cbs_get_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsDownloadingFileCb linphone_im_encryption_engine_cbs_get_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback that will decrypt the files while downloading them
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineDownloadingFileCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsDownloadingFileCb cb);
 
 /**
  * Gets the callback that will will encrypt the files while uploading them
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineUploadingFileCb linphone_im_encryption_engine_cbs_get_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsUploadingFileCb linphone_im_encryption_engine_cbs_get_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback that will encrypt the files while uploading them
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineUploadingFileCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsUploadingFileCb cb);
 
 /**
  * Gets the callback telling wheter or not to encrypt the files
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback telling wheter or not to encrypt the files
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineIsEncryptionEnabledForFileTransferCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb cb);
 
 /**
  * Gets the callback that will generate the key to encrypt the file before uploading it
- * @param cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
  * @return the callback
- * @ingroup misc
 */
-LINPHONE_PUBLIC LinphoneImEncryptionEngineGenerateFileTransferKeyCb linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs);
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs);
 
 /**
  * Sets the callback that will generate the key to encrypt the file before uploading it
- * @param cbs the LinphoneImEncryptionEngineCbs object
- * @param cb the callback to call
- * @ingroup misc
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
 */
-LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineGenerateFileTransferKeyCb cb);
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb cb);
+
+/**
+ * @}
+ */
 
-#endif /* IM_ENCRYPTION_ENGINE_H */
\ No newline at end of file
+#endif /* IM_ENCRYPTION_ENGINE_H */
diff --git a/tools/python/apixml2python/linphone.py b/tools/python/apixml2python/linphone.py
index 483cd93ede44b646f37617161e26e93becebc2bc..f6d942cf9527404752968d6c734a85e1f1a6d2a5 100644
--- a/tools/python/apixml2python/linphone.py
+++ b/tools/python/apixml2python/linphone.py
@@ -105,6 +105,7 @@ class ArgumentType:
 		self.cnativefmt_str = '%p'
 		self.use_native_pointer = False
 		self.cast_convert_func_result = True
+		self.is_linphone_object = False
 		self.__compute()
 		if (self.basic_type == 'MSList' or self.basic_type == 'bctbx_list_t') and self.contained_type is not None and self.contained_type != 'const char *':
 			self.linphone_module.bctbxlist_types.add(self.contained_type)
@@ -263,8 +264,10 @@ class ArgumentType:
 			elif '*' in splitted_type:
 				self.type_str = 'linphone.' + strip_leading_linphone(self.basic_type)
 				self.use_native_pointer = True
+				self.is_linphone_object = True
 			else:
 				self.type_str = 'linphone.' + strip_leading_linphone(self.basic_type)
+				self.is_linphone_object = True
 
 
 class MethodDefinition:
@@ -878,7 +881,11 @@ class EventCallbackMethodDefinition(MethodDefinition):
 
 	def format_arguments_parsing(self):
 		return_str = ''
-		if self.return_complete_type != 'void':
+		if self.return_complete_type == 'int':
+			return_str = '-1'
+		elif self.return_complete_type == 'bool_t':
+			return_str = 'FALSE'
+		elif self.return_complete_type != 'void':
 			argument_type = ArgumentType(self.return_type, self.return_complete_type, self.return_contained_type, self.linphone_module)
 			if argument_type.fmt_str == 'O':
 				return_str = 'NULL'
@@ -938,7 +945,7 @@ class EventCallbackMethodDefinition(MethodDefinition):
 		args=', '.join(args)
 		if self.return_complete_type != 'void':
 			argument_type = ArgumentType(self.return_type, self.return_complete_type, self.return_contained_type, self.linphone_module)
-			if argument_type.fmt_str == 'O':
+			if argument_type.is_linphone_object:
 				convert_python_result_code = \
 """		if ((pyresult != Py_None) && !PyObject_IsInstance(pyresult, (PyObject *)&pylinphone_{class_name}Type)) {{
 			PyErr_SetString(PyExc_TypeError, "The return value must be a linphone.{class_name} instance.");