diff --git a/lib/ansible/modules/network/avi/avi_api_session.py b/lib/ansible/modules/network/avi/avi_api_session.py
index 447d2c8890..2216d2680c 100644
--- a/lib/ansible/modules/network/avi/avi_api_session.py
+++ b/lib/ansible/modules/network/avi/avi_api_session.py
@@ -72,6 +72,7 @@ EXAMPLES = '''
       path: pool
       params:
         name: "{{ pool_name }}"
+      api_version: 16.4
     register: pool_results
 
   - name: Patch Pool with list of servers
@@ -81,6 +82,7 @@ EXAMPLES = '''
       password: "{{ password }}"
       http_method: patch
       path: "{{ pool_path }}"
+      api_version: 16.4
       data:
         add:
           servers:
@@ -99,6 +101,7 @@ EXAMPLES = '''
       password: "{{ password }}"
       http_method: get
       path: analytics/metrics/pool
+      api_version: 16.4
       params:
         name: "{{ pool_name }}"
         metric_id: l4_server.avg_bandwidth,l4_server.avg_complete_conns
@@ -159,7 +162,8 @@ def main():
     path = module.params.get('path', '')
     params = module.params.get('params', None)
     data = module.params.get('data', None)
-
+    # Get the api_version from module.
+    api_version = module.params.get('api_version', '16.4')
     if data is not None:
         data = json.loads(data)
     method = module.params['http_method']
@@ -174,7 +178,7 @@ def main():
         # change the method to be put
         gparams['name'] = data['name']
         rsp = api.get(path, tenant=tenant, tenant_uuid=tenant_uuid,
-                      params=gparams)
+                      params=gparams, api_version=api_version)
         try:
             existing_obj = rsp.json()['results'][0]
         except IndexError:
@@ -193,7 +197,7 @@ def main():
                 gparams['name'] = data['name']
                 using_collection = True
             rsp = api.get(path, tenant=tenant, tenant_uuid=tenant_uuid,
-                          params=gparams)
+                          params=gparams, api_version=api_version)
             rsp_data = rsp.json()
             if using_collection:
                 if rsp_data['results']:
@@ -211,13 +215,13 @@ def main():
             cleanup_absent_fields(data)
     if method == 'patch':
         rsp = api.get(path, tenant=tenant, tenant_uuid=tenant_uuid,
-                      params=gparams)
+                      params=gparams, api_version=api_version)
         existing_obj = rsp.json()
 
     if (method == 'put' and changed) or (method != 'put'):
         fn = getattr(api, method)
         rsp = fn(path, tenant=tenant, tenant_uuid=tenant, timeout=timeout,
-                 params=params, data=data)
+                 params=params, data=data, api_version=api_version)
     else:
         rsp = None
     if method == 'delete' and rsp.status_code == 404:
@@ -233,7 +237,7 @@ def main():
         gparams = deepcopy(params) if params else {}
         gparams.update({'include_refs': '', 'include_name': ''})
         rsp = api.get(path, tenant=tenant, tenant_uuid=tenant_uuid,
-                      params=gparams)
+                      params=gparams, api_version=api_version)
         new_obj = rsp.json()
         changed = not avi_obj_cmp(new_obj, existing_obj)
     if rsp is None:
diff --git a/lib/ansible/modules/network/avi/avi_controllerproperties.py b/lib/ansible/modules/network/avi/avi_controllerproperties.py
index 34536e394e..af1dd6f07a 100644
--- a/lib/ansible/modules/network/avi/avi_controllerproperties.py
+++ b/lib/ansible/modules/network/avi/avi_controllerproperties.py
@@ -113,6 +113,11 @@ options:
             - Allowed values are 1-1051200.
             - Special values are 0 - 'disabled'.
             - Default value when not specified in API or module is interpreted by Avi Controller as 60.
+    portal_token:
+        description:
+            - Token used for uploading tech-support to portal.
+            - Field introduced in 17.1.2.
+        version_added: "2.4"
     query_host_fail:
         description:
             - Number of query_host_fail.
@@ -267,6 +272,7 @@ def main():
         max_pcap_per_tenant=dict(type='int',),
         max_seq_vnic_failures=dict(type='int',),
         persistence_key_rotate_period=dict(type='int',),
+        portal_token=dict(type='str', no_log=True,),
         query_host_fail=dict(type='int',),
         se_create_timeout=dict(type='int',),
         se_failover_attempt_interval=dict(type='int',),
@@ -302,7 +308,7 @@ def main():
             'Avi python API SDK (avisdk>=17.1) is not installed. '
             'For more details visit https://github.com/avinetworks/sdk.'))
     return avi_ansible_api(module, 'controllerproperties',
-                           set([]))
+                           set(['portal_token']))
 
 if __name__ == '__main__':
     main()
diff --git a/lib/ansible/modules/network/avi/avi_gslb.py b/lib/ansible/modules/network/avi/avi_gslb.py
index 757e88e1cd..fd04074692 100644
--- a/lib/ansible/modules/network/avi/avi_gslb.py
+++ b/lib/ansible/modules/network/avi/avi_gslb.py
@@ -50,6 +50,11 @@ options:
             - In fresh start all the configsare downloaded.
             - Allowed values are 1-1024.
             - Default value when not specified in API or module is interpreted by Avi Controller as 20.
+    client_ip_addr_group:
+        description:
+            - Group to specify if the client ip addresses are public or private.
+            - Field introduced in 17.1.2.
+        version_added: "2.4"
     description:
         description:
             - User defined description for the object.
@@ -125,6 +130,7 @@ def main():
         state=dict(default='present',
                    choices=['absent', 'present']),
         clear_on_max_retries=dict(type='int',),
+        client_ip_addr_group=dict(type='dict',),
         description=dict(type='str',),
         dns_configs=dict(type='list',),
         leader_cluster_uuid=dict(type='str',),
diff --git a/lib/ansible/modules/network/avi/avi_gslbservice.py b/lib/ansible/modules/network/avi/avi_gslbservice.py
index 667962d3c9..74dd8e6d3e 100644
--- a/lib/ansible/modules/network/avi/avi_gslbservice.py
+++ b/lib/ansible/modules/network/avi/avi_gslbservice.py
@@ -50,6 +50,11 @@ options:
             - Note that the datapath status is determined by the association of health monitor profiles.
             - Only the controller provided status is determined through this configuration.
             - Default value when not specified in API or module is interpreted by Avi Controller as True.
+    created_by:
+        description:
+            - Creator name.
+            - Field introduced in 17.1.2.
+        version_added: "2.4"
     description:
         description:
             - User defined description for the object.
@@ -150,6 +155,7 @@ def main():
         state=dict(default='present',
                    choices=['absent', 'present']),
         controller_health_status_enabled=dict(type='bool',),
+        created_by=dict(type='str',),
         description=dict(type='str',),
         domain_names=dict(type='list',),
         down_response=dict(type='dict',),
diff --git a/lib/ansible/modules/network/avi/avi_pool.py b/lib/ansible/modules/network/avi/avi_pool.py
index 2afa09b3ed..3ba46c8bac 100644
--- a/lib/ansible/modules/network/avi/avi_pool.py
+++ b/lib/ansible/modules/network/avi/avi_pool.py
@@ -121,6 +121,12 @@ options:
             - Enable or disable the pool.
             - Disabling will terminate all open connections and pause health monitors.
             - Default value when not specified in API or module is interpreted by Avi Controller as True.
+    external_autoscale_groups:
+        description:
+            - Names of external auto-scale groups for pool servers.
+            - Currently available only for aws.
+            - Field introduced in 17.1.2.
+        version_added: "2.4"
     fail_action:
         description:
             - Enable an action - close connection, http redirect, local http response, or backup pool - when a pool failure happens.
@@ -176,8 +182,8 @@ options:
     max_concurrent_connections_per_server:
         description:
             - The maximum number of concurrent connections allowed to each server within the pool.
-            - Allowed values are 50-10000.
-            - Special values are 0 - 'infinite'.
+            - Note  applied value will be no less than the number of service engines that the pool is placed on.
+            - If set to 0, no limit is applied.
             - Default value when not specified in API or module is interpreted by Avi Controller as 0.
     max_conn_rate_per_server:
         description:
@@ -195,7 +201,6 @@ options:
         description:
             - A list of nsx service groups where the servers for the pool are created.
             - Field introduced in 17.1.1.
-        version_added: "2.4"
     pki_profile_ref:
         description:
             - Avi will validate the ssl certificate present by a server against the selected pki profile.
@@ -341,6 +346,7 @@ def main():
         domain_name=dict(type='list',),
         east_west=dict(type='bool',),
         enabled=dict(type='bool',),
+        external_autoscale_groups=dict(type='list',),
         fail_action=dict(type='dict',),
         fewest_tasks_feedback_delay=dict(type='int',),
         graceful_disable_timeout=dict(type='int',),
diff --git a/lib/ansible/modules/network/avi/avi_serviceenginegroup.py b/lib/ansible/modules/network/avi/avi_serviceenginegroup.py
index c4c4942c46..4963dc79af 100644
--- a/lib/ansible/modules/network/avi/avi_serviceenginegroup.py
+++ b/lib/ansible/modules/network/avi/avi_serviceenginegroup.py
@@ -61,6 +61,17 @@ options:
             - In compact placement, virtual services are placed on existing ses until max_vs_per_se limit is reached.
             - Enum options - PLACEMENT_ALGO_PACKED, PLACEMENT_ALGO_DISTRIBUTED.
             - Default value when not specified in API or module is interpreted by Avi Controller as PLACEMENT_ALGO_PACKED.
+    async_ssl:
+        description:
+            - Ssl handshakes will be handled by dedicated ssl threads.
+            - Default value when not specified in API or module is interpreted by Avi Controller as False.
+        version_added: "2.4"
+    async_ssl_threads:
+        description:
+            - Number of async ssl threads per se_dp.
+            - Allowed values are 1-4.
+            - Default value when not specified in API or module is interpreted by Avi Controller as 1.
+        version_added: "2.4"
     auto_rebalance:
         description:
             - If set, virtual services will be automatically migrated when load on an se is less than minimum or more than maximum thresholds.
@@ -285,10 +296,22 @@ options:
     se_dos_profile:
         description:
             - Dosthresholdprofile settings for serviceenginegroup.
+    se_ipc_udp_port:
+        description:
+            - Udp port for se_dp ipc in docker bridge mode.
+            - Field introduced in 17.1.2.
+            - Default value when not specified in API or module is interpreted by Avi Controller as 1500.
+        version_added: "2.4"
     se_name_prefix:
         description:
             - Prefix to use for virtual machine name of service engines.
             - Default value when not specified in API or module is interpreted by Avi Controller as Avi.
+    se_remote_punt_udp_port:
+        description:
+            - Udp port for punted packets in docker bridge mode.
+            - Field introduced in 17.1.2.
+            - Default value when not specified in API or module is interpreted by Avi Controller as 1501.
+        version_added: "2.4"
     se_thread_multiplier:
         description:
             - Multiplier for se threads based on vcpu.
@@ -296,10 +319,21 @@ options:
             - Default value when not specified in API or module is interpreted by Avi Controller as 1.
     se_tunnel_mode:
         description:
-            - Determines if dsr from secondary se is active or not      0        automatically determine based on hypervisor type    1        disable dsr
-            - unconditionally    ~[0,1]   enable dsr unconditionally.
+            - Determines if dsr from secondary se is active or not.
+            - 0  automatically determine based on hypervisor type.
+            - 1  disable dsr unconditionally.
+            - ~[0,1]  enable dsr unconditionally.
             - Field introduced in 17.1.1.
             - Default value when not specified in API or module is interpreted by Avi Controller as 0.
+    se_udp_encap_ipc:
+        description:
+            - Determines if se-se ipc messages are encapsulated in an udp header.
+            - 0  automatically determine based on hypervisor type.
+            - 1  use udp encap unconditionally.
+            - ~[0,1]  don't use udp encap.
+            - Field introduced in 17.1.2.
+            - Default value when not specified in API or module is interpreted by Avi Controller as 0.
+        version_added: "2.4"
     se_vs_hb_max_pkts_in_batch:
         description:
             - Maximum number of aggregated vs heartbeat packets to send in a batch.
@@ -404,6 +438,8 @@ def main():
         advertise_backend_networks=dict(type='bool',),
         aggressive_failure_detection=dict(type='bool',),
         algo=dict(type='str',),
+        async_ssl=dict(type='bool',),
+        async_ssl_threads=dict(type='int',),
         auto_rebalance=dict(type='bool',),
         auto_rebalance_interval=dict(type='int',),
         auto_redistribute_active_standby_load=dict(type='bool',),
@@ -456,9 +492,12 @@ def main():
         realtime_se_metrics=dict(type='dict',),
         se_deprovision_delay=dict(type='int',),
         se_dos_profile=dict(type='dict',),
+        se_ipc_udp_port=dict(type='int',),
         se_name_prefix=dict(type='str',),
+        se_remote_punt_udp_port=dict(type='int',),
         se_thread_multiplier=dict(type='int',),
         se_tunnel_mode=dict(type='int',),
+        se_udp_encap_ipc=dict(type='int',),
         se_vs_hb_max_pkts_in_batch=dict(type='int',),
         se_vs_hb_max_vs_in_pkt=dict(type='int',),
         service_ip_subnets=dict(type='list',),