diff --git a/ansible/roles/octavia/handlers/main.yml b/ansible/roles/octavia/handlers/main.yml
index 139f63bad6b46768783e8793824bdc5759daf4bf..44372f35061690b8a90de7b5a462972b0e2548ae 100644
--- a/ansible/roles/octavia/handlers/main.yml
+++ b/ansible/roles/octavia/handlers/main.yml
@@ -5,6 +5,7 @@
     service: "{{ octavia_services[service_name] }}"
     config_json: "{{ octavia_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_conf: "{{ octavia_confs.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    policy_overwriting: "{{ octavia_policy_overwriting.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_api_container: "{{ check_octavia_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
   become: true
   kolla_docker:
@@ -20,6 +21,7 @@
     - service.enabled | bool
     - config_json.changed | bool
       or octavia_conf.changed | bool
+      or policy_overwriting.changed | bool
       or octavia_api_container.changed | bool
 
 - name: Restart octavia-health-manager container
@@ -28,6 +30,7 @@
     service: "{{ octavia_services[service_name] }}"
     config_json: "{{ octavia_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_conf: "{{ octavia_confs.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    policy_overwriting: "{{ octavia_policy_overwriting.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_health_manager_container: "{{ check_octavia_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
   become: true
   kolla_docker:
@@ -43,6 +46,7 @@
     - service.enabled | bool
     - config_json.changed | bool
       or octavia_conf.changed | bool
+      or policy_overwriting.changed | bool
       or octavia_health_manager_certificate.changed | bool
       or octavia_health_manager_container.changed | bool
 
@@ -52,6 +56,7 @@
     service: "{{ octavia_services[service_name] }}"
     config_json: "{{ octavia_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_conf: "{{ octavia_confs.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    policy_overwriting: "{{ octavia_policy_overwriting.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_housekeeping_container: "{{ check_octavia_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
   become: true
   kolla_docker:
@@ -67,6 +72,7 @@
     - service.enabled | bool
     - config_json.changed | bool
       or octavia_conf.changed | bool
+      or policy_overwriting.changed | bool
       or octavia_housekeeping_certificate.changed | bool
       or octavia_housekeeping_container.changed | bool
 
@@ -76,6 +82,7 @@
     service: "{{ octavia_services[service_name] }}"
     config_json: "{{ octavia_config_jsons.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_conf: "{{ octavia_confs.results|selectattr('item.key', 'equalto', service_name)|first }}"
+    policy_overwriting: "{{ octavia_policy_overwriting.results|selectattr('item.key', 'equalto', service_name)|first }}"
     octavia_worker_container: "{{ check_octavia_containers.results|selectattr('item.key', 'equalto', service_name)|first }}"
   become: true
   kolla_docker:
@@ -91,5 +98,6 @@
     - service.enabled | bool
     - config_json.changed | bool
       or octavia_conf.changed | bool
+      or policy_overwriting.changed | bool
       or octavia_worker_certificate.changed | bool
       or octavia_worker_container.changed | bool
diff --git a/ansible/roles/octavia/tasks/config.yml b/ansible/roles/octavia/tasks/config.yml
index 435bf46eb56047d4e42ad9348c5af77ec0dd3c69..e811c4aa0910e7f3a8660f7a84c11f25130f8acb 100644
--- a/ansible/roles/octavia/tasks/config.yml
+++ b/ansible/roles/octavia/tasks/config.yml
@@ -12,6 +12,38 @@
     - item.value.enabled | bool
   with_dict: "{{ octavia_services }}"
 
+- name: Check if policies shall be overwritten
+  local_action: stat path="{{ item }}"
+  run_once: True
+  register: octavia_policy
+  with_first_found:
+    - files: "{{ supported_policy_format_list }}"
+      paths:
+        - "{{ node_custom_config }}/octavia/"
+      skip: true
+
+- name: Set octavia policy file
+  set_fact:
+    octavia_policy_file: "{{ octavia_policy.results.0.stat.path | basename }}"
+    octavia_policy_file_path: "{{ octavia_policy.results.0.stat.path }}"
+  when:
+    - octavia_policy.results
+
+- name: Copying over existing policy file
+  template:
+    src: "{{ octavia_policy_file_path }}"
+    dest: "{{ node_config_directory }}/{{ item.key }}/{{ octavia_policy_file }}"
+    mode: "0660"
+  become: true
+  register: octavia_policy_overwriting
+  when:
+    - octavia_policy_file is defined
+    - inventory_hostname in groups[item.value.group]
+    - item.value.enabled | bool
+  with_dict: "{{ octavia_services }}"
+  notify:
+    - "Restart {{ item.key }} container"
+
 - name: Copying over config.json files for services
   template:
     src: "{{ item.key }}.json.j2"
diff --git a/ansible/roles/octavia/templates/octavia-api.json.j2 b/ansible/roles/octavia/templates/octavia-api.json.j2
index ede67a722bba346d7675367e9fe6e1c7b32fddde..0e315bebc88f352584a861a08c7e24c1b4c73cb7 100644
--- a/ansible/roles/octavia/templates/octavia-api.json.j2
+++ b/ansible/roles/octavia/templates/octavia-api.json.j2
@@ -6,6 +6,12 @@
             "dest": "/etc/octavia/octavia.conf",
             "owner": "octavia",
             "perm": "0600"
-        }
+        }{% if octavia_policy_file is defined %},
+        {
+            "source": "{{ container_config_directory }}/{{ octavia_policy_file }}",
+            "dest": "/etc/octavia/{{ octavia_policy_file }}",
+            "owner": "octavia",
+            "perm": "0600"
+        }{% endif %}
     ]
 }
diff --git a/ansible/roles/octavia/templates/octavia.conf.j2 b/ansible/roles/octavia/templates/octavia.conf.j2
index 468417a36a87f8f0dc6f94102129a712341ec79c..da03227ada1de91133f2fd40e900a1c820300e99 100644
--- a/ansible/roles/octavia/templates/octavia.conf.j2
+++ b/ansible/roles/octavia/templates/octavia.conf.j2
@@ -74,3 +74,8 @@ rpc_thread_pool_size = 2
 
 [oslo_messaging_notifications]
 transport_url = {{ notify_transport_url }}
+
+{% if octavia_policy_file is defined %}
+[oslo_policy]
+policy_file = {{ octavia_policy_file }}
+{% endif %}
diff --git a/releasenotes/notes/add-octavia-custom-policy-6a55d8cd951ce639.yaml b/releasenotes/notes/add-octavia-custom-policy-6a55d8cd951ce639.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..67c2aef405bd541c3281a2ad7915f736eaa963d1
--- /dev/null
+++ b/releasenotes/notes/add-octavia-custom-policy-6a55d8cd951ce639.yaml
@@ -0,0 +1,3 @@
+---
+features:
+  - Add support Octavia custom policy.