diff --git a/net/asterisk/patches/999-contact_fqdn.patch b/net/asterisk/patches/999-contact_fqdn.patch
new file mode 100644
index 0000000..26693c1
--- /dev/null
+++ b/net/asterisk/patches/999-contact_fqdn.patch
@@ -0,0 +1,73 @@
+--- a/include/asterisk/res_pjsip.h
++++ b/include/asterisk/res_pjsip.h
+@@ -238,6 +238,8 @@ struct ast_sip_transport {
+ AST_STRING_FIELD(external_media_address);
+ /*! Optional domain to use for messages if provided could not be found */
+ AST_STRING_FIELD(domain);
++ /*! Contact FQDN */
++ AST_STRING_FIELD(contact_fqdn);
+ );
+ /*! Type of transport */
+ enum ast_transport type;
+--- a/res/res_pjsip/config_transport.c
++++ b/res/res_pjsip/config_transport.c
+@@ -1830,6 +1830,7 @@ int ast_sip_initialize_sorcery_transport
+ ast_sorcery_object_field_register(sorcery, "transport", "external_signaling_port", "0", OPT_UINT_T, PARSE_IN_RANGE, FLDSET(struct ast_sip_transport, external_signaling_port), 0, 65535);
+ ast_sorcery_object_field_register(sorcery, "transport", "external_media_address", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, external_media_address));
+ ast_sorcery_object_field_register(sorcery, "transport", "domain", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, domain));
++ ast_sorcery_object_field_register(sorcery, "transport", "contact_fqdn", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_transport, contact_fqdn));
+ ast_sorcery_object_field_register_custom(sorcery, "transport", "verify_server", "", transport_tls_bool_handler, verify_server_to_str, NULL, 0, 0);
+ ast_sorcery_object_field_register_custom(sorcery, "transport", "verify_client", "", transport_tls_bool_handler, verify_client_to_str, NULL, 0, 0);
+ ast_sorcery_object_field_register_custom(sorcery, "transport", "require_client_cert", "", transport_tls_bool_handler, require_client_cert_to_str, NULL, 0, 0);
+--- a/res/res_pjsip/pjsip_config.xml
++++ b/res/res_pjsip/pjsip_config.xml
+@@ -1738,6 +1738,9 @@
+
+ Domain the transport comes from
+
++
++ FQDN to have in contact header
++
+
+ External IP address to use in RTP handling
+
+--- a/res/res_pjsip/pjsip_manager.xml
++++ b/res/res_pjsip/pjsip_manager.xml
+@@ -179,6 +179,9 @@
+
+
+
++
++
++
+
+
+
+--- a/res/res_pjsip_nat.c
++++ b/res/res_pjsip_nat.c
+@@ -365,7 +365,11 @@ static pj_status_t process_nat(pjsip_tx_
+ pjsip_method_cmp(&cseq->method, &pjsip_register_method)) {
+ /* We can only rewrite the URI when one is present */
+ if (uri || (uri = ast_sip_get_contact_sip_uri(tdata))) {
+- pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address));
++ if (!ast_strlen_zero(transport->contact_fqdn)) {
++ pj_strdup2(tdata->pool, &uri->host, transport->contact_fqdn);
++ } else {
++ pj_strdup2(tdata->pool, &uri->host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address));
++ }
+ if (transport->external_signaling_port) {
+ uri->port = transport->external_signaling_port;
+ ast_debug(4, "Re-wrote Contact URI port to %d\n", uri->port);
+@@ -375,7 +379,11 @@ static pj_status_t process_nat(pjsip_tx_
+
+ /* Update the via header if relevant */
+ if ((tdata->msg->type == PJSIP_REQUEST_MSG) && (via || (via = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL)))) {
+- pj_strdup2(tdata->pool, &via->sent_by.host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address));
++ if (!ast_strlen_zero(transport->contact_fqdn)) {
++ pj_strdup2(tdata->pool, &via->sent_by.host, transport->contact_fqdn);
++ } else {
++ pj_strdup2(tdata->pool, &via->sent_by.host, ast_sockaddr_stringify_host(&transport_state->external_signaling_address));
++ }
+ if (transport->external_signaling_port) {
+ via->sent_by.port = transport->external_signaling_port;
+ }