diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
index 5a090e7e00d1662129843c2637af81bcd54d3368..6ac6193af5f17e003f5f84eba351c981e6824a2d 100644
--- a/docs/source/glossary.rst
+++ b/docs/source/glossary.rst
@@ -27,7 +27,7 @@ Glossary of terms
     Create, Read, Update, Delete
 
   DNS
-    Domain Name System
+    The Domain Name System. Used for correlating domain names to IP information, among others.
 
   FQDN
     Fully Quantified Domain Name
@@ -83,7 +83,7 @@ Glossary of terms
     and monitoring.
 
   TWAMP
-    Two-way Active Measurement Protocol.
+    A Two-Way Active Measuring Protocol, as defined in `RFC 5357 <https://datatracker.ietf.org/doc/html/rfc5357>`_.
 
   UUID
     Universally Unique Identifier
diff --git a/docs/source/module/workflows/iptrunk/deploy_twamp.rst b/docs/source/module/workflows/iptrunk/deploy_twamp.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7fde13038dc60e35a84921ab41899ba8b7b9553b
--- /dev/null
+++ b/docs/source/module/workflows/iptrunk/deploy_twamp.rst
@@ -0,0 +1,6 @@
+``gso.workflows.iptrunk.deploy_twamp``
+======================================
+
+.. automodule:: gso.workflows.iptrunk.deploy_twamp
+   :members:
+   :show-inheritance:
diff --git a/docs/source/module/workflows/iptrunk/index.rst b/docs/source/module/workflows/iptrunk/index.rst
index 127d1985c0a8c6b86c62182fb0d81ee2951aed59..12e21b267a529a368ee51c3885c4bd102f6ebf5a 100644
--- a/docs/source/module/workflows/iptrunk/index.rst
+++ b/docs/source/module/workflows/iptrunk/index.rst
@@ -15,8 +15,10 @@ Submodules
    activate_iptrunk
    create_imported_iptrunk
    create_iptrunk
+   deploy_twamp
    import_iptrunk
    migrate_iptrunk
    modify_isis_metric
    modify_trunk_interface
    terminate_iptrunk
+   validate_iptrunk
diff --git a/docs/source/module/workflows/iptrunk/validate_iptrunk.rst b/docs/source/module/workflows/iptrunk/validate_iptrunk.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c009f8f73fd8f010689a11cb1bcb502c94f4a5d8
--- /dev/null
+++ b/docs/source/module/workflows/iptrunk/validate_iptrunk.rst
@@ -0,0 +1,6 @@
+``gso.workflows.iptrunk.validate_iptrunk``
+==========================================
+
+.. automodule:: gso.workflows.iptrunk.validate_iptrunk
+   :members:
+   :show-inheritance:
diff --git a/docs/source/module/workflows/router/index.rst b/docs/source/module/workflows/router/index.rst
index 1913157882cab48dc6d3ddeaafac26acdbf9e8ea..3e086871b91f672162ac31337e17844002b249df 100644
--- a/docs/source/module/workflows/router/index.rst
+++ b/docs/source/module/workflows/router/index.rst
@@ -20,3 +20,4 @@ Submodules
    redeploy_base_config
    terminate_router
    update_ibgp_mesh
+   validate_router
diff --git a/docs/source/module/workflows/router/validate_router.rst b/docs/source/module/workflows/router/validate_router.rst
new file mode 100644
index 0000000000000000000000000000000000000000..3b44def246a887a79a6487649691f7c23cfb616f
--- /dev/null
+++ b/docs/source/module/workflows/router/validate_router.rst
@@ -0,0 +1,6 @@
+``gso.workflows.router.validate_router``
+========================================
+
+.. automodule:: gso.workflows.router.validate_router
+   :members:
+   :show-inheritance:
diff --git a/gso/workflows/iptrunk/deploy_twamp.py b/gso/workflows/iptrunk/deploy_twamp.py
index c8342f9a44e996ede5a30de69b06faabf846bc14..10970127b924e34d749bfe68685bac48c048374c 100644
--- a/gso/workflows/iptrunk/deploy_twamp.py
+++ b/gso/workflows/iptrunk/deploy_twamp.py
@@ -1,4 +1,4 @@
-"""Workflow for adding TWAMP to an existing IP trunk."""
+"""Workflow for adding :term:`TWAMP` to an existing IP trunk."""
 
 import json
 
@@ -39,7 +39,7 @@ def _initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
 @step("[DRY RUN] Deploy TWAMP on both sides")
 def deploy_twamp_dry(subscription: Iptrunk, process_id: UUIDstr, callback_route: str, tt_number: str) -> State:
