diff --git a/playbooks/roles/sync-project-config/defaults/main.yaml b/playbooks/roles/sync-project-config/defaults/main.yaml
index 1dad7599f7..e17024ad67 100644
--- a/playbooks/roles/sync-project-config/defaults/main.yaml
+++ b/playbooks/roles/sync-project-config/defaults/main.yaml
@@ -1,2 +1,3 @@
 project_config_dest: /opt/project-config
 project_config_subdir: ""
+infra_prod_run_from_master: "{{ zuul.pipeline|default('') in ['periodic', 'opendev-prod-hourly'] }}"
diff --git a/playbooks/roles/sync-project-config/tasks/main.yaml b/playbooks/roles/sync-project-config/tasks/main.yaml
index c0f1f5f4e7..cff9acc5f7 100644
--- a/playbooks/roles/sync-project-config/tasks/main.yaml
+++ b/playbooks/roles/sync-project-config/tasks/main.yaml
@@ -3,9 +3,15 @@
     path: '{{ project_config_dest }}'
     state: directory
 
+- name: Update from master
+  when: infra_prod_run_from_master|bool
+  delegate_to: bridge.openstack.org
+  git:
+    repo: https://opendev.org/openstack/project-config
+    dest: '{{ project_config_src }}'
+    force: yes
+
 - name: Sync project-config repo
   synchronize:
     src: '{{ project_config_src }}/{{ project_config_subdir }}'
     dest: '{{ project_config_dest }}'
-
-
diff --git a/playbooks/zuul/run-production-playbook.yaml b/playbooks/zuul/run-production-playbook.yaml
index 3ff8346ba5..7b3d68065a 100644
--- a/playbooks/zuul/run-production-playbook.yaml
+++ b/playbooks/zuul/run-production-playbook.yaml
@@ -31,6 +31,17 @@
       include_role:
         name: prepare-workspace-git
 
+    - name: Should we run from master
+      set_fact:
+        infra_prod_run_from_master: "{{ zuul.pipeline|default('') in ['periodic', 'opendev-prod-hourly'] }}"
+
+    - name: Update from master
+      when: infra_prod_run_from_master|bool
+      git:
+        repo: https://opendev.org/opendev/system-config
+        dest: /home/zuul/src/opendev.org/opendev/system-config
+        force: yes
+
     - name: Run the production playbook and capture logs
       block: