diff --git a/UPGRADE-16.txt b/UPGRADE-16.txt
index 8b4fdf70ad993ae06816ca3e772d34495cae6f43..41e22c67d26d2ceefd74109654fbacccd744360c 100644
--- a/UPGRADE-16.txt
+++ b/UPGRADE-16.txt
@@ -39,6 +39,8 @@ AMI:
  - The ContactStatus and Status fields for the manager events ContactStatus
    and ContactStatusDetail are now set to "NonQualified" when a contact exists
    but has not been qualified.
+ - The ContactStatus event will no longer be sent by PJSIP when a device
+   refreshes its registration.
 
 ARI:
  - The ContactInfo event's contact_status field is now set to "NonQualified"
diff --git a/res/res_pjsip/pjsip_options.c b/res/res_pjsip/pjsip_options.c
index eb84c1b36bcaa6d84c6f1415e30b012b6f1f751f..f2439c4e807374ce2b2561fd9a2ab7eaa731eeb7 100644
--- a/res/res_pjsip/pjsip_options.c
+++ b/res/res_pjsip/pjsip_options.c
@@ -2065,7 +2065,7 @@ struct sip_options_contact_observer_task_data {
 /*!
  * \brief Check if the contact qualify options are different than local aor qualify options
  */
-static int has_qualify_changed (struct ast_sip_contact *contact, struct sip_options_aor *aor_options)
+static int has_qualify_changed (const struct ast_sip_contact *contact, const struct sip_options_aor *aor_options)
 {
 	if (!contact) {
 	    return 0;
@@ -2186,77 +2186,27 @@ static void contact_observer_created(const void *obj)
 		sip_options_contact_add_management_task, (void *) obj);
 }
 
-/*!
- * \brief Task which updates a dynamic contact to an AOR
- * \note Run by aor_options->serializer
- */
-static int sip_options_contact_update_task(void *obj)
-{
-	struct sip_options_contact_observer_task_data *task_data = obj;
-	struct ast_sip_contact_status *contact_status;
-
-	contact_status = ast_sip_get_contact_status(task_data->contact);
-	if (contact_status) {
-		switch (contact_status->status) {
-		case CREATED:
-		case UNAVAILABLE:
-		case AVAILABLE:
-		case UNKNOWN:
-			/* Refresh the ContactStatus AMI events. */
-			sip_options_contact_status_update(contact_status);
-			break;
-		case REMOVED:
-			break;
-		}
-		ao2_ref(contact_status, -1);
-	}
-
-	ao2_ref(task_data->contact, -1);
-	ao2_ref(task_data->aor_options, -1);
-	ast_free(task_data);
-	return 0;
-}
-
 /*! \brief Observer callback invoked on contact update */
 static void contact_observer_updated(const void *obj)
 {
-	struct sip_options_contact_observer_task_data *task_data;
-
-	task_data = ast_malloc(sizeof(*task_data));
-	if (!task_data) {
-		return;
-	}
+	const struct ast_sip_contact *contact = obj;
+	struct sip_options_aor *aor_options = ao2_find(sip_options_aors, contact->aor, OBJ_SEARCH_KEY);
 
-	task_data->contact = (struct ast_sip_contact *) obj;
-	task_data->aor_options = ao2_find(sip_options_aors, task_data->contact->aor,
-		OBJ_SEARCH_KEY);
-
-	if (has_qualify_changed(task_data->contact, task_data->aor_options)) {
+	if (has_qualify_changed(contact, aor_options)) {
 		struct ast_sip_aor *aor;
 
 		aor = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "aor",
-			task_data->contact->aor);
+			contact->aor);
 		if (aor) {
 			ast_debug(3, "AOR '%s' qualify options have been modified. Synchronize an AOR local state\n",
-				task_data->contact->aor);
+				contact->aor);
 			ast_sip_push_task_wait_serializer(management_serializer,
 				sip_options_aor_observer_modified_task, aor);
 			ao2_ref(aor, -1);
 		}
 	}
 
-	if (!task_data->aor_options) {
-		ast_free(task_data);
-		return;
-	}
-
-	ao2_ref(task_data->contact, +1);
-	if (ast_sip_push_task(task_data->aor_options->serializer,
-		sip_options_contact_update_task, task_data)) {
-		ao2_ref(task_data->contact, -1);
-		ao2_ref(task_data->aor_options, -1);
-		ast_free(task_data);
-	}
+	ao2_cleanup(aor_options);
 }
 
 /*!