-    """Perform a dry run of deploying the TWAMP session."""
+    """Perform a dry run of deploying the :term:`TWAMP` session."""
     extra_vars = {
         "subscription": json.loads(json_dumps(subscription)),
         "process_id": process_id,
@@ -60,7 +60,7 @@ def deploy_twamp_dry(subscription: Iptrunk, process_id: UUIDstr, callback_route:
 
 @step("[FOR REAL] Deploy TWAMP on both sides")
 def deploy_twamp_real(subscription: Iptrunk, process_id: UUIDstr, callback_route: str, tt_number: str) -> State:
-    """Deploy the TWAMP session."""
+    """Deploy the :term:`TWAMP` session."""
     extra_vars = {
         "subscription": json.loads(json_dumps(subscription)),
         "process_id": process_id,
@@ -103,9 +103,9 @@ def check_twamp_status(subscription: Iptrunk, callback_route: str) -> State:
     target=Target.MODIFY,
 )
 def deploy_twamp() -> StepList:
-    """Deploy a TWAMP session on an IP trunk.
+    """Deploy a :term:`TWAMP` session on an IP trunk.
 
-    * Run the TWAMP playbook, including an initial dry run
+    * Run the :term:`TWAMP` playbook, including an initial dry run
     """
     return (
         init
diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py
index a92294934f94ef949fbd912f32ce65ab598e57b6..b0dfb950b838cddd11eb9b754e4aa3d7fa2b4270 100644
--- a/gso/workflows/iptrunk/migrate_iptrunk.py
+++ b/gso/workflows/iptrunk/migrate_iptrunk.py
@@ -182,7 +182,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 def netbox_reserve_interfaces(
     subscription: Iptrunk, new_node: UUIDstr, new_lag_interface: str, new_lag_member_interfaces: list[dict]
 ) -> State:
-    """Reserve new interfaces in Netbox, only when the new side's router is a NOKIA router."""
+    """Reserve new interfaces in Netbox, only when the new side's router is a Nokia router."""
     new_side = Router.from_subscription(new_node).router
     nbclient = NetboxClient()
     # Create :term:`LAG` interfaces
@@ -739,7 +739,7 @@ def delete_old_config_real(
 def update_ipam(subscription: Iptrunk, replace_index: int, new_node: Router, new_lag_interface: str) -> State:
     """Update :term:`IPAM` resources.
 
-    Move the DNS record pointing to the old side of the trunk, to the new side.
+    Move the :term:`DNS` record pointing to the old side of the trunk, to the new side.
     """
     v4_addr = subscription.iptrunk.iptrunk_ipv4_network[replace_index]
     # IPv6 networks start with an unused address we need to skip past.
diff --git a/gso/workflows/iptrunk/validate_iptrunk.py b/gso/workflows/iptrunk/validate_iptrunk.py
index 47d30dc508c115fbd5c3f3704669ad54d9d92770..47db625697185f0be1cdfa8e8d6644d50b85e046 100644
--- a/gso/workflows/iptrunk/validate_iptrunk.py
+++ b/gso/workflows/iptrunk/validate_iptrunk.py
@@ -32,7 +32,7 @@ def validate_router_config(subscription: Iptrunk, callback_route: str) -> None:
 def verify_ipam_loopback(subscription: Iptrunk) -> None:
     """Validate the :term:`IPAM` resources for the :term:`LAG` interfaces.
 
-    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if IPAM is configured incorrectly.
+    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if :term:`IPAM` is configured incorrectly.
     """
     ipam_errors = []
     ipam_v4_network = infoblox.find_network_by_cidr(subscription.iptrunk.iptrunk_ipv4_network)
@@ -70,7 +70,7 @@ def validate_iptrunk() -> StepList:
     """Validate an existing, active IP Trunk subscription.
 
     * Run an Ansible playbook to verify the configuration is intact.
-    * Verify that the LAG interfaces are correctly configured in IPAM.
+    * Verify that the :term:`LAG` interfaces are correctly configured in :term:`IPAM`.
     """
     return (
         init
diff --git a/gso/workflows/router/create_router.py b/gso/workflows/router/create_router.py
index dfa0b27b517c0233231fb11c14f335adc7749e44..ff859d879a34b7163a1177064c5b1de4d4fc44c1 100644
--- a/gso/workflows/router/create_router.py
+++ b/gso/workflows/router/create_router.py
@@ -131,7 +131,7 @@ def ipam_allocate_loopback(subscription: RouterInactive) -> State:
 
 @step("Create NetBox Device")
 def create_netbox_device(subscription: RouterInactive) -> State:
-    """Create a new NOKIA device in Netbox."""
+    """Create a new Nokia device in Netbox."""
     fqdn = subscription.router.router_fqdn
     site_tier = subscription.router.router_site.site_tier if subscription.router.router_site else None
     if not fqdn or not site_tier:
@@ -147,7 +147,7 @@ def create_netbox_device(subscription: RouterInactive) -> State:
 def verify_ipam_loopback(subscription: RouterInactive) -> None:
     """Validate the :term:`IPAM` resources for the loopback interface.
 
-    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if IPAM is configured incorrectly.
+    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if :term:`IPAM` is configured incorrectly.
     """
     host_record = infoblox.find_host_by_fqdn(f"lo0.{subscription.router.router_fqdn}")
     if not host_record or str(subscription.subscription_id) not in host_record.comment:
diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py
index f63c9e8ab0b9e2f1c563ee32d4c9dcb5a9557c29..d768eb37a0ac29cd8fcbfe35bbda4aa0561febdd 100644
--- a/gso/workflows/router/validate_router.py
+++ b/gso/workflows/router/validate_router.py
@@ -31,7 +31,7 @@ def validate_router_config(subscription: Router, callback_route: str) -> None:
 def verify_ipam_loopback(subscription: Router) -> None:
     """Validate the :term:`IPAM` resources for the loopback interface.
 
-    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if IPAM is configured incorrectly.
+    Raises an :class:`orchestrator.utils.errors.ProcessFailureError` if :term:`IPAM` is configured incorrectly.
     """
     host_record = infoblox.find_host_by_fqdn(f"lo0.{subscription.router.router_fqdn}")
     if not host_record or str(subscription.subscription_id) not in host_record.comment:
@@ -48,7 +48,7 @@ def validate_router() -> StepList:
     """Validate an existing, active Router subscription.
 
     * Run an Ansible playbook to verify the configuration is intact.
-    * Verify that the loopback interface is correctly configured in IPAM.
+    * Verify that the loopback interface is correctly configured in :term:`IPAM`.
     """
     return (
         init