diff --git a/gso/utils/workflow_steps.py b/gso/utils/workflow_steps.py
index 92ef947f174ba24d665124a474551a2b1788dd84..06b3e4ef9d876c51f6ffba1a0e3ce6aa2f65e96f 100644
--- a/gso/utils/workflow_steps.py
+++ b/gso/utils/workflow_steps.py
@@ -12,7 +12,6 @@ from pydantic_forms.core import FormPage
 from pydantic_forms.types import FormGenerator
 from pydantic_forms.validators import Label
 
-from gso.products.product_blocks import router
 from gso.products.product_blocks.router import RouterRole
 from gso.products.product_types.iptrunk import Iptrunk
 from gso.services import lso_client
@@ -95,8 +94,10 @@ def _update_sdp_single_pe(
         f"Update the SDP mesh for L2circuits(epipes) config on PE NOKIA routers",
         "verb": "update_sdp_mesh",
         "pe_router_list": generate_inventory_for_active_routers(
-            router.RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]]
-        ),
+            router_role=RouterRole.PE,
+            router_vendor=Vendor.NOKIA,
+            exclude_routers=[subscription["router"]["router_fqdn"]],
+        )["all"]["hosts"],
     }
 
     lso_client.execute_playbook(
@@ -107,6 +108,267 @@ def _update_sdp_single_pe(
     )
 
 
+def _add_pe_mesh_to_pe(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+    *,
+    dry_run: bool,
+) -> None:
+    inventory = subscription["router"]["router_fqdn"]
+    extra_vars = {
+        "dry_run": dry_run,
+        "subscription": subscription,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
+        f"Add list of PE routers into iGEANT/iGEANT6 groups of the PE router",
+        "verb": "add_pe_mesh_to_pe",
+        "pe_router_list": generate_inventory_for_active_routers(
+            router_role=RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]]
+        )["all"]["hosts"],
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=inventory,
+        extra_vars=extra_vars,
+    )
+
+
+def _add_pe_to_pe_mesh(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+    *,
+    dry_run: bool,
+) -> None:
+    inventory = generate_inventory_for_active_routers(
+        router_role=RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]]
+    )
+    extra_vars = {
+        "dry_run": dry_run,
+        "subscription": subscription,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
+        f"Add the PE router to all PE routers in iGEANT/iGEANT6.",
+        "verb": "add_pe_to_pe_mesh",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=inventory,
+        extra_vars=extra_vars,
+    )
+
+
+def _add_all_p_to_pe(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+    *,
+    dry_run: bool,
+) -> None:
+    inventory = subscription["router"]["router_fqdn"]
+    extra_vars = {
+        "dry_run": dry_run,
+        "subscription": subscription,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Add all P-routers to this new PE",
+        "verb": "add_all_p_to_pe",
+        "p_router_list": generate_inventory_for_active_routers(
+            router_role=RouterRole.P, exclude_routers=[subscription["router"]["router_fqdn"]]
+        )["all"]["hosts"],
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=inventory,
+        extra_vars=extra_vars,
+    )
+
+
+def _add_pe_to_all_p(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+    *,
+    dry_run: bool,
+) -> None:
+    inventory = generate_inventory_for_active_routers(
+        router_role=RouterRole.P, exclude_routers=[subscription["router"]["router_fqdn"]]
+    )
+    extra_vars = {
+        "dry_run": dry_run,
+        "subscription": subscription,
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
+        f"Add promoted router to all PE routers in iGEANT/iGEANT6",
+        "verb": "add_pe_to_all_p",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=inventory,
+        extra_vars=extra_vars,
+    )
+
+
+@step("[DRY RUN] Add the PE to all P routers")
+def add_pe_to_all_p_dry(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a dry run of adding the PE router to all P routers."""
+    _add_pe_to_all_p(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[FOR REAL] Add the PE to all P routers")
+def add_pe_to_all_p_real(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a real run of adding the PE router to all P routers."""
+    _add_pe_to_all_p(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[DRY RUN] Add all P routers to the PE")
+def add_all_p_to_pe_dry(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a dry run of adding all P routers to the PE router."""
+    _add_all_p_to_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[FOR REAL] Add all P routers to the PE")
+def add_all_p_to_pe_real(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a real run of adding all P routers to the PE router."""
+    _add_all_p_to_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[DRY RUN] Add the PE to PE mesh")
+def add_pe_to_pe_mesh_dry(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a dry run of adding the PE router to all PE routers in iGEANT/iGEANT6."""
+    _add_pe_to_pe_mesh(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[FOR REAL] Add the PE to PE mesh")
+def add_pe_to_pe_mesh_real(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a dry run of adding the PE router to all PE routers in iGEANT/iGEANT6."""
+    _add_pe_to_pe_mesh(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[DRY RUN] Add PE mesh to the PE")
+def add_pe_mesh_to_pe_dry(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a dry run of adding list of PE routers into iGEANT/iGEANT6 of the router."""
+    _add_pe_mesh_to_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
+
+    return {"subscription": subscription}
+
+
+@step("[FOR REAL] Add PE mesh to the PE")
+def add_pe_mesh_to_pe_real(
+    subscription: dict[str, Any],
+    callback_route: str,
+    tt_number: str,
+    process_id: UUIDstr,
+) -> State:
+    """Perform a real run of adding list of PE routers into iGEANT/iGEANT6 of the router."""
+    _add_pe_mesh_to_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
+
+    return {"subscription": subscription}
+
+
 @step("[DRY RUN] Deploy base config")
 def deploy_base_config_dry(
     subscription: dict[str, Any],
@@ -133,42 +395,66 @@ def deploy_base_config_real(
     return {"subscription": subscription}
 
 
-@step("[DRY RUN] Include new PE into SDP mesh on other Nokia PEs")
+@step("[DRY RUN] Include the PE into SDP mesh on other Nokia PEs")
 def update_sdp_mesh_dry(
     subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr
 ) -> State:
     """Perform a dry run of including new PE router in SDP mesh on other NOKIA PE routers."""
-    _update_sdp_mesh(subscription, tt_number, callback_route, process_id, dry_run=True)
+    _update_sdp_mesh(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
 
     return {"subscription": subscription}
 
 
-@step("[FOR REAL] Include new PE into SDP mesh on other Nokia PEs")
+@step("[FOR REAL] Include the PE into SDP mesh on other Nokia PEs")
 def update_sdp_mesh_real(
     subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr
 ) -> State:
     """Include new PE router in SDP mesh on other NOKIA PE routers."""
-    _update_sdp_mesh(subscription, tt_number, callback_route, process_id, dry_run=False)
+    _update_sdp_mesh(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
 
     return {"subscription": subscription}
 
 
-@step("[DRY RUN] Configure SDP on a new PE to all other Nokia PEs")
+@step("[DRY RUN] Configure SDP on the PE to all other Nokia PEs")
 def update_sdp_single_pe_dry(
     subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr
 ) -> State:
     """Perform a dry run of configuring SDP on a new PE router to all other NOKIA PE routers."""
-    _update_sdp_single_pe(subscription, tt_number, callback_route, process_id, dry_run=True)
+    _update_sdp_single_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=True,
+    )
 
     return {"subscription": subscription}
 
 
-@step("[FOR REAL] Configure SDP on a new PE to all other Nokia PEs")
+@step("[FOR REAL] Configure SDP on the PE to all other Nokia PEs")
 def update_sdp_single_pe_real(
     subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr
 ) -> State:
     """Configure SDP on a new PE router to all other NOKIA PE routers."""
-    _update_sdp_single_pe(subscription, tt_number, callback_route, process_id, dry_run=False)
+    _update_sdp_single_pe(
+        subscription=subscription,
+        tt_number=tt_number,
+        callback_route=callback_route,
+        process_id=process_id,
+        dry_run=False,
+    )
 
     return {"subscription": subscription}
 
@@ -213,6 +499,40 @@ def run_checks_after_base_config(subscription: dict[str, Any], callback_route: s
     )
 
 
+@step("Check PE iBGP sessions")
+def check_pe_ibgp(subscription: dict[str, Any], callback_route: str) -> None:
+    """Check the iBGP session."""
+    extra_vars = {
+        "dry_run": False,
+        "subscription": subscription,
+        "verb": "check_pe_ibgp",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="check_ibgp.yaml",
+        callback_route=callback_route,
+        inventory=subscription["router"]["router_fqdn"],
+        extra_vars=extra_vars,
+    )
+
+
+@step("Check L3 VPRN services")
+def check_l3_services(subscription: dict[str, Any], callback_route: str) -> None:
+    """Check L3 services."""
+    extra_vars = {
+        "dry_run": False,
+        "subscription": subscription,
+        "verb": "check_base_ris",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="check_l3_services.yaml",
+        callback_route=callback_route,
+        inventory=subscription["router"]["router_fqdn"],
+        extra_vars=extra_vars,
+    )
+
+
 @inputstep("Prompt for new SharePoint checklist", assignee=Assignee.SYSTEM)
 def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator:
     """Prompt the operator with the checklist in SharePoint for approving a new subscription."""