diff --git a/defaults/main.yml b/defaults/main.yml
index d9b7fce6e507df145901417e6184dd46c9e9d570..b4ef05db9c8da4533d79dc5186f1b929399396f3 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -4,7 +4,10 @@
 ## Odoo PostgreSQL version
 odoo_db_version: '13'
 ## Odoo version
-odoo_version: '14.0'
+odoo_version: '16.0'
+
+## Odoo websocket URI (websocket from 16.0 onwards, longpolling before)
+websocket_uri: 'websocket'
 
 ## Custom modules default URL for retrieving custom modules :
 custom_modules_base_url: "https://sources.le-filament.com/lefilament"
diff --git a/templates/prod.yaml.j2 b/templates/prod.yaml.j2
index fafe33f4a1e396770ddade4911ab858928b4adb4..dd2eeef6f167aded6b1c3d93006060ca5088c83a 100644
--- a/templates/prod.yaml.j2
+++ b/templates/prod.yaml.j2
@@ -46,9 +46,9 @@ services:
             co.elastic.logs/multiline.match: "after"
             traefik.enable: "true"
 {% if ansible_processor_vcpus > 2 or odoo_prod.force_odoo_workers is defined %}
-            traefik.http.routers.odoo-longpolling.rule: "Host(`{{ odoo_prod.url }}`{% if odoo_prod.url2 is defined %}, `{{ odoo_prod.url2 }}`{% endif %}) && PathPrefix(`/longpolling/`)"
-            traefik.http.routers.odoo-longpolling.service: "odoo-longpolling"
-            traefik.http.services.odoo-longpolling.loadbalancer.server.port: "8072"
+            traefik.http.routers.odoo-{{ websocket_uri }}.rule: "Host(`{{ odoo_prod.url }}`{% if odoo_prod.url2 is defined %}, `{{ odoo_prod.url2 }}`{% endif %}) && PathPrefix(`/{{ websocket_uri }}/`)"
+            traefik.http.routers.odoo-{{ websocket_uri }}.service: "odoo-{{ websocket_uri }}"
+            traefik.http.services.odoo-{{ websocket_uri }}.loadbalancer.server.port: "8072"
 {% endif %}
             traefik.http.routers.odoo-restrict.middlewares: "auth@file"
             traefik.http.routers.odoo-restrict.rule: "Host(`{{ odoo_prod.url }}`{% if odoo_prod.url2 is defined %}, `{{ odoo_prod.url2 }}`{% endif %}) && Path(`/website/info`, `/web/database/{p:manager|create|duplicate|drop|backup|restore|change_password}`)"
diff --git a/templates/test.yaml.j2 b/templates/test.yaml.j2
index 2be7180c4d2e2ff25f67df58650a803d6a557e9f..945f872003df1356225e053f7ee8dbbc57e08a3e 100644
--- a/templates/test.yaml.j2
+++ b/templates/test.yaml.j2
@@ -36,9 +36,9 @@ services:
             co.elastic.logs/enabled: "false"
             traefik.enable: "true"
 {% if ansible_processor_vcpus > 2 or item.force_odoo_workers is defined %}
-            traefik.http.routers.{{ item.dir }}-longpolling.rule: "Host(`{{ item.url }}`) && PathPrefix(`/longpolling/`)"
-            traefik.http.routers.{{ item.dir }}-longpolling.service: "{{ item.dir }}-longpolling"
-            traefik.http.services.{{ item.dir }}-longpolling.loadbalancer.server.port: "8072"
+            traefik.http.routers.{{ item.dir }}-{{ websocket_uri }}.rule: "Host(`{{ item.url }}`) && PathPrefix(`/{{ websocket_uri }}/`)"
+            traefik.http.routers.{{ item.dir }}-{{ websocket_uri }}.service: "{{ item.dir }}-{{ websocket_uri }}"
+            traefik.http.services.{{ item.dir }}-{{ websocket_uri }}.loadbalancer.server.port: "8072"
 {% endif %}
             traefik.http.routers.{{ item.dir }}-restrict.middlewares: "auth@file"
             traefik.http.routers.{{ item.dir }}-restrict.rule: "Host(`{{ item.url }}`) && Path(`/website/info`, `/web/database/{p:manager|create|duplicate|drop|backup|restore|change_password}`)"