diff --git a/tasks/main.yml b/tasks/main.yml
index c8a003a27e1f8b9873ef12535be597dd2b2cda2a..8f3869b9cea2aba3fda8335b63d023538806ddba 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -54,45 +54,6 @@
     test_instance_need_build
     and test_instance_is_selected
 
-- name: "Copy odoo.conf file"
-  vars:
-    template_admin_passwd: "{{ odoo_source_instance.value.master_pass | pbkdf2_passwd(65534 | random(seed=inventory_hostname) | string) }}"
-    template_server_wide_modules: "{{ odoo_instance_setup.server_wide_modules | join(',') }}{% if odoo_instance.value.odoo_server_wide_modules is defined %},{{ odoo_instance.value.odoo_server_wide_modules | join(',') }}{% endif %}"
-    template_dbfilter: "^({{ odoo_source_instance.value.db }}|{{ odoo_instance.value.db }})$"
-    template_db_name: "{{ odoo_source_instance.value.db }}"
-    template_db_password: "{{ odoo_source_instance.value.db_pass }}"
-    template_db_user: "{{ odoo_source_instance.value.db_user }}"
-    template_db_maxconn: "{{ odoo_instance.value.odoo_db_maxconn }}"
-    template_limit_time_cpu: "{{ odoo_instance.value.odoo_limit_time_cpu }}"
-    template_limit_time_real: "{{ odoo_instance.value.odoo_limit_time_real }}"
-    template_force_workers: "{{odoo_instance.value.force_odoo_workers}}"
-    template_modules_auto_install_disabled: "{{ (odoo_instance_setup.modules_auto_install_disabled | default(['mail_bot'])) | join(',') }}{% if odoo_instance.value.modules_auto_install_disabled is defined %},{{ odoo_instance.value.modules_auto_install_disabled | join(',') }}{% endif %}"
-    template_modules_auto_install_enabled: "{{ (odoo_instance_setup.modules_auto_install_enabled | default(['web'])) | join(',') }}{% if odoo_instance.value.modules_auto_install_enabled is defined %},{{ odoo_instance.value.modules_auto_install_enabled | join(',') }}{% endif %}"
-    template_extra_conf: "{{ odoo_instance.value.odoo_extra_conf }}"
-  ansible.builtin.template:
-      src: "odoo.conf.j2"
-      dest: "/home/docker/{{ odoo_instance.key }}/odoo/odoo.conf"
-      owner: "root"
-      group: "root"
-      mode: "0600"
-  loop: "{{ odoo_instances | dict2items }}"
-  loop_control:
-    label: "{{ odoo_instance.key }}"
-  when: >
-    test_instance_need_build
-    and test_instance_is_selected
-  register: result
-
-# notify:
-#   - "rebuild odoo image"
-- name: "Add instance to restart list if files was changed"
-  set_fact:
-     instances_to_rebuild: "{{ instances_to_rebuild + [item.item.key] }}"
-  loop: "{{ result.results | flatten(levels=1) }}"
-  loop_control:
-    label: "{{ item.item.key }}"
-  when: test_result_item_has_changed
-
 - name: Copy private GitLab ssh keys file
   ansible.builtin.copy:
       content: "{{ git_modules_privkey | default('') }}"
@@ -173,7 +134,52 @@
     label: "{{ item.item.key }}"
   when: test_result_item_has_changed
 
+- name: "Copy odoo.conf file"
+  tags:
+    - "odoo_config"
+    - "odoo_config_odoo"
+  vars:
+    template_admin_passwd: "{{ odoo_source_instance.value.master_pass | pbkdf2_passwd(65534 | random(seed=inventory_hostname) | string) }}"
+    template_server_wide_modules: "{{ odoo_instance_setup.server_wide_modules | join(',') }}{% if odoo_instance.value.odoo_server_wide_modules is defined %},{{ odoo_instance.value.odoo_server_wide_modules | join(',') }}{% endif %}"
+    template_dbfilter: "^({{ odoo_source_instance.value.db }}|{{ odoo_instance.value.db }})$"
+    template_db_name: "{{ odoo_source_instance.value.db }}"
+    template_db_password: "{{ odoo_source_instance.value.db_pass }}"
+    template_db_user: "{{ odoo_source_instance.value.db_user }}"
+    template_db_maxconn: "{{ odoo_instance.value.odoo_db_maxconn }}"
+    template_limit_time_cpu: "{{ odoo_instance.value.odoo_limit_time_cpu }}"
+    template_limit_time_real: "{{ odoo_instance.value.odoo_limit_time_real }}"
+    template_force_workers: "{{odoo_instance.value.force_odoo_workers}}"
+    template_modules_auto_install_disabled: "{{ (odoo_instance_setup.modules_auto_install_disabled | default(['mail_bot'])) | join(',') }}{% if odoo_instance.value.modules_auto_install_disabled is defined %},{{ odoo_instance.value.modules_auto_install_disabled | join(',') }}{% endif %}"
+    template_modules_auto_install_enabled: "{{ (odoo_instance_setup.modules_auto_install_enabled | default(['web'])) | join(',') }}{% if odoo_instance.value.modules_auto_install_enabled is defined %},{{ odoo_instance.value.modules_auto_install_enabled | join(',') }}{% endif %}"
+    template_extra_conf: "{{ odoo_instance.value.odoo_extra_conf }}"
+  ansible.builtin.template:
+      src: "odoo.conf.j2"
+      dest: "/home/docker/{{ odoo_instance.key }}/odoo/odoo.conf"
+      owner: "root"
+      group: "root"
+      mode: "0600"
+  loop: "{{ odoo_instances | dict2items }}"
+  loop_control:
+    label: "{{ odoo_instance.key }}"
+  when: >
+    test_instance_need_build
+    and test_instance_is_selected
+  register: result
+
+# notify:
+#   - "rebuild odoo image"
+- name: "Add instance to restart list if files was changed"
+  set_fact:
+     instances_to_rebuild: "{{ instances_to_rebuild + [item.item.key] }}"
+  loop: "{{ result.results | flatten(levels=1) }}"
+  loop_control:
+    label: "{{ item.item.key }}"
+  when: test_result_item_has_changed
+
 - name: Copy Dockerfile to retrieve private repos and extra OCA ones
+  tags:
+    - "odoo_config"
+    - "odoo_config_dockerfile"
   vars:
     template_odoo_instance: "{{ odoo_instance }}"
     template_odoo_instance_setup: "{{ odoo_instance_setup }}"
@@ -205,6 +211,8 @@
 
 - name: Copy docker compose service
   tags:
+    - "odoo_config"
+    - "odoo_config_compose"
     - "docker_proxy"
     - "metabase"
   vars:
@@ -293,7 +301,6 @@
   tags:
     - "docker_proxy"
     - "metabase"
-    - "odoo"
   ansible.builtin.meta: flush_handlers
 
 - name: "Restart instances: remove instance containers"
diff --git a/templates/docker-compose.yaml.j2 b/templates/docker-compose.yaml.j2
index 1f42b28bc06bb9fcd33dae26d692c17cd14bf936..47b637f66cb15f0ad8b57a508decb0682396c4aa 100644
--- a/templates/docker-compose.yaml.j2
+++ b/templates/docker-compose.yaml.j2
@@ -21,16 +21,16 @@ services:
         volumes:
             - filestore:/opt/odoo/data:z
 {# if prod and banking #}
-{% if template_instance_is_prod and banking | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod and banking | default(false) %}
             - ./bank/:/ofx/:ro
 {% endif %}
-{% if private_pull is defined %}
+{% if not (template_updater_mode | default(false)) and private_pull is defined %}
             - ../import/:/import/:ro
 {% endif %}
         networks:
             default:
             inverseproxy_shared:
-{% if restrict_internet_access %}
+{% if not (template_updater_mode | default(false)) and restrict_internet_access %}
 {% if whitelisted_urls is defined %}
             whitelists_proxy:
 {% endif %}
@@ -39,13 +39,13 @@ services:
 {% endif %}
 {% endif %}
 {# if prod and mailname #}
-{% if template_instance_is_prod and mailname | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod and mailname | default(false) %}
             email_proxy:
 {% endif %}
         restart: unless-stopped
         labels:
 {# if prod #}
-{% if template_instance_is_prod %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod %}
             co.elastic.logs/multiline.pattern: '^[0-9]{2}'
             co.elastic.logs/multiline.negate: 'true'
             co.elastic.logs/multiline.match: "after"
@@ -96,12 +96,12 @@ services:
 {% endif %}
         labels:
 {# if prod #}
-{% if template_instance_is_prod %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod %}
             co.elastic.logs/module: postgresql
 {% else %}
             co.elastic.logs/enabled: "false"
 {% endif %}
-{% if template_odoo_instance.value.odoo_remote_db_access | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.odoo_remote_db_access | default(false) %}
         networks:
             default:
             public:
@@ -114,7 +114,7 @@ services:
 
     smtp:
 {# if prod and mailname #}
-{% if template_instance_is_prod and mailname | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod and mailname | default(false) %}
         image: tecnativa/postfix-relay
         container_name: {{ template_odoo_instance.key }}_smtp
         networks:
@@ -175,19 +175,20 @@ services:
             co.elastic.logs/enabled: "false"
 {# if not prod #}
 {% if template_instance_is_prod is false %}
-            traefik.docker.network: "inverseproxy_smtp"
             traefik.enable: "true"
-            traefik.http.routers.{{ template_odoo_instance.key }}smtp.middlewares: "auth@file, smtp-stripprefix@file"
+            traefik.docker.network: "inverseproxy_smtp"
+            traefik.http.services.{{ template_odoo_instance.key }}smtp.loadbalancer.server.port: "8025"
+            traefik.http.routers.{{ template_odoo_instance.key }}smtp.entrypoints: "{{ template_traefik_entrypoints | default(default_traefik_entrypoints) }}"
             traefik.http.routers.{{ template_odoo_instance.key }}smtp.rule: "(Host(`{{ template_odoo_instance_domains | join('`) || Host(`') }}`)) && PathPrefix(`/smtp/`)"
+            traefik.http.routers.{{ template_odoo_instance.key }}smtp.middlewares: "auth@file, smtp-stripprefix@file"
             traefik.http.routers.{{ template_odoo_instance.key }}smtp.service: "{{ template_odoo_instance.key }}smtp"
-            traefik.http.services.{{ template_odoo_instance.key }}smtp.loadbalancer.server.port: "8025"
         networks:
             default:
             inverseproxy_smtp:
 {% endif %}
 
 {% endif %}
-{% if restrict_internet_access and template_odoo_instance.value.extra_urls is defined %}
+{% if not (template_updater_mode | default(false)) and restrict_internet_access and template_odoo_instance.value.extra_urls is defined %}
 {% for server in template_odoo_instance.value.extra_urls %}
     {{ server.url }}:
         image: tecnativa/whitelist
@@ -207,7 +208,7 @@ services:
 
 {% endfor %}
 {% endif %}
-{% if template_odoo_instance.value.metabase | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.metabase | default(false) %}
     metabase:
         image: metabase/metabase
         container_name: {{ template_odoo_instance.key }}_metabase
@@ -218,19 +219,20 @@ services:
             inverseproxy_bi:
         labels:
             co.elastic.logs/enabled: "false"
-            traefik.docker.network: "inverseproxy_bi"
             traefik.enable: "true"
+            traefik.docker.network: "inverseproxy_bi"
+            traefik.http.services.metabase.loadbalancer.server.port: "3000"
             traefik.http.middlewares.metabase-stripprefix.stripprefix.prefixes: "/metabase"
-            traefik.http.routers.metabase.middlewares: "metabase-stripprefix"
+            traefik.http.routers.metabase.entrypoints: "{{ template_traefik_entrypoints | default(default_traefik_entrypoints) }}"
             traefik.http.routers.metabase.rule: "(Host(`{{ template_odoo_instance_domains | join('`) || Host(`') }}`)) && PathPrefix(`/metabase`)"
+            traefik.http.routers.metabase.middlewares: "metabase-stripprefix"
             traefik.http.routers.metabase.service: "metabase"
-            traefik.http.services.metabase.loadbalancer.server.port: "3000"
         restart: unless-stopped
         volumes:
             - metabase:/metabase-data:z
 
 {% endif %}
-{% if template_odoo_instance.value.extra_app is defined %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.extra_app is defined %}
     app:
         image: {{ template_odoo_instance.value.extra_app.image }}
         container_name: {{ template_odoo_instance.value.extra_app.name }}
@@ -254,19 +256,19 @@ networks:
     inverseproxy_shared:
         external: true
 {# if not prod #}
-{% if template_instance_is_prod is false %}
+{% if template_updater_mode | default(false) or template_instance_is_prod is false %}
     inverseproxy_smtp:
         external: true
 {% endif %}
-{% if template_odoo_instance.value.extra_app is defined %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.extra_app is defined %}
     inverseproxy_app:
         external: true
 {% endif %}
-{% if template_odoo_instance.value.metabase | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.metabase | default(false) %}
     inverseproxy_bi:
         external: true
 {% endif %}
-{% if restrict_internet_access %}
+{% if not (template_updater_mode | default(false)) and restrict_internet_access %}
 {% if whitelisted_urls is defined %}
     whitelists_proxy:
         external: true
@@ -282,7 +284,7 @@ networks:
 {% endif %}
 {% endif %}
 {# if prod and mailname #}
-{% if template_instance_is_prod and mailname | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod and mailname | default(false) %}
     email_proxy:
         driver_opts:
             encrypted: 1
@@ -293,7 +295,7 @@ networks:
             encrypted: 1
 {% endif %}
 {% endif %}
-{% if template_odoo_instance.value.odoo_remote_db_access | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.odoo_remote_db_access | default(false) %}
     public:
 {% endif %}
 
@@ -301,9 +303,9 @@ volumes:
     filestore:
     db:
 {# if prod and mailname #}
-{% if template_instance_is_prod and mailname | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_instance_is_prod and mailname | default(false) %}
     smtp:
 {% endif %}
-{% if template_odoo_instance.value.metabase | default(false) %}
+{% if not (template_updater_mode | default(false)) and template_odoo_instance.value.metabase | default(false) %}
     metabase:
 {% endif %}
diff --git a/vars/main.yml b/vars/main.yml
index 87976262906661ee5ba5ac4f609dbaa82cd726ea..4f9cafd11bf4320a40da8005b15e4f607ecd2cae 100644
--- a/vars/main.yml
+++ b/vars/main.yml
@@ -2,8 +2,9 @@ allow_pull: "{{ pull is undefined or pull is truthy(convert_bool=True) }}"
 allow_rebuild: "{{ rebuild is undefined or rebuild is truthy(convert_bool=True) }}"
 allow_remove_key: "{{ remove_key is undefined or remove_key is truthy(convert_bool=True) }}"
 allow_restart: "{{ restart is undefined or restart is truthy(convert_bool=True) }}"
-odoo_instance_noprod: "{{ odoo_instance_kind is undefined or odoo_instance_kind == 'all' or odoo_instance_kind == 'noprod' }}"
-odoo_instance_prod: "{{ odoo_instance_kind is undefined or odoo_instance_kind == 'all' or odoo_instance_kind == 'prod' }}"
+selected_odoo_instance_noprod: "{{ selected_odoo_instance_kind is undefined or selected_odoo_instance_kind == 'all' or selected_odoo_instance_kind == 'noprod' }}"
+selected_odoo_instance_prod: "{{ selected_odoo_instance_kind is undefined or selected_odoo_instance_kind == 'all' or selected_odoo_instance_kind == 'prod' }}"
+selected_odoo_instance_build: "{{ selected_odoo_instance_kind is undefined or selected_odoo_instance_kind == 'all' or selected_odoo_instance_kind == 'build' }}"
 
 odoo_instance: "{{ {'key': item, 'value': odoo_instances[item]} if item is string else item }}"
 odoo_instance_setup: "{{ odoo_setup_conf[odoo_instance.value.odoo_setup_version | default(odoo_setup_version)] }}"
@@ -20,9 +21,10 @@ odoo_image_instance_setup: "{{ odoo_setup_conf[odoo_image_instance.value.odoo_se
 test_result_item_has_changed: "{{ item.item is defined and item.changed is defined and item.changed is true }}"
 
 test_instance_is_prod: "{{ odoo_instance.value.prod_instance | default(false) == odoo_instance.key }}"
-test_instance_is_prod_selected: "{{ odoo_instance_prod and test_instance_is_prod }}"
-test_instance_is_noprod_selected: "{{ odoo_instance_noprod and test_instance_is_prod is false }}"
-
-test_instance_is_selected: "{{ (test_instance_is_prod_selected or test_instance_is_noprod_selected) and (selected_odoo_instance is undefined or selected_odoo_instance == odoo_instance.key) and (selected_odoo_version is undefined or odoo_instance_version in selected_odoo_version) }}"
+test_instance_is_prod_selected: "{{ selected_odoo_instance_prod and test_instance_is_prod }}"
+test_instance_is_noprod_selected: "{{ selected_odoo_instance_noprod and test_instance_is_prod is false }}"
 
 test_instance_need_build: "{{ odoo_instance.value.image_instance | default(false) == odoo_instance.key }}"
+test_instance_need_build_selected: "{{ selected_odoo_instance_build and test_instance_need_build }}"
+
+test_instance_is_selected: "{{ (test_instance_is_prod_selected or test_instance_is_noprod_selected or test_instance_need_build_selected) and (selected_odoo_instance is undefined or selected_odoo_instance == odoo_instance.key) and (selected_odoo_version is undefined or odoo_instance_version in selected_odoo_version) }}"