diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py
index 11294d9e2c50fb29b55eb99370162fb6d12c39aa..e8fe02ca1bd7893be2c6bc150c6b210493ea9f93 100644
--- a/gso/workflows/iptrunk/migrate_iptrunk.py
+++ b/gso/workflows/iptrunk/migrate_iptrunk.py
@@ -25,7 +25,7 @@ from pydantic import AfterValidator, ConfigDict, field_validator
 from pydantic_forms.validators import ReadOnlyField, validate_unique_list
 from pynetbox.models.dcim import Interfaces
 
-from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock
+from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock, IptrunkType
 from gso.products.product_types.iptrunk import Iptrunk
 from gso.products.product_types.router import Router
 from gso.services import infoblox
@@ -416,6 +416,90 @@ def deploy_new_config_real(
     return {"subscription": subscription}
 
 
+@step("[DRY RUN] Update BFD on the remaining side")
+def update_remaining_side_bfd_dry(
+    subscription: Iptrunk,
+    callback_route: str,
+    new_node: Router,
+    replace_index: int,
+    process_id: UUIDstr,
+    tt_number: str,
+) -> State:
+    """Perform a dry run of deploying configuration on the new router."""
+    extra_vars = {
+        "wfo_trunk_json": json.loads(json_dumps(subscription)),
+        "new_node": json.loads(json_dumps(new_node)),
+        "replace_index": replace_index,
+        "verb": "update",
+        "config_object": "bfd_update",
+        "dry_run": True,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} " f"- Update BFD config.",
+    }
+
+    execute_playbook(
+        playbook_name="iptrunks_migration.yaml",
+        callback_route=callback_route,
+        inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
+        extra_vars=extra_vars,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[FOR REAL] Update BFD on the remaining side")
+def update_remaining_side_bfd_real(
+    subscription: Iptrunk,
+    callback_route: str,
+    new_node: Router,
+    replace_index: int,
+    process_id: UUIDstr,
+    tt_number: str,
+) -> State:
+    """Perform a dry run of deploying configuration on the new router."""
+    extra_vars = {
+        "wfo_trunk_json": json.loads(json_dumps(subscription)),
+        "new_node": json.loads(json_dumps(new_node)),
+        "replace_index": replace_index,
+        "verb": "update",
+        "config_object": "bfd_update",
+        "dry_run": False,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} " f"- Update BFD config.",
+    }
+
+    execute_playbook(
+        playbook_name="iptrunks_migration.yaml",
+        callback_route=callback_route,
+        inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
+        extra_vars=extra_vars,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("Check BFD session over trunk")
+def check_ip_trunk_bfd(
+    subscription: Iptrunk,
+    callback_route: str,
+    new_node: Router,
+    replace_index: int,
+) -> State:
+    """Check BFD session across the new trunk."""
+    extra_vars = {
+        "wfo_ip_trunk_json": json.loads(json_dumps(subscription)),
+        "new_node": json.loads(json_dumps(new_node)),
+        "check": "bfd",
+    }
+
+    execute_playbook(
+        playbook_name="iptrunks_checks.yaml",
+        callback_route=callback_route,
+        inventory=subscription.iptrunk.iptrunk_sides[1 - replace_index].iptrunk_side_node.router_fqdn,
+        extra_vars=extra_vars,
+    )
+
+    return {"subscription": subscription}
+
+
 @inputstep("Wait for confirmation", assignee=Assignee.SYSTEM)
 def confirm_continue_move_fiber() -> FormGenerator:
     """Wait for confirmation from an operator that the physical fiber has been moved."""
@@ -726,6 +810,9 @@ def migrate_iptrunk() -> StepList:
         == Vendor.NOKIA
     )
     should_restore_isis_metric = conditional(lambda state: state["restore_isis_metric"])
+    trunk_type_is_leased = conditional(
+        lambda state: state["subscription"]["iptrunk"]["iptrunk_type"] == IptrunkType.LEASED
+    )
 
     return (
         init
@@ -739,8 +826,11 @@ def migrate_iptrunk() -> StepList:
         >> lso_interaction(disable_old_config_real)
         >> lso_interaction(deploy_new_config_dry)
         >> lso_interaction(deploy_new_config_real)
+        >> trunk_type_is_leased(lso_interaction(update_remaining_side_bfd_dry))
+        >> trunk_type_is_leased(lso_interaction(update_remaining_side_bfd_real))
         >> confirm_continue_move_fiber
         >> lso_interaction(check_ip_trunk_optical_levels_post)
+        >> trunk_type_is_leased(lso_interaction(check_ip_trunk_bfd))
         >> lso_interaction(check_ip_trunk_connectivity)
         >> lso_interaction(deploy_new_isis)
         >> lso_interaction(check_ip_trunk_isis)