diff --git a/app/models.py b/app/models.py
index 68d4577d80328404c179edecbbed67989fcaf7b1..e904ad4b83cafc53219f019785627c0ef831a651 100644
--- a/app/models.py
+++ b/app/models.py
@@ -1782,9 +1782,8 @@ def trigger_core_services_update(session):
 def trigger_inventory_update(session):
     """Trigger an inventory update in AWX
 
-    Update on any AnsibleGroup/Cname/Domain/Host/Network/NetworkScope
-    modification, but not on Interface as it's triggered with core
-    services update.
+    Update on any AnsibleGroup/Cname/Domain/Host/Interface/Network/NetworkScope
+    modification.
 
     Called by before flush hook
     """
@@ -1795,7 +1794,8 @@ def trigger_inventory_update(session):
     for kind in ("new", "dirty", "deleted"):
         for instance in getattr(session, kind):
             if isinstance(
-                instance, (AnsibleGroup, Cname, Domain, Host, Network, NetworkScope)
+                instance,
+                (AnsibleGroup, Cname, Domain, Host, Interface, Network, NetworkScope),
             ) and (
                 (kind == "dirty" and session.is_modified(instance))
                 or (kind in ("new", "deleted"))
diff --git a/app/utils.py b/app/utils.py
index b1b120d58d4a27326b5316cd1bf3d4c0de22f9c3..190f52c6fe5f2a001b9bc4c04f5c1faca755d76b 100644
--- a/app/utils.py
+++ b/app/utils.py
@@ -233,32 +233,34 @@ def pretty_yaml(value):
 
 
 def trigger_core_services_update():
-    """Trigger a job to update the core services on the TN (DNS and DHCP)
+    """Trigger a job to update the core services (DNS/DHCP/radius)
 
     This function should be called every time an interface is created/edited
 
-    Always trigger an inventory update first.
+    The AWX template uses its own inventory that is updated on launch to avoid
+    blocking the main inventory update when running.
+    There is no need to trigger an inventory update.
+
+    We can have one running job + one in queue to apply the latest changes.
+    Make sure that we don't have more than one in queue.
     """
-    # Start by triggering an inventory update
-    inventory_task = trigger_inventory_update()
-    # If there is already a core service update depending on this inventory update,
-    # there is no need to trigger a new one
-    for reverse_dependency in inventory_task.reverse_dependencies:
-        if reverse_dependency.name == "trigger_core_services_update":
-            current_app.logger.info(
-                f'Already one "trigger_core_services_update" {reverse_dependency} '
-                f"depending on the inventory update {inventory_task}. "
-                "No need to trigger a new one."
-            )
-            return None
+    waiting_task = current_user.get_task_waiting("trigger_core_services_update")
+    if waiting_task is not None:
+        current_app.logger.info(
+            'Already one "trigger_core_services_update" task waiting. No need to trigger a new one.'
+        )
+        return waiting_task
     job_template = current_app.config["AWX_CORE_SERVICES_UPDATE"]
     resource = current_app.config.get("AWX_CORE_SERVICES_UPDATE_RESOURCE", "job")
     kwargs = {
         "func": "launch_awx_job",
         "job_template": job_template,
         "resource": resource,
-        "depends_on": inventory_task.id,
     }
+    started = current_user.get_task_started("trigger_core_services_update")
+    if started:
+        # There is already one running task. Trigger a new one when it's done.
+        kwargs["depends_on"] = started.id
     current_app.logger.info(f"Launch new job to update core services: {job_template}")
     task = current_user.launch_task(
         "trigger_core_services_update", queue_name="normal", **kwargs