diff --git a/gso/workflows/iptrunk/validate_iptrunk.py b/gso/workflows/iptrunk/validate_iptrunk.py
index e80b49c672dbc22e11fd86f7bdbb3436685f835b..1b2c1bc14e531c068d2cb1d4d6306f939fcdd8c0 100644
--- a/gso/workflows/iptrunk/validate_iptrunk.py
+++ b/gso/workflows/iptrunk/validate_iptrunk.py
@@ -15,10 +15,7 @@ from gso.services.lso_client import anonymous_lso_interaction, execute_playbook
 from gso.services.netbox_client import NetboxClient
 from gso.utils.helpers import get_router_vendor
 from gso.utils.shared_enums import Vendor
-from gso.utils.workflow_steps import detect_configuration_drift
-from gso.workflows.iptrunk.deploy_twamp import deploy_twamp_dry
 from gso.workflows.iptrunk.migrate_iptrunk import check_ip_trunk_isis
-from gso.workflows.iptrunk.modify_trunk_interface import provision_ip_trunk_iface_dry
 
 
 @step("Validate IP trunk configuration")
@@ -146,6 +143,34 @@ def verify_netbox_entries(subscription: Iptrunk) -> None:
         raise ProcessFailureError(message="NetBox misconfiguration(s) found", details=str(netbox_errors))
 
 
+@step("Verify configuration of IPtrunk")
+def verify_iptrunk_config(subscription: Iptrunk, callback_route: str) -> None:
+    """Check for configuration drift on the relevant routers."""
+    extra_vars = {"wfo_trunk_json": json.loads(json_dumps(subscription)), "verb": "check"}
+
+    execute_playbook(
+        playbook_name="iptrunks.yaml",
+        callback_route=callback_route,
+        inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
+        f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n",
+        extra_vars=extra_vars,
+    )
+
+
+@step("Verify TWAMP configuration")
+def verify_twamp_config(subscription: Iptrunk, callback_route: str) -> None:
+    """Check for configuration drift of TWAMP."""
+    extra_vars = {"subscription": json.loads(json_dumps(subscription)), "verb": "check"}
+
+    execute_playbook(
+        playbook_name="deploy_twamp.yaml",
+        callback_route=callback_route,
+        inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
+        f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n",
+        extra_vars=extra_vars,
+    )
+
+
 @workflow(
     "Validate IP trunk configuration",
     target=Target.SYSTEM,
@@ -166,9 +191,9 @@ def validate_iptrunk() -> StepList:
         >> unsync
         >> verify_ipam_records
         >> verify_netbox_entries
-        >> anonymous_lso_interaction(provision_ip_trunk_iface_dry, detect_configuration_drift)
+        >> anonymous_lso_interaction(verify_iptrunk_config)
         >> anonymous_lso_interaction(check_ip_trunk_isis)
-        >> anonymous_lso_interaction(deploy_twamp_dry, detect_configuration_drift)
+        >> anonymous_lso_interaction(verify_twamp_config)
         >> resync
         >> done
     )
diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py
index e66acb225e9959cbb229e2bc8a388b2d05802db0..5ed8189798ad1f838ec053be0aeb2e2aef175fed 100644
--- a/gso/workflows/router/validate_router.py
+++ b/gso/workflows/router/validate_router.py
@@ -11,11 +11,9 @@ from gso.products.product_types.router import Router
 from gso.schedules import TT_NUMBER_ZERO
 from gso.services import infoblox
 from gso.services.librenms_client import LibreNMSClient
-from gso.services.lso_client import anonymous_lso_interaction
+from gso.services.lso_client import anonymous_lso_interaction, execute_playbook
 from gso.services.netbox_client import NetboxClient
 from gso.utils.shared_enums import Vendor
-from gso.utils.workflow_steps import deploy_base_config_dry, detect_configuration_drift
-from gso.workflows.router.update_ibgp_mesh import add_p_to_mesh_dry
 
 
 @step("Prepare required keys in state")
@@ -63,6 +61,28 @@ def verify_librenms_entry(subscription: Router) -> None:
     client.get_device(subscription.router.router_fqdn)
 
 
+@step("Check base config for drift")
+def verify_base_config(subscription: Router, callback_route: str) -> None:
+    """Workflow step for running a playbook that checks whether base config has drifted."""
+    execute_playbook(
+        playbook_name="base_config.yaml",
+        callback_route=callback_route,
+        inventory=subscription.router.router_fqdn,
+        extra_vars={"wfo_router_json": subscription, "verb": "check-drift"},
+    )
+
+
+@step("Validate iBGP mesh configuration")
+def validate_ibgp_mesh_config(subscription: Router, callback_route: str) -> None:
+    """Workflow step for running a playbook that check iBGP mesh configuration."""
+    execute_playbook(
+        playbook_name="ibgp_checks.yaml",
+        callback_route=callback_route,
+        inventory=subscription.router.router_fqdn,
+        extra_vars={"wfo_router_json": subscription},
+    )
+
+
 @workflow(
     "Validate router configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None)
 )
@@ -86,8 +106,8 @@ def validate_router() -> StepList:
         >> verify_ipam_loopback
         >> verify_netbox_entry
         >> verify_librenms_entry
-        >> anonymous_lso_interaction(deploy_base_config_dry, detect_configuration_drift)
-        >> anonymous_lso_interaction(add_p_to_mesh_dry, detect_configuration_drift)
+        >> anonymous_lso_interaction(verify_base_config)
+        >> anonymous_lso_interaction(validate_ibgp_mesh_config)
         >> resync
         >> done
     )