diff --git a/.htmltest.yml b/.htmltest.yml
index 46fd9c683..33ff03f3c 100644
--- a/.htmltest.yml
+++ b/.htmltest.yml
@@ -34,6 +34,7 @@ IgnoreURLs:
- "https://scribehow.com/.*"
- "https://www.rabbitmq.com/.*"
- "https://letsencrypt.org/.*"
+- "https://support.microsoft.com/.*"
IgnoreDirs:
- "docs/?.*/_print/"
- "docs/?.*/_shared/"
diff --git a/config/_default/config.toml b/config/_default/config.toml
index 0e51b4069..89c0a3e62 100644
--- a/config/_default/config.toml
+++ b/config/_default/config.toml
@@ -203,16 +203,22 @@ enable = true
[[menu.main]]
identifier = 'documentation'
name = 'Documentation'
- url = '/docs/2025.9'
+ url = '/docs/2026.3'
weight = 10
# Releases menu
+[[params.versions]]
+ version = "2026.3"
+ url = "/docs/2026.3/"
+ dotNetVersion = "net-8.0"
+ inSupport = true
+ latest = true
+
[[params.versions]]
version = "2025.9"
url = "/docs/2025.9/"
dotNetVersion = "net-8.0"
inSupport = true
- latest = true
[[params.versions]]
version = "2025.3"
diff --git a/content/en/blog/releases/2025.X/2025.9/2025.9.26161.md b/content/en/blog/releases/2025.X/2025.9/2025.9.26161.md
index d3eb2146f..6df0665e4 100644
--- a/content/en/blog/releases/2025.X/2025.9/2025.9.26161.md
+++ b/content/en/blog/releases/2025.X/2025.9/2025.9.26161.md
@@ -90,7 +90,7 @@ Finally, [Upgrade][] includes the following updates:
| [{{% ctx %}} Gateway][Gateway] | 13.25.1.25440 | 13.25.1.26142 | Yes | Patch | N/A | |
| [{{% ctx %}} Blocks Package][Blocks] | 49.0.4.25430 | 49.0.4.26131 | Yes | Patch | N/A | |
| [{{% ctx %}} Interaction Portal][Interaction Portal] | 3.3.0.25440 | 3.3.0.26151 | Yes | Patch | N/A | |
-| {{% ctx %}} Configuration Portal | 3.0.0.25440 | 3.0.0.26151 | Yes | Patch | Potential | Potential breaking changes occurred in this patch, related to the [ Introduction of Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal][Potential Breaking - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal] |
+| {{% ctx %}} Configuration Portal | 3.0.0.25440 | 3.0.0.26151 | Yes | Patch | Potential | Potential breaking changes occurred in this patch, related to the [ Introduction of Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal][Potential Breaking - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal] |
| {{% ctx %}} App Server Install Scripts | 5.2.13.25430 | 5.2.13.26163 | Yes | Patch | No | |
| > {{% ctx %}} App Server Backup | 1.0.1.25230 | 1.0.1.25230 | No | N/A | No | |
| > {{% ctx %}} App Server Recovery | 1.0.1.25230 | 1.0.1.25451 | Yes | Patch | No | |
@@ -110,7 +110,6 @@ Finally, [Upgrade][] includes the following updates:
#### Capability
-
##### Added ServiceDetails to ExecutionContext
The `ExecutionContext` now contains the `ServiceDetails`, providing information about the service that the execution is running on, including
@@ -141,7 +140,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Added ability to configure block logging on each block
All blocks now have a new advanced `Logging` setting that lets you control whether the [Block][Blocks] logs its activity. You can choose to always log by setting the `enabled` property in `Logging` to `true`, to never log by setting it to `false` or to have logging controlled by
@@ -171,7 +169,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Improved handling of blank or null expression
When using the expressions inside block properties, leaving an inner property blank or null could previously cause a translation error if {{% ctx %}} could not determine the correct default type.
@@ -189,7 +186,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Added LDAP Group Filtering for Role Claims
The [{{% ctx %}} Authorisation Service][] now includes a new optional setting, `DistinguishedNameFilter`, in its `LdapAuthSettings`. This setting allows you to control which LDAP groups are included in a user’s role claims.
@@ -200,8 +196,6 @@ Affected Components:
* [{{% ctx %}} Innovation Core Application][]
* [{{% ctx %}} Authorisation Service][]
-
-
##### Added support for filtering and opening task by process id
Support was added for filtering the Process Dashboard by providing the `ProcessId` as a query parameter (e.g `https://server.domain.com/cortexinteractionportal?ProcessID=ae40ced8-9a81-4c46-af85-f5ba35f48169`).
@@ -211,7 +205,6 @@ Affected Components:
* {{% ctx %}} Interaction Portal
-
##### Added support for assigning task to users and/or groups
Tasks can now be assigned to users and/or groups.
@@ -221,8 +214,6 @@ Affected Components:
* {{% ctx %}} Interaction Portal
-
-
##### Enhanced the handling of untranslated SNMP v1 Traps
For SNMP v1 traps without a matching MIB, {{% ctx %}} now extracts trap details directly from the trap OID when the `GenericTrapType` is valid (0–6).
@@ -234,8 +225,6 @@ Affected Components:
* [{{% ctx %}} Innovation Core Application][]
* [{{% ctx %}} Triggers Service][]
-
-
##### Partial Translation for unrecognised SNMP varbinds
{{% ctx %}} now attempts to partially translate SNMP varbinds when a full translation isn’t possible.
@@ -248,7 +237,6 @@ Affected Components:
#### Security
-
##### Added Encryption Endpoint to {{% ctx %}} API Gateway Service
The [{{% ctx %}} API Gateway Service][] now exposes a new API endpoint to encrypt user data.
@@ -259,7 +247,6 @@ Affected Components:
* [{{% ctx %}} API Gateway Service][]
* [{{% ctx %}} Listeners Service][]
-
##### Added support for multiple encryption keys
Support has been added for specifying multiple encryption keys, allowing Dev, Test and Prod environments to encrypt data using their own key, whilst being able to decrypt data encrypted in one of the other environments.
@@ -285,7 +272,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Added the ability to encrypt values in the {{% ctx %}} Configuration Portal
You can now securely encrypt parameter values directly when adding them to a container.
@@ -295,7 +281,6 @@ Affected Components:
* {{% ctx %}} Configuration Portal
-
##### Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal
Role‑based access control has been added to container management, making it easier to control who can create, view, edit, delete, import, and export containers.
@@ -304,9 +289,6 @@ Affected Components:
* {{% ctx %}} Configuration Portal
-
-
-
##### General Security enhancements
Some general security enhancements has been made to {{% ctx %}} Configuration Portal.
@@ -323,7 +305,6 @@ Affected Components:
#### Performance
-
##### Improved Execution Service concurrency and flow translation
The [{{% ctx %}} Execution Service][] now uses semaphores to ensure the same flow isn't translated multiple times when executed concurrently for the first time.
@@ -342,7 +323,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Limit the batch size of ExecutionCompletionDetails sent to the Monitoring Service
The [{{% ctx %}} Execution Management Service][] now limits the batch size of execution completion events, reducing inter‑service traffic.
@@ -363,7 +343,6 @@ Affected Components:
#### Observability
-
##### Set retention period for Grafana Loki
Added a retention period to Grafana Loki to ensure that Logs do not continue to grow exponentially.
@@ -376,7 +355,6 @@ Affected Components:
#### Installation
-
##### Improved Node Recovery for Cluster Machines
Cluster nodes can now recover seamlessly after being completely wiped.
@@ -387,7 +365,6 @@ Affected Components:
* {{% ctx %}} App Server Install Scripts
-
##### Improved behaviour when disabling cluster nodes
When a node is disabled, its secondary replicas now correctly become idle secondaries rather than remaining active preventing errors related to minimum replica counts.
@@ -396,7 +373,6 @@ Affected Components:
* {{% ctx %}} App Server Install Scripts
-
##### UTF‑8 encoding support for Non‑ANSI characters in configuration files
{{% ctx %}} now saves key configuration files in UTF‑8, ensuring certificates with non‑ANSI characters are handled correctly during installation and can be read by the [{{% ctx %}} API Gateway Service][].
@@ -405,7 +381,6 @@ Affected Components:
* {{% ctx %}} App Server Install Scripts
-
##### Removal of dependency on Active Directory cmdlets
The `Installation` of [{{% ctx %}} Gateway][Gateway] no longer uses Active Directory cmdlets, removing the need to install the Active Directory PowerShell Module.
@@ -416,7 +391,6 @@ Affected Components:
#### Upgrade
-
##### Backup & Restore Support for Reliable Collections during Single‑Server Upgrades
During a single‑server upgrade, all reliable collection data is now automatically backed up before the upgrade starts, and restored after the upgrade completes, preserving data that would have previously needed to be restored manually.
@@ -425,7 +399,6 @@ Affected Components:
* {{% ctx %}} Upgrade Scripts
-
##### Enhanced pre‑upgrade health checks for Service Fabric and RabbitMQ
Upgrades now stop if Service Fabric or RabbitMQ are not fully healthy. Nodes that are down, in error, or missing from the cluster will prevent an upgrade from happening until they are fixed.
@@ -440,7 +413,6 @@ Affected Components:
#### Capability
-
##### Inability to cancel Data Storage Blocks executions
A bug has been fixed with the [Data Storage Blocks][Data Storage Blocks] where the block execution would hang after an upgrade or restart, without the ability to cancel the execution.
@@ -466,7 +438,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
##### Cleanup executions inside semaphores when execution service starts up
A bug has been fixed where executions remain inside a semaphore (locked forever) when the [{{% ctx %}} Execution Service][] service running those executions stops unexpectedly.
@@ -480,9 +451,6 @@ Affected Components:
* [{{% ctx %}} Innovation Execution Application][]
* [{{% ctx %}} Execution Service][]
-
-
-
##### All token sizes are able to be access protected endpoints
A bug was fixed where given a token with a large amount of roles, then calls to a protected endpoint would fail.
@@ -492,7 +460,6 @@ Affected Components:
* [{{% ctx %}} Innovation Core Application][]
* [{{% ctx %}} Authorisation Service][]
-
##### Editing a process or task from the Manage processes and tasks sometimes fail
A bug was fixed where, within the {{% ctx %}} Interaction Portal, editing a process or task would sometimes fail as the data would not load on the dialog, preventing the user from editing and saving.
@@ -501,13 +468,8 @@ Affected Components:
* {{% ctx %}} Interaction Portal
-
-
-
#### Usability
-
##### Expression editor changes kept when clicking away and back on a block
A bug was fixed where making a change on the expression editor was sometimes lost when clicking on another block then clicking back on the block where the change was made.
@@ -516,7 +478,6 @@ Affected Components:
* [{{% ctx %}} Gateway][Gateway]
-
##### Triggers can be removed after Trigger Service restarts
A bug was fixed where deleting a trigger would silently fail after a restart of the [{{% ctx %}} Triggers Service][].
@@ -526,7 +487,6 @@ Affected Components:
* [{{% ctx %}} Innovation Core Application][]
* [{{% ctx %}} Triggers Service][]
-
##### Listener Service no longer fails the upgrade script when the service does not exist or has not changed between versions
A bug was fixed where upgrade script would fail when upgrading the [{{% ctx %}} Listeners Service][] even when it did not exist or changed between {{% ctx %}} versions.
@@ -537,7 +497,6 @@ Affected Components:
#### Performance
-
##### Reduced memory growth during high‑volume flow execution
A bug was fixed where running a long running parent flow calling a large numbers of child flows would cause a spike in the memory usage.
@@ -556,7 +515,6 @@ Affected Components:
#### Upgrade
-
##### Fingerprint Watcher holds onto Fingerprint Generation folder
A bug was fixed where the Fingerprint Generation folder would sometimes lock during upgrade causing it to fail.
diff --git a/content/en/blog/releases/2026.X/2026.3.md b/content/en/blog/releases/2026.X/2026.3.md
new file mode 100644
index 000000000..5110537b6
--- /dev/null
+++ b/content/en/blog/releases/2026.X/2026.3.md
@@ -0,0 +1,1321 @@
+---
+title: "2026.3"
+linkTitle: "2026.3"
+date: 2026-05-11
+author: Paul Arnold ([@paulmarnold](https://twitter.com/paulmarnold))
+---
+
+## Summary
+
+The 2026.3 [Release][] is now available.
+
+## Download Artefacts
+
+Installation artefacts can be requested by raising a case in the [{{% ctx %}} Service Portal][].
+
+## Release Notes
+
+### Overview
+
+2026.3 is the latest [Release][] of the next generation of {{% ctx %}} and improves on the [2025.9][] release in the following areas:
+
+* Capability
+* Security
+* Performance
+* Usability
+* Scalability
+* Observability
+* Third-Party Support
+* Installation
+* Upgrade
+* Documentation
+
+{{% cr %}}
+This release introduces multiple new features to the {{% ctx %}} Platform:
+
+* [Added ServiceDetails to ExecutionContext][Capability - Added ServiceDetails to ExecutionContext]
+* [Added ability to configure block logging on each block][Capability - Added ability to configure block logging on each block]
+* [Added new flow Settings dialog][Capability - Added new flow Settings dialog]
+* [Improved handling of blank or null expression][Capability - Improved handling of blank or null expression]
+* [Added LDAP Group Filtering for Role Claims][Capability - Added LDAP Group Filtering for Role Claims]
+* [Added support for filtering and opening task by process id][Capability - Added support for filtering and opening task by process id]
+* [Added support for assigning task to users and/or groups][Capability - Added support for assigning task to users and/or groups]
+* [Enhanced the handling of untranslated SNMP v1 Traps][Capability - Enhanced the handling of untranslated SNMP v1 Traps]
+* [Partial Translation for unrecognised SNMP varbinds][Capability - Partial Translation for unrecognised SNMP varbinds]
+* [Attempt Translation of SNMP varbinds that do not end with .0][Capability - Attempt Translation of SNMP varbinds that do not end with .0]
+
+We tightened [Security][] of the platform by:
+
+* [Adding an Encryption Endpoint to {{% ctx %}} API Gateway Service][Security - Added Encryption Endpoint to {{% ctx %}} API Gateway Service]
+* [Adding support for multiple encryption keys][Security - Added support for multiple encryption keys]
+* [Adding the ability to encrypt values in the {{% ctx %}} Configuration Portal][Security - Added the ability to encrypt values in the {{% ctx %}} Configuration Portal]
+* [Introducing Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal][Security - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal]
+* [Delivering general security enhancements][Security - General Security enhancements]
+* [Adding robots.txt exclusions for {{% ctx %}} web applications][Security - Added robots.txt exclusions for {{% ctx %}} web applications]
+
+The [Performance][] of the {{% ctx %}} Platform has been improved by:
+
+* [Improving Execution Service concurrency and flow translation][Performance - Improved Execution Service concurrency and flow translation]
+* [Limiting the batch size of ExecutionCompletionDetails sent to the Monitoring Service][Performance - Limit The batch size of ExecutionCompletionDetails sent to the Monitoring Service]
+* [Improving handling of batch ExecutionCompletionDetails in the Monitoring Service][Performance - Improving handling of batch ExecutionCompletionDetails in the Monitoring Service]
+* [Improving execution handling performance in the Provisioning Service][Performance - Improving execution handling performance in the Provisioning Service]
+
+[Usability][] has been improved with [support for implicit data type conversion in Flow input variables][Usability - Support for implicit data type conversion in Flow input variables] and by [making first-time debug execution start immediately][Usability - Making first-time debug execution start immediately].
+
+[Scalability][] has been increased by [enhancing service lifecycle handling and RabbitMQ outage recovery][Scalability - Enhancing service lifecycle handling and RabbitMQ outage recovery].
+
+[Observability][] has been extended by:
+
+* [Setting a retention period for Grafana Loki][Observability - Set Retention Period for Grafana Loki]
+* [Enabling logs for failed login attempts to {{% ctx %}} Gateway][Observability - Enabling logs for failed login attempts to {{% ctx %}} Gateway]
+* [Adding engine and blocks version display in the {{% ctx %}} Gateway package definitions grid][Observability - Adding engine and blocks version display in the {{% ctx %}} Gateway package definitions grid]
+* [Adding a new Flow Execution Detail dashboard in Grafana][Observability - Adding a new Flow Execution Detail dashboard in Grafana]
+
+[Third-Party Support][] has been improved by:
+
+* [updating NuGet packages][Third-Party Support - Updating NuGet Packages]
+* [upgrading observability stack dependencies][Third-Party Support - Upgrading Observability Stack Dependencies]
+* [updating the SNMP library to support new authentication protocols][Third-Party Support - Updating SNMP Library to Support New Authentication Protocols].
+
+[Installation][] has been improved by:
+
+* [Improving node recovery for cluster machines][Installation - Improved Node Recovery for Cluster Machines]
+* [Improving behaviour when disabling cluster nodes][Installation - Improved behaviour when disabling cluster nodes]
+* [Adding UTF‑8 encoding support for non‑ANSI characters in configuration files][Installation - UTF‑8 encoding support for Non‑ANSI characters in configuration files]
+* [Removing dependency on Active Directory cmdlets][Installation - Removal of dependency on Active Directory cmdlets]
+* [Adding required types to LoggingSettings during upgrade][Installation - Added required types to LoggingSettings during upgrade]
+* [Adding a new node maintenance script for pre-patching operations][Installation - Adding a new node maintenance script for pre-patching operations]
+* [Removing Active Directory cmdlets dependency from Grafana Alloy installation][Installation - Removal of Active Directory cmdlets dependency from Grafana Alloy installation]
+
+[Upgrade][] has been improved by:
+
+* [Adding backup and restore support for reliable collections during single-server upgrades][Upgrade - Backup & Restore Support for Reliable Collections during Single‑Server Upgrades]
+* [Enhancing pre-upgrade health checks for Service Fabric and RabbitMQ][Upgrade - Enhanced pre‑upgrade health checks for Service Fabric and RabbitMQ]
+* [Improving service management during reliable collections backup and restore][Upgrade - Improving service management during reliable collections backup and restore]
+* [Improving Flow migration from CORTEX 7][Upgrade - Improving Flow migration from CORTEX 7]
+
+Finally, [Documentation][] has been [expanded with broader Product Portal][Documentation - Expanded with broader Product Portal] coverage.
+
+### Components
+
+| Release Component | Version (2025.9) | Version (2026.3) | Updated | Update Type | Breaking Change | Notes |
+|--------------------------------------------------------------------------------|------------------|------------------|---------|-------------|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [{{% ctx %}} Innovation Core Application][] | 60.2.2.25440 | 61.1.2.26230 | Yes | Major | No | Major changes occurred between internal development releases, however, these changes are not breaking between 2025.9 and 2026.3 |
+| > [{{% ctx %}} API Gateway Service][] | 42.2.2.25440 | 42.5.1.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Authorisation Service][] | 8.1.5.25440 | 8.4.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Concurrency Management Service][] | 8.0.16.25440 | 8.2.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Configuration Management Service][] | 8.0.13.25440 | 9.0.2.26230 | Yes | Major | No | Major changes occurred between internal development releases, however, these changes are not breaking between 2025.9 and 2026.3 |
+| > [{{% ctx %}} Data Storage Service][] | 10.1.12.25440 | 11.1.1.26230 | Yes | Major | No | Major changes occurred between internal development releases, however, these changes are not breaking between 2025.9 and 2026.3 |
+| > [{{% ctx %}} Execution Management Service][] | 9.1.2.25440 | 9.3.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Licence Management Service][] | 8.1.3.25440 | 8.2.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Listeners Service][] | 5.0.1.25440 | 5.1.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Monitoring Service][] | 5.0.4.25440 | 5.1.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Package Management Service][] | 12.0.21.25440 | 12.1.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Provisioning Service][] | 15.0.22.25440 | 15.2.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Scheduling Service][] | 8.0.24.25440 | 8.1.2.26230 | Yes | Minor | N/A | |
+| > [{{% ctx %}} Triggers Service][] | 12.4.11.25440 | 12.7.3.26230 | Yes | Minor | N/A | |
+| [{{% ctx %}} Innovation Execution Application][] | 29.1.2.25440 | 29.3.8.26230 | Yes | Minor | Potential | Potential breaking changes occurred in this release, related to [adding the ability to configure block logging on each block][Potential Breaking - Added ability to configure block logging on each block] |
+| > [{{% ctx %}} Execution Service][] | 29.1.2.25440 | 29.3.8.26230 | Yes | Minor | Potential | Potential breaking changes occurred in this release, related to [adding the ability to configure block logging on each block][Potential Breaking - Added ability to configure block logging on each block] |
+| [{{% ctx %}} Gateway][Gateway] | 13.25.1.25440 | 13.27.2.26230 | Yes | Minor | N/A | |
+| [{{% ctx %}} Blocks Package][Blocks] | 49.0.4.25430 | 49.2.3.26230 | Yes | Minor | N/A | |
+| [{{% ctx %}} Interaction Portal][Interaction Portal] | 3.3.0.25440 | 4.0.1.26220 | Yes | Major | Yes | Major changes occurred between releases, part of these changes are within the site template which needs manual patching or a re-write of custom UIs, which is [breaking][Breaking - Changes to the {{% ctx %}} Interaction Portal template] |
+| {{% ctx %}} Configuration Portal | 3.0.0.25440 | 4.0.1.26220 | Yes | Major | Potential | Potential breaking changes occurred in this release, related to the [Introduction of Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal][Potential Breaking - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal] |
+| {{% ctx %}} App Server Install Scripts | 5.2.13.25430 | 5.2.15.26220 | Yes | Minor | N/A | |
+| > {{% ctx %}} App Server Backup | 1.0.1.25230 | 1.0.1.25230 | No | N/A | N/A | |
+| > {{% ctx %}} App Server Recovery | 1.0.1.25230 | 1.0.2.25470 | Yes | Patch | N/A | |
+| > {{% ctx %}} App Server Encryption Key Backup | 1.0.0.25210 | 1.0.0.25210 | No | N/A | N/A | |
+| > {{% ctx %}} App Server Encryption Key Recovery | 1.0.0.25210 | 1.0.0.25210 | No | N/A | N/A | |
+| {{% ctx %}} Web App Server Install Scripts | 8.1.6.25250 | 8.1.7.25470 | Yes | Patch | N/A | |
+| > {{% ctx %}} Web App Server Backup | 1.0.1.25230 | 1.0.1.25230 | No | N/A | N/A | |
+| > {{% ctx %}} Web App Server Recovery | 1.0.1.25230 | 1.0.1.25230 | No | N/A | N/A | |
+| {{% ctx %}} Upgrade Scripts | 1.2.23.25420 | 1.2.27.26230 | Yes | Patch | N/A | |
+| {{% ctx %}} Node Maintenance Scripts | N/A | 1.0.0.26230 | N/A | N/A | N/A | |
+| {{% ctx %}} Licence Fingerprint Generator | 5.0.0.25420 | 5.0.1.25470 | Yes | Patch | N/A | |
+| {{% ctx %}} Encryption Key Generator | 2.0.0.24350 | 2.0.0.24350 | No | N/A | N/A | |
+| {{% ctx %}} Encryptor | 3.2.0.25160 | 3.3.0.26140 | Yes | Minor | N/A | |
+| {{% ctx %}} Flows Migration | N/A | 1.1.0.26140 | N/A | N/A | N/A | |
+| {{% ctx %}} Flows Upgrader | 2.1.1.25340 | 2.2.1.26220 | Yes | Minor | N/A | |
+| {{% ctx %}} Observability | 4.1.0 | 5.0.0 | Yes | Major | Yes | Major changes occurred between releases, changes to the Grafana Alloy configuration file has been made, and are [breaking][Breaking - Changes to the Grafana Alloy configuration] |
+
+### Features
+
+#### Capability
+
+##### Added ServiceDetails to ExecutionContext
+
+The `ExecutionContext` now contains the `ServiceDetails`, providing information about the service that the execution is running on, including
+
+* `Name`
+* `Type`
+* `Version`
+* `PartitionId`
+* `ReplicaOrInstanceId`
+* `ProcessId`
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Added ability to configure block logging on each block
+
+All blocks now have a new advanced `Logging` setting that lets you control whether the [Block][Blocks] logs its activity. You can choose to always log by setting the `enabled` property in `Logging` to `true`, to never log by setting it to `false` or to have logging controlled by
+the block logging API setting by leaving it blank or setting it to `null`.
+Variables can also be used to set the `enabled` value, allowing you to dynamically turn logging on or off at runtime.
+
+{{% alert title="Warning" color="warning" %}}This requires existing Flows to be upgraded.{{< /alert >}}
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Added new flow Settings dialog
+
+A new `Settings` dialog has been added to the Flow editor, providing a dedicated space for configuring various flow‑level settings.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Improved handling of blank or null expression
+
+When using the expressions inside block properties, leaving an inner property blank or null could previously cause a translation error if {{% ctx %}} could not determine the correct default type.
+To prevent this, {{% ctx %}} now automatically inspects the parent type and works out the appropriate default type during translation.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Package Management Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Added LDAP Group Filtering for Role Claims
+
+The [{{% ctx %}} Authorisation Service][] now includes a new optional setting, `DistinguishedNameFilter`, in its `LdapAuthSettings`. This setting allows you to control which LDAP groups are included in a user’s role claims.
+If a regular expression is provided in DistinguishedNameFilter, only group names that match this pattern will be added to the user’s role claims.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Authorisation Service][]
+
+##### Added support for filtering and opening task by process id
+
+Support was added for filtering the Process Dashboard by providing the `ProcessId` as a query parameter (e.g `https://server.domain.com/cortexinteractionportal?ProcessID=ae40ced8-9a81-4c46-af85-f5ba35f48169`).
+You can now also open a task by `ProcessId` using the `Open` query parameter (e.g `https://server.domain.com/cortexinteractionportal?ProcessID=ae40ced8-9a81-4c46-af85-f5ba35f48169&Open=true`)
+
+Affected Components:
+
+* {{% ctx %}} Interaction Portal
+
+##### Added support for assigning task to users and/or groups
+
+Tasks can now be assigned to users and/or groups.
+If the user has been assigned a task, or is part of a group assigned to, the task will visible in the Pending tasks page.
+
+Affected Components:
+
+* {{% ctx %}} Interaction Portal
+
+##### Enhanced the handling of untranslated SNMP v1 Traps
+
+For SNMP v1 traps without a matching MIB, {{% ctx %}} now extracts trap details directly from the trap OID when the `GenericTrapType` is valid (0–6).
+In these cases, the `GenericTrapType`, `SpecificTrapType`, and `EnterpriseId` are populated automatically.
+If the value is outside the valid range, these fields are set to null to avoid incorrect data.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Triggers Service][]
+
+##### Partial Translation for unrecognised SNMP varbinds
+
+{{% ctx %}} now attempts to partially translate SNMP varbinds when a full translation isn’t possible.
+If the MIB contains a valid `FilePath`, the known part of the varbind is translated and the remaining unmatched section is left as‑is.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Triggers Service][]
+
+##### Attempt Translation of SNMP varbinds that do not end with .0
+
+When one or more varbinds in an SNMP trap cannot be translated because no matching MIB node is found, {{% ctx %}} now retries translation after appending `.0` to the end of the varbind OID. If a matching MIB node exists for the amended OID, the varbind is translated; otherwise, it remains untranslated.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Triggers Service][]
+
+#### Security
+
+##### Added Encryption Endpoint to {{% ctx %}} API Gateway Service
+
+The [{{% ctx %}} API Gateway Service][] now exposes a new API endpoint to encrypt user data.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Listeners Service][]
+
+##### Added support for multiple encryption keys
+
+Support has been added for specifying multiple encryption keys, allowing Dev, Test and Prod environments to encrypt data using their own key, whilst being able to decrypt data encrypted in one of the other environments.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Added the ability to encrypt values in the {{% ctx %}} Configuration Portal
+
+You can now securely encrypt parameter values directly when adding them to a container.
+A new encryptor tool lets you enter text, encrypt it using the new encryption endpoint, and automatically copy the encrypted value to your clipboard.
+
+Affected Components:
+
+* {{% ctx %}} Configuration Portal
+
+##### Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal
+
+Role‑based access control has been added to container management, making it easier to control who can create, view, edit, delete, import, and export containers.
+
+Affected Components:
+
+* {{% ctx %}} Configuration Portal
+
+##### General Security enhancements
+
+Some general security enhancements has been made to the {{% ctx %}} Platform.
+For further information, please raise a case in the [{{% ctx %}} Service Portal][].
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+
+##### Added robots.txt exclusions for {{% ctx %}} web applications
+
+Robots.txt exclusions have been added to all {{% ctx %}} web applications to prevent them from being indexed by search engines, improving security by reducing the attack surface.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* {{% ctx %}} Configuration Portal
+* {{% ctx %}} Interaction Portal
+
+#### Performance
+
+##### Improved Execution Service concurrency and flow translation
+
+The [{{% ctx %}} Execution Service][] now uses semaphores to ensure the same flow isn't translated multiple times when executed concurrently for the first time.
+Additionally, various performance optimisations have been made within the service.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Limit the batch size of ExecutionCompletionDetails sent to the Monitoring Service
+
+The [{{% ctx %}} Execution Management Service][] now limits the batch size of execution completion events, reducing inter‑service traffic.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Improved handling of batch ExecutionCompletionDetails in the Monitoring Service
+
+The [{{% ctx %}} Monitoring Service][] now processes execution completion events in batches, improving performance and scalability when handling large volumes of events.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Monitoring Service][]
+
+##### Improved execution handling performance in the Provisioning Service
+
+The [{{% ctx %}} Provisioning Service][] now caches Execution Service health information for up to 1 second when handling start execution messages. This reduces repeated calls to the Service Fabric client, and under heavy load concurrent requests now reuse the same cached value instead of each retrieving the health state independently. These changes improve throughput and reduce queue build-up during high-volume execution starts.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Usability
+
+##### Added support for use of implicit data type conversion in Flow input variables
+
+When using Flow input variables, the data type can now be implicitly calculated based on the value provided, rather than defaulting to object. This is enabled by default on new flows, and can be enabled on an existing flow from the flow Settings dialog by ticking `Use implicit data type conversion` under `Translation` -> `Input Properties`.
+
+Affected Components:
+
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Execution now starts on first debug
+
+When debugging a flow for the first time, on a clean install or upgrade, the debug will now start the execution instead of providing a message saying that the Execution service is being provisioned.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Scalability
+
+##### Improved service lifecycle handling and RabbitMQ outage recovery
+
+Service and communication listener lifecycle handling has been improved to make service startup, shutdown, and role changes more reliable.
+If RabbitMQ becomes unavailable, outgoing messages are paused and a health error is shown on the affected replica or instance. When connectivity is restored, message processing resumes automatically and the health error is cleared.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Observability
+
+##### Set retention period for Grafana Loki
+
+Added a retention period to Grafana Loki to ensure that Logs do not continue to grow exponentially.
+Previously logs were kept indefinitely in Grafana Loki and this would have consumed vast amounts of disk space.
+The retention period is configurable based on the retention that is required, with the default set to 12 months.
+
+Affected Components:
+
+* {{% ctx %}} Observability
+
+##### Enabled logs for failed login attempts to {{% ctx %}} Gateway
+
+[{{% ctx %}} Gateway][Gateway] now logs failed login attempts, providing better visibility into authentication issues and potential security threats.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Added display of engine and blocks version in {{% ctx %}} Gateway package definitions grid
+
+The [package definitions grid][] in the [{{% ctx %}} Gateway][Gateway] now includes a new `Engine/Blocks Version` column, which is hidden by default, and can be enabled using the menu icon.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Added new Flow Execution Detail dashboard in Grafana
+
+A new Flow Execution Detail dashboard has been added to Grafana. You can filter and select flow executions to view all linked block executions, including other executions in the execution chain by Trace ID. Block properties are viewable and downloadable, and [{{% ctx %}} Gateway][Gateway] URLs to each block are provided.
+
+Affected Components:
+
+* {{% ctx %}} Observability
+
+#### Third-Party Support
+
+##### Updated third‑party packages
+
+NuGet packages have been updated to their latest versions.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Upgraded observability third‑party components
+
+All third‑party components used in the observability stack have been upgraded.
+
+Affected Components:
+
+* {{% ctx %}} Observability
+
+##### Updated SNMP library to support new authentication protocols
+
+The SNMP library used by {{% ctx %}} has been updated to the latest version, which includes support for new authentication protocols.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Triggers Service][]
+
+#### Installation
+
+##### Improved Node Recovery for Cluster Machines
+
+Cluster nodes can now recover seamlessly after being completely wiped.
+Running the new script on the wiped machine will ensure it automatically rejoins both the `RabbitMQ` cluster and the [Service Fabric][Service Fabric] cluster without requiring manual intervention.
+This ensures faster, more reliable recovery and reduces operational overhead during node restoration.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### Improved behaviour when disabling cluster nodes
+
+When a node is disabled, its secondary replicas now correctly become idle secondaries rather than remaining active preventing errors related to minimum replica counts.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### UTF‑8 encoding support for Non‑ANSI characters in configuration files
+
+{{% ctx %}} now saves key configuration files in UTF‑8, ensuring certificates with non‑ANSI characters are handled correctly during installation and can be read by the [{{% ctx %}} API Gateway Service][].
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### Removal of dependency on Active Directory cmdlets
+
+The `Installation` of [{{% ctx %}} Gateway][Gateway] no longer uses Active Directory cmdlets, removing the need to install the Active Directory PowerShell Module.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### Added required types to LoggingSettings during upgrade
+
+When upgrading the [{{% ctx %}} Execution Service][], the new `Cortex.FlowEngine.Core.Logging.LoggingSettings` required type is automatically added to the list of required types in the service's `appsettings.json` file. This ensures that the whitelist analyser correctly recognises the type when processing execution packages during and after the upgrade.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+* {{% ctx %}} Web App Server Install Scripts
+
+##### Added Node Maintenance script for pre-patching operations
+
+A new `Cortex.Node.Maintenance.ps1` script has been added to streamline server maintenance operations. This script safely prepares a node for patching by sequentially:
+
+* Deactivating the Service Fabric node
+* Putting RabbitMQ into maintenance mode
+* Stopping the RabbitMQ service
+* Optionally restarting the machine (use the `-Restart` parameter to enable automatic restart)
+
+Running the script without the `-Restart` parameter will perform all maintenance steps while leaving the machine running, allowing for other pre-patching operations or manual verification. Use the `-Restart` parameter when you're ready to restart the machine after maintenance completion.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+* {{% ctx %}} Node Maintenance Scripts
+
+##### Removal of Active Directory cmdlets dependency from Grafana Alloy installation
+
+The PowerShell install scripts for Grafana Alloy no longer require the Active Directory PowerShell module to be installed on the server. The scripts can now independently test the service user account and configure local security policy settings without relying on AD cmdlets, whether or not they are already present on the system. This simplifies the installation process and reduces prerequisite dependencies for the {{% ctx %}} Observability stack.
+
+Affected Components:
+
+* {{% ctx %}} Observability
+
+#### Upgrade
+
+##### Backup & Restore Support for Reliable Collections during Single‑Server Upgrades
+
+During a single‑server upgrade, all reliable collection data is now automatically backed up before the upgrade starts, and restored after the upgrade completes, preserving data that would have previously needed to be restored manually.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+##### Enhanced pre‑upgrade health checks for Service Fabric and RabbitMQ
+
+Upgrades now stop if Service Fabric or RabbitMQ are not fully healthy. Nodes that are down, in error, or missing from the cluster will prevent an upgrade from happening until they are fixed.
+RabbitMQ queues are also checked, with automatic fixes for missing members and noproc states.
+If error queues contain messages, you’ll be prompted to review or automatically export and clear them before continuing.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+##### Improved service management during reliable collections backup and restore
+
+During single-server upgrades, the upgrade process now appropriately manages dependent services to ensure data consistency and prevent errors during the backup and restore of reliable collections.
+The [{{% ctx %}} API Gateway Service][] is automatically removed before the backup starts and recreated after the restore completes.
+If the [{{% ctx %}} Listeners Service][] was present before the backup, it is similarly removed and then recreated.
+The [{{% ctx %}} Triggers Service][] is recreated before the restore to ensure proper initialization. This service orchestration prevents transient errors and ensures a smoother upgrade experience.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+##### Improved Flow migration from CORTEX 7
+
+The Flow Migrator has been enhanced to properly handle additional properties and blocks when migrating flows from CORTEX 7 to {{% ctx %}}.
+Missing properties are now correctly added during migration, and previously unmigrated blocks including Extract Regex, HandleFlowException, and RemoveItem are now properly migrated.
+This ensures that complex flows from CORTEX 7 are more completely and accurately converted to the new platform.
+
+Affected Components:
+
+* {{% ctx %}} Flows Migration
+
+#### Documentation
+
+##### Expanded Product Portal documentation coverage
+
+Documentation in the Product Portal has been expanded with new and updated guidance across [authentication][User Guide - Authentication] and [authorisation][User Guide - Authorisation], [Gateway setup][Tutorial - Gateway Setup], [Variable Editor usage][Reference - Variable Editor], and [running execution changes][User Guide - Package Version Editor Running Executions].
+The [Package Version Editor][User Guide - Package Version Editor] documentation now includes [MIB and SNMP Trap details][User Guide - Package Version Editor Triggers].
+
+### Bug Fixes
+
+#### Capability
+
+##### Inability to cancel Data Storage Blocks executions
+
+A bug has been fixed with the [Data Storage Blocks][Data Storage Blocks] where the block execution would hang after an upgrade or restart, without the ability to cancel the execution.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Cleanup executions inside semaphores when execution service starts up
+
+A bug has been fixed where executions remain inside a semaphore (locked forever) when the [{{% ctx %}} Execution Service][] service running those executions stops unexpectedly.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### All token sizes are able to be access protected endpoints
+
+A bug was fixed where given a token with a large amount of roles, then calls to a protected endpoint would fail.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Authorisation Service][]
+
+##### Editing a process or task from the Manage processes and tasks sometimes fail
+
+A bug was fixed where, within the {{% ctx %}} Interaction Portal, editing a process or task would sometimes fail as the data would not load on the dialog, preventing the user from editing and saving.
+
+Affected Components:
+
+* {{% ctx %}} Interaction Portal
+
+##### Persisted execution details with null run details are now cleaned up on service startup
+
+A bug was fixed where the [{{% ctx %}} Execution Management Service][] could throw a null reference exception while handling [{{% ctx %}} Execution Service][] startup events.
+As a precaution, when startup events are handled, any persisted execution details found in the reliable collection with null `RunDetails` are now removed.
+These entries are considered stale and should not remain in persisted execution data.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Execution Management Service][]
+
+##### Fixed null reference exceptions when setting authorisation headers in Triggers and Scheduling services
+
+A bug was fixed where sending HTTP requests from the [{{% ctx %}} Triggers Service][] or [{{% ctx %}} Scheduling Service][] could intermittently throw a null reference exception while setting authorisation headers.
+Authorisation is now applied per request instead of mutating client `DefaultRequestHeaders`, avoiding unsafe concurrent header updates.
+
+Existing credential behaviour has been preserved:
+
+* Credentials are fetched once from the [{{% ctx %}} Authorisation Service][] and reused until invalidated.
+* After a `BasicAuthCredentialsInvalidatedEvent` is received, fresh credentials are fetched on the next HTTP request.
+* If a large number of requests arrive after invalidation, only a single auth header refresh request is made to the [{{% ctx %}} Authorisation Service][].
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+
+#### Usability
+
+##### Expression editor changes kept when clicking away and back on a block
+
+A bug was fixed where making a change on the expression editor was sometimes lost when clicking on another block then clicking back on the block where the change was made.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Triggers can be removed after Trigger Service restarts
+
+A bug was fixed where deleting a trigger would silently fail after a restart of the [{{% ctx %}} Triggers Service][].
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Triggers Service][]
+
+##### Listener Service no longer fails the upgrade script when the service does not exist or has not changed between versions
+
+A bug was fixed where upgrade script would fail when upgrading the [{{% ctx %}} Listeners Service][] even when it did not exist or changed between {{% ctx %}} versions.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### Fixed pattern matching with backslashes and wildcards in Search File blocks
+
+A bug was fixed in the [Search File][Blocks - Search File] and [Search Files][Blocks - Search Files] blocks where pattern matching with an odd number of backslashes followed by wildcard characters (`*` or `?`) would not work correctly.
+
+The pattern matching now correctly interprets backslashes as follows:
+
+* **Odd number of backslashes before a wildcard**: The escaped wildcard is treated as a literal character. For example:
+ * `@"\*"` matches a literal `*` character (e.g., `hello world *`)
+ * `@"\\\*"` matches `\\` followed by a literal `*` character (e.g., `C:\\*.txt`)
+
+* **Even number of backslashes before a wildcard**: The backslashes are preserved and the wildcard pattern is applied. For example:
+ * `@"\\*"` matches `\\` followed by any characters (e.g., `C:\\helloWorld\\myFile.txt`)
+ * `@"\\\\*"` matches `\\\\` followed by any characters (e.g., `C:\\\\helloWorld\\\\myFile.txt`)
+
+Affected Components:
+
+* [{{% ctx %}} Block Packages][Blocks]
+
+##### Fixed Gateway startup crash when HelpLinkConfiguration.json is being written to
+
+A bug was fixed where [{{% ctx %}} Gateway][Gateway] could crash on startup if `HelpLinkConfiguration.json` was being written to at the same time.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Improved error reporting when imported flow group parent is missing
+
+A bug was fixed where importing a `.flowgroup` file with a `ParentId` that does not exist could fail without a clear diagnostic message.
+When the import selection page is opened, {{% ctx %}} now logs and reports the following message in both the `cortex.gateway` log file and the browser dev tools console:
+
+`Parent flow group for group {groupName} with the Id {importGroup.Id} can't be found. Parent id is {importGroup.ParentId}`
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Fixed endless throbber when session has timed out in {{% ctx %}} Interaction Portal
+
+A bug was fixed where, if a user had logged in and their `access_token` later became invalid, refreshing the page could leave the {{% ctx %}} Interaction Portal stuck on an endless loading throbber.
+On page refresh with an invalid token, the user is now redirected back to the login page.
+
+Affected Components:
+
+* {{% ctx %}} Interaction Portal
+
+##### Fixed encrypted text detection when key name is exactly 5 characters
+
+A bug was fixed where encrypted text detection could fail when the `KeyName` length was exactly 5 characters.
+Text can now be encrypted and decrypted successfully.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Security
+
+##### Improved security and reliability of authentication handling
+
+Security-related fixes have been applied to authentication and message handling to improve reliability and reduce the risk of incorrect token usage or inconsistent sign-in/sign-out behaviour.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} Authorisation Service][]
+
+#### Scalability
+
+##### Fixed KeyNotFoundException appearing in API Gateway Service error queue after service restart
+
+A bug was fixed where, if a flow was running and the [{{% ctx %}} API Gateway Service][] was restarted (e.g. deleted and recreated, or the process was killed), stopping the flow would cause a `KeyNotFoundException` to appear in the [{{% ctx %}} API Gateway Service][] error queue.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Fixed cache invalidation on reliable collection restore
+
+A bug was fixed where the cache could become invalid and values could not be retrieved after restoring reliable collections from a backup.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Data Storage Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Observability
+
+##### Fixed ObjectDisposedException when certificate subject name is invalid
+
+A bug was fixed where restarting the [{{% ctx %}} API Gateway Service][] with an invalid `CertificateSubjectName` would throw an `ObjectDisposedException` ("Cannot access a disposed object") instead of the expected warning message about no suitable certificate being found to secure the endpoint.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+
+##### Fixed registry monitor errors when encryption registry key is not present
+
+A bug was fixed where the system would continuously log registry monitor errors every 1 second when the encryption registry key was not present on the system. The error message "The system cannot find the file specified" is now suppressed as this is expected behaviour when the key does not exist.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Authorisation Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+ * [{{% ctx %}} Data Storage Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Licence Management Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Fixed execution duration calculation in BST time zone
+
+A bug was fixed where the execution duration would incorrectly add an extra 3600 seconds (1 hour) when the server was in British Summer Time (BST). Execution durations are now calculated correctly regardless of the time zone.
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Monitoring Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Performance
+
+##### Reduced memory growth during high‑volume flow execution
+
+A bug was fixed where running a long running parent flow calling a large numbers of child flows would cause a spike in the memory usage.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Block Packages][Blocks]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Concurrency Management Service][]
+ * [{{% ctx %}} Execution Management Service][]
+ * [{{% ctx %}} Package Management Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Upgrade
+
+##### Fingerprint Watcher holds onto Fingerprint Generation folder
+
+A bug was fixed where the Fingerprint Generation folder would sometimes lock during upgrade causing it to fail.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Licence Management Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+* {{% ctx %}} App Server Install Scripts
+* {{% ctx %}} Licence Fingerprint Generator
+
+##### Fixed RabbitMQ error message export during upgrade when certificate lacks localhost in SANs
+
+A bug was fixed where exporting RabbitMQ error messages during pre-upgrade checks would fail if the certificate did not have localhost in its Subject Alternative Names (SANs). The upgrade process now successfully exports messages even when selecting "N" for manual export during pre-upgrade checks, regardless of the certificate configuration.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+### Deprecated Features
+
+There are no features deprecated as part of the 2026.3 release of the {{% ctx %}} Platform.
+
+### Removed Features
+
+There are no features removed in the 2026.3 release of the {{% ctx %}} Platform.
+
+### Potential Breaking Changes
+
+##### Added ability to configure block logging on each block
+
+As part of adding the [ability to configure block logging on each block][Capability - Added ability to configure block logging on each block] the values recorded in block logs have been updated.
+If you have custom reporting that relies on these exact log fields, you may need to update them.
+
+* Previous log values:
+ * Method: `Cortex.FlowEngine.Execution.ExecutionThread.ExecuteNextBlock`
+ * Type: `ExecuteNextBlock`
+* New log values
+ * Method: `Cortex.FlowEngine.Core.Blocks.Block.Execute`
+ * Type: `Execute`
+
+##### Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal
+
+As part of [introducing Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal][Security - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal], both configuration portal
+website and flows have been modified, and require updating to work together.
+
+### Breaking Changes
+
+#### Changes to the {{% ctx %}} Interaction Portal template
+
+The {{% ctx %}} Interaction Portal template has been updated to a new version which includes changes to the underlying code.
+If you use {{% ctx %}} Interaction Portal, you will need to manually patch the changes, which includes, but is not limited to:
+
+* [Added support for filtering and opening task by process id][Capability - Added support for filtering and opening task by process id]
+* [Added support for assigning task to users and/or groups][Capability - Added support for assigning task to users and/or groups]
+* [Fixing editing a process or task from the Manage processes and tasks sometimes fail][Capability - Fixing editing a process or task from the Manage processes and tasks sometimes fail]
+* [Fixing endless throbber when session has timed out][Capability - Fixed endless throbber when session has timed out in {{% ctx %}} Interaction Portal]
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+#### Changes to the Grafana Alloy configuration
+
+Changes has been made to the Grafana Alloy configuration as part of the [upgrade of observability third‑party components][Observability - Upgrade of observability third‑party components], which will require you to update your existing Grafana Alloy configuration if you are using a version of {{% ctx %}} Observability prior to 2026.3.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+### Known Limitations
+
+There are no known limitations added as part of the 2026.3 release of the {{% ctx %}} Platform.
+
+## Version Support
+
+### Operating Systems
+
+| OS Type | Supported Versions |
+|---------|---------------------------------------------------|
+| Windows |
Server 2019
Server 2022
|
+| Linux | Linux is not currently supported |
+
+### 7.X Compatibility
+
+| 7.X Version | Is compatible? | Notes |
+|-------------|----------------|----------------------------------------------|
+| 7.3 | Yes | |
+| 7.2 | Yes | |
+| 7.1 | No | Need to upgrade 7.1 to 7.2 for compatibility |
+| 7.0 | No | Need to upgrade 7.0 to 7.2 for compatibility |
+
+### Flow Compatibility
+
+| Release | Compatibility Version |
+|--------------|-----------------------|
+| 2026.3 | 32.25451 |
+| 2025.9.26161 | 32.25451 |
+| 2025.9 | 32.25320 |
+| 2025.7 | 32.25320 |
+| 2025.5 | 31.24311 |
+| 2025.3.26111 | 31.25441 |
+| 2025.3 | 31.24311 |
+| 2025.1 | 31.24311 |
+| 2024.11 | 31.24311 |
+| 2024.9 | 31.24311 |
+| 2024.7 | 31.24311 |
+| 2024.5 | 31.24311 |
+| 2024.3 | 30 |
+
+### Observability Compatibility
+
+| Release | Grafana Version | Grafana Loki Version | Grafana Alloy | {{% ctx %}} Observability Version |
+|--------------|--------------------------|----------------------|------------------------|-------------------------------------------|
+| 2026.3 | [13.0.1][Grafana 13.0.1] | [3.7.1][Loki 3.7.1] | [1.15.1][Alloy 1.15.1] | [5.0.0][Observability 5.0.0] |
+| 2025.9.26161 | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.2.1][Observability 4.2.1] |
+| | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.2.0][Observability 4.2.0] |
+| | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.1.0][Observability 4.1.0] |
+| 2025.9 | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.1.0][Observability 4.1.0] |
+| 2025.7 | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.0.0][Observability 4.0.0] |
+| 2025.3.26111 | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.2.0][Observability 4.2.0] |
+| | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.1.0][Observability 4.1.0] |
+| | [12.1.1][Grafana 12.1.1] | [3.5.5][Loki 3.5.5] | [1.10.2][Alloy 1.10.2] | [4.0.0][Observability 4.0.0] |
+| | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2025.3 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2025.1 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2024.11 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2024.9 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2024.7 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2024.5 | [10.4.1][Grafana 10.4.1] | [3.0.0][Loki 3.0.0] | N/A | [3.0.0][Observability 3.0.0] (deprecated) |
+| 2024.3 | [8.5.4][Grafana 8.5.4] | [2.5.0][Loki 2.5.0] | N/A | [2.2.0][Observability 2.2.0] (deprecated) |
+
+## Install Instructions
+
+If you are installing a new 2026.3 platform or adding it to an existing {{% ctx %}} 7 Installation see the guidance below; otherwise, if you are upgrading from an existing 2025.3.26111 or 2025.9.26161 platform refer to the [Upgrade Instructions][].
+
+Installing {{% ctx %}} Only:
+
+* [Multiple Server - With HA][Innovation Only - Multiple Server - With HA]
+* [Single Server - Without HA][Innovation Only - Single Server - Without HA]
+
+Adding {{% ctx %}} to a {{% ctx %}} 7 Installation:
+
+* [Multiple Server - With HA][Adding Innovation to a 7.2 Installation - Multiple Server - With HA]
+* [Single Server - Without HA][Adding Innovation to a 7.2 Installation - Single Server - Without HA]
+
+## Upgrade Instructions
+
+If you are upgrading from an existing 2025.3.26111 or 2025.9.26161 platform see the guidance below:
+
+Upgrading {{% ctx %}} from 2025.3.26111:
+
+* [Multiple Server - With HA][Upgrade - Multiple Server - With HA - From 2025.3.26111]
+* [Single Server - Without HA][Upgrade - Single Server - Without HA - From 2025.3.26111]
+
+Upgrading {{% ctx %}} from 2025.9.26161:
+
+* [Multiple Server - With HA][Upgrade - Multiple Server - With HA - From 2025.9.26161]
+* [Single Server - Without HA][Upgrade - Single Server - Without HA - From 2025.9.26161]
+
+## Upcoming Releases
+
+Releases are currently forecast to be made available on:
+
+| Release | Release Type | Forecast Release Date |
+|---------|--------------|-----------------------------------|
+| 2026.9 | [Release][] | Week commencing 19th October 2026 |
+
+[{{% ctx %}} Innovation Core Application]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.MainDoc" version="2026.3" >}}
+[{{% ctx %}} API Gateway Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Authorisation Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.AuthorisationService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Concurrency Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ConcurrencyManagementService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Configuration Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ConfigurationManagementService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Data Storage Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Execution Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ExecutionManagementService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Licence Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.LicenceManagementService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Listeners Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ListenersService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Monitoring Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.MonitoringService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Package Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.PackageManagementService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Provisioning Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ProvisioningService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Scheduling Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.SchedulingService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Triggers Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.TriggersService.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Innovation Execution Application]: {{< url path="Cortex.Guides.CortexInnovation.ExecutionApplication.MainDoc" version="2026.3" >}}
+[{{% ctx %}} Execution Service]: {{< url path="Cortex.Guides.CortexInnovation.ExecutionApplication.Services.ExecutionService.MainDoc" version="2026.3" >}}
+[Interaction Portal]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.CortexInteractionPortal.MainDoc" version="2026.3" >}}
+
+[package definitions grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.MainDoc" version="2026.3" >}}
+
+[User Guide - Authentication]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Authentication.MainDoc" version="2026.3" >}}
+[User Guide - Authorisation]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Authorisation.MainDoc" version="2026.3" >}}
+[Tutorial - Gateway Setup]: {{< url path="Cortex.Tutorials.Setup.SetupGateway.InitialSetup" version="2026.3" >}}
+[Reference - Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" version="2026.3" >}}
+[User Guide - Package Version Editor Running Executions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.RunningExecutions" version="2026.3" >}}
+[User Guide - Package Version Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.MainDoc" version="2026.3" >}}
+[User Guide - Package Version Editor Triggers]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Triggers" version="2026.3" >}}
+
+[Upgrade Instructions]: {{< ref "#upgrade-instructions" >}}
+
+[Innovation Only - Single Server - Without HA]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.MainDoc" version="2026.3" >}}
+[Innovation Only - Multiple Server - With HA]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.MainDoc" version="2026.3" >}}
+
+[Adding Innovation to a 7.2 Installation - Single Server - Without HA]: {{< url path="Cortex.GettingStarted.OnPremise.AddInnovationTo72.SingleServerWithoutHA.MainDoc" version="2026.3" >}}
+[Adding Innovation to a 7.2 Installation - Multiple Server - With HA]: {{< url path="Cortex.GettingStarted.OnPremise.AddInnovationTo72.MultipleServerWithHA.MainDoc" version="2026.3" >}}
+
+[Upgrade - Single Server - Without HA - From 2025.9.26161]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.MainDoc" version="2026.3" >}}
+[Upgrade - Multiple Server - With HA - From 2025.9.26161]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.MainDoc" version="2026.3" >}}
+[Upgrade - Single Server - Without HA - From 2025.3.26111]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.MainDoc" version="2026.3" >}}
+[Upgrade - Multiple Server - With HA - From 2025.3.26111]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.MainDoc" version="2026.3" >}}
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" version="2026.3" >}}
+
+[Capability - Added ServiceDetails to ExecutionContext]: {{< ref "#added-servicedetails-to-executioncontext" >}}
+[Capability - Added ability to configure block logging on each block]: {{< ref "#added-ability-to-configure-block-logging-on-each-block" >}}
+[Capability - Added new flow Settings dialog]: {{< ref "#added-new-flow-settings-dialog" >}}
+[Capability - Improved handling of blank or null expression]: {{< ref "#improved-handling-of-blank-or-null-expression" >}}
+[Capability - Added LDAP Group Filtering for Role Claims]: {{< ref "#added-ldap-group-filtering-for-role-claims" >}}
+[Capability - Added support for filtering and opening task by process id]: {{< ref "#added-support-for-filtering-and-opening-task-by-process-id" >}}
+[Capability - Added support for assigning task to users and/or groups]: {{< ref "#added-support-for-assigning-task-to-users-andor-groups" >}}
+[Capability - Enhanced the handling of untranslated SNMP v1 Traps]: {{< ref "#enhanced-the-handling-of-untranslated-snmp-v1-traps" >}}
+[Capability - Partial Translation for unrecognised SNMP varbinds]: {{< ref "#partial-translation-for-unrecognised-snmp-varbinds" >}}
+[Capability - Attempt Translation of SNMP varbinds that do not end with .0]: {{< ref "#attempt-translation-of-snmp-varbinds-that-do-not-end-with-0" >}}
+[Capability - Fixing editing a process or task from the Manage processes and tasks sometimes fail]: {{< ref "#editing-a-process-or-task-from-the-manage-processes-and-tasks-sometimes-fail" >}}
+[Capability - Fixed endless throbber when session has timed out in {{% ctx %}} Interaction Portal]: {{< ref "#fixed-endless-throbber-when-session-has-timed-out-in-cortex-interaction-portal" >}}
+
+[Security]: {{< ref "#security" >}}
+[Security - Added Encryption Endpoint to {{% ctx %}} API Gateway Service]: {{< ref "#added-encryption-endpoint-to-cortex-api-gateway-service" >}}
+[Security - Added support for multiple encryption keys]: {{< ref "#added-support-for-multiple-encryption-keys" >}}
+[Security - Added the ability to encrypt values in the {{% ctx %}} Configuration Portal]: {{< ref "#added-the-ability-to-encrypt-values-in-the-cortex-configuration-portal" >}}
+[Security - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal]: {{< ref "#introduced-rolebased-access-control-for-containers-in-the-cortex-configuration-portal" >}}
+[Security - General Security enhancements]: {{< ref "#general-security-enhancements" >}}
+[Security - Added robots.txt exclusions for {{% ctx %}} web applications]: {{< ref "#added-robotstxt-exclusions-for-cortex-web-applications" >}}
+
+[Performance]: {{< ref "#performance" >}}
+[Performance - Improved Execution Service concurrency and flow translation]: {{< ref "#improved-execution-service-concurrency-and-flow-translation" >}}
+[Performance - Limit The batch size of ExecutionCompletionDetails sent to the Monitoring Service]: {{< ref "#limit-the-batch-size-of-executioncompletiondetails-sent-to-the-monitoring-service" >}}
+[Performance - Improving handling of batch ExecutionCompletionDetails in the Monitoring Service]: {{< ref "#improved-handling-of-batch-executioncompletiondetails-in-the-monitoring-service" >}}
+[Performance - Improving execution handling performance in the Provisioning Service]: {{< ref "#improved-execution-handling-performance-in-the-provisioning-service" >}}
+
+[Usability]: {{< ref "#usability" >}}
+[Usability - Support for implicit data type conversion in Flow input variables]: {{< ref "#added-support-for-use-of-implicit-data-type-conversion-in-flow-input-variables" >}}
+[Usability - Making first-time debug execution start immediately]: {{< ref "#execution-now-starts-on-first-debug" >}}
+
+[Scalability]: {{< ref "#scalability" >}}
+[Scalability - Enhancing service lifecycle handling and RabbitMQ outage recovery]: {{< ref "#improved-service-lifecycle-handling-and-rabbitmq-outage-recovery" >}}
+
+[Observability]: {{< ref "#observability" >}}
+[Observability - Set Retention Period for Grafana Loki]: {{< ref "#set-retention-period-for-grafana-loki" >}}
+[Observability - Enabling logs for failed login attempts to {{% ctx %}} Gateway]: {{< ref "#enabled-logs-for-failed-login-attempts-to-cortex-gateway" >}}
+[Observability - Adding engine and blocks version display in the {{% ctx %}} Gateway package definitions grid]: {{< ref "#added-display-of-engine-and-blocks-version-in-cortex-gateway-package-definitions-grid" >}}
+[Observability - Adding a new Flow Execution Detail dashboard in Grafana]: {{< ref "#added-new-flow-execution-detail-dashboard-in-grafana" >}}
+[Observability - Upgrade of observability third‑party components]: {{< ref "#upgraded-observability-thirdparty-components" >}}
+
+[Third-Party Support]: {{< ref "#third-party-support" >}}
+[Third-Party Support - Updating NuGet Packages]: {{< ref "#updated-thirdparty-packages" >}}
+[Third-Party Support - Upgrading Observability Stack Dependencies]: {{< ref "#upgraded-observability-thirdparty-components" >}}
+[Third-Party Support - Updating SNMP Library to Support New Authentication Protocols]: {{< ref "#updated-snmp-library-to-support-new-authentication-protocols" >}}
+
+[Installation]: {{< ref "#installation" >}}
+[Installation - Improved Node Recovery for Cluster Machines]: {{< ref "#improved-node-recovery-for-cluster-machines" >}}
+[Installation - Improved behaviour when disabling cluster nodes]: {{< ref "#improved-behaviour-when-disabling-cluster-nodes" >}}
+[Installation - UTF‑8 encoding support for Non‑ANSI characters in configuration files]: {{< ref "#utf8-encoding-support-for-nonansi-characters-in-configuration-files" >}}
+[Installation - Removal of dependency on Active Directory cmdlets]: {{< ref "#removal-of-dependency-on-active-directory-cmdlets" >}}
+[Installation - Added required types to LoggingSettings during upgrade]: {{< ref "#added-required-types-to-loggingsettings-during-upgrade" >}}
+[Installation - Adding a new node maintenance script for pre-patching operations]: {{< ref "#added-node-maintenance-script-for-pre-patching-operations" >}}
+[Installation - Removal of Active Directory cmdlets dependency from Grafana Alloy installation]: {{< ref "#removal-of-active-directory-cmdlets-dependency-from-grafana-alloy-installation" >}}
+
+[Upgrade]: {{< ref "#upgrade" >}}
+[Upgrade - Backup & Restore Support for Reliable Collections during Single‑Server Upgrades]: {{< ref "#backup--restore-support-for-reliable-collections-during-singleserver-upgrades" >}}
+[Upgrade - Enhanced pre‑upgrade health checks for Service Fabric and RabbitMQ]: {{< ref "#enhanced-preupgrade-health-checks-for-service-fabric-and-rabbitmq" >}}
+[Upgrade - Improving service management during reliable collections backup and restore]: {{< ref "#improved-service-management-during-reliable-collections-backup-and-restore" >}}
+[Upgrade - Improving Flow migration from CORTEX 7]: {{< ref "#improved-flow-migration-from-cortex-7" >}}
+
+[Documentation]: {{< ref "#documentation" >}}
+[Documentation - Expanded with broader Product Portal]: {{< ref "#expanded-product-portal-documentation-coverage" >}}
+
+[Potential Breaking - Added ability to configure block logging on each block]: {{< ref "#added-ability-to-configure-block-logging-on-each-block-1" >}}
+[Potential Breaking - Introduced Role‑Based Access Control for Containers in the {{% ctx %}} Configuration Portal]: {{< ref "#introduced-rolebased-access-control-for-containers-in-the-cortex-configuration-portal-1" >}}
+
+[Breaking - Changes to the {{% ctx %}} Interaction Portal template]: {{< ref "#changes-to-the-cortex-interaction-portal-template" >}}
+[Breaking - Changes to the Grafana Alloy configuration]: {{< ref "#changes-to-the-grafana-alloy-configuration" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" version="2026.3" >}}
+[Data Storage Blocks]: {{< url path="Cortex.Reference.Blocks.DataStorage.MainDoc" version="2026.3" >}}
+[Blocks - Search File]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.SearchFile.SearchFile.MainDoc" version="2026.3" >}}
+[Blocks - Search Files]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.SearchFile.SearchFiles.MainDoc" version="2026.3" >}}
+
+[Release]: {{< url path="Cortex.Reference.Glossary.P-T.Release" version="2026.3" >}}
+[Gateway]: {{< url path="Cortex.Guides.Gateway.MainDoc" version="2026.3" >}}
+[Service Fabric]: {{< url path="Cortex.Reference.Glossary.P-T.ServiceFabric" version="2026.3" >}}
+
+[2025.9]: {{< url path="Cortex.Blogs.Releases.2025_9.MainDoc" version="2026.3" >}}
+
+[Grafana 8.5.4]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.Windows" >}}
+[Grafana 10.4.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.10_4_1.Windows" >}}
+[Grafana 12.1.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.12_1_1.Windows" >}}
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.Windows" >}}
+[Loki 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_0_0.Release" >}}
+[Loki 3.5.5]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_5_5.Release" >}}
+[Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.Release" >}}
+[Loki 2.5.0]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.Release" >}}
+[Alloy 1.10.2]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_10_2.Release" >}}
+[Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Release" >}}
+[Observability 5.0.0]: {{< url path="GitHub.Cortex.Observability.5_0_0.Release" >}}
+[Observability 4.2.1]: {{< url path="GitHub.Cortex.Observability.4_2_1.Release" >}}
+[Observability 4.2.0]: {{< url path="GitHub.Cortex.Observability.4_2_0.Release" >}}
+[Observability 4.1.0]: {{< url path="GitHub.Cortex.Observability.4_1_0.Release" >}}
+[Observability 4.0.0]: {{< url path="GitHub.Cortex.Observability.4_0_0.Release" >}}
+[Observability 3.0.0]: {{< url path="GitHub.Cortex.Observability.3_0_0.Release" >}}
+[Observability 2.2.0]: {{< url path="GitHub.Cortex.Observability.2_2_0.Release" >}}
diff --git a/content/en/docs/2025.3/FAQs/change-logging-levels/_index.md b/content/en/docs/2025.3/FAQs/change-logging-levels/_index.md
new file mode 100644
index 000000000..09a7c8d67
--- /dev/null
+++ b/content/en/docs/2025.3/FAQs/change-logging-levels/_index.md
@@ -0,0 +1,20 @@
+---
+title: "How do I change the Logging Level?"
+linkTitle: "How do I change the Logging Level?"
+description: "Instructions on how to change the {{% ctx %}} Logging Level."
+weight: 1000
+---
+
+{{% ctx %}} Logging Levels are set to `Error` by default for most services. However, levels can be changed whilst {{% ctx %}} is running by sending REST calls to the {{% ctx %}} API Gateway service.
+
+{{% alert title="Note" %}}
+Although the Logging Level for the {{% ctx %}} API Gateway service can be increased, it will still always log all API calls regardless of Logging Level configured.
+{{% / alert %}}
+
+If increasing the Logging Level, particularly if increasing for everything or for Block Logging, we recommend that this is done only when required. Increasing log levels will lead to an increase in disk usage and disk writes, which can impact the performance of the {{% ctx %}} platform if not monitored.
+
+Whilst increased Logging Levels are in place, we would recommend closely monitoring system performance and disk space usage.
+
+All REST calls to update Logging Levels use Basic Auth and can be made using REST clients such as [Postman][] or using scripts such as PowerShell.
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
diff --git a/content/en/docs/2025.3/FAQs/change-logging-levels/change-all-logging.md b/content/en/docs/2025.3/FAQs/change-logging-levels/change-all-logging.md
new file mode 100644
index 000000000..5ae906fd3
--- /dev/null
+++ b/content/en/docs/2025.3/FAQs/change-logging-levels/change-all-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change All Logging Levels"
+linkTitle: "Change All Logging Levels"
+description: "Instructions on how to change the Logging Level for All Logging."
+weight: 10
+---
+
+# {{% param title %}}
+
+To change the Logging Level for all services, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service Port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.3/FAQs/change-logging-levels/change-block-logging.md b/content/en/docs/2025.3/FAQs/change-logging-levels/change-block-logging.md
new file mode 100644
index 000000000..0bb8518e9
--- /dev/null
+++ b/content/en/docs/2025.3/FAQs/change-logging-levels/change-block-logging.md
@@ -0,0 +1,84 @@
+---
+title: "Change Block Logging Level"
+linkTitle: "Change Block Logging Level"
+description: "Instructions on how to change the Logging Level for Block Logging."
+weight: 5
+---
+
+# {{% param title %}}
+
+Block Logging in {{% ctx %}} logs the following Block Properties by default regardless of the log level configured:
+
+* Execute Data Command
+ * Command > commandText
+ * Command > parameters
+* Execute Http Request
+ * Http Request
+ * Http Response
+* Execute Soap Request
+ * Soap Request
+ * Soap Response
+* Execute PowerShell Script
+ * Script
+ * Parameters
+ * Outputs
+ * Records
+* Execute Ssh Command
+ * Command
+ * Response
+ * Ssh Logs
+
+To change the Logging Level for Block Logging so that every block is logged when executed, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/workspaces/blocks/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service Port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.3/FAQs/change-logging-levels/change-flow-logging.md b/content/en/docs/2025.3/FAQs/change-logging-levels/change-flow-logging.md
new file mode 100644
index 000000000..6ceb48cf2
--- /dev/null
+++ b/content/en/docs/2025.3/FAQs/change-logging-levels/change-flow-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change Flow Logging Level"
+linkTitle: "Change Flow Logging Level"
+description: "Instructions on how to change the Logging Level for Flow Logging."
+weight: 1
+---
+
+# {{% param title %}}
+
+To change the Logging Level for Flow Logging, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service Port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md b/content/en/docs/2025.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
index e1d8e2409..1ce8f775d 100644
--- a/content/en/docs/2025.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
+++ b/content/en/docs/2025.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
@@ -7,96 +7,114 @@ weight: 100
# {{% param title %}}
-{{< workinprogress >}}
-
## Summary
-TODO
+The Variable Editor is used to reference any available [variable][What is a Variable?] that is in scope of the [block][What is a Block?] and can be used with most [block properties][What is a Block Property?].
+
+{{< figure src="/images/Variable Editor.png" >}}
## Using Variables
-TODO:
+The variables available to the Variable Editor are restricted by the [scope][Variable Scopes] of the currently selected block, which in turn is determined by the [workspace][What is a Workspace?] containing it.
+
+The variable is referenced by either entering the variable name (without the prefix of `($)`) into the Variable Editor, or by selecting an available variable from the dropdown, which is revealed when the Variable Editor is selected.
-- You can use any available variable.
-- Available variables are restricted by the scope of the currently selected block
-- All available variables will be shown when the variable editor is empty; typing in the editor will filter the available variables with those that match (contains text) on either the variable name or scope
+If the editor’s field is empty, all available variables will be displayed in the dropdown.
-TODO: Image of using a variable
+{{< figure src="/images/Variable Editor - Select Variable.png" >}}
-TODO: Image of selecting available variables
+Typing characters into the Variable Editor will filter the available variables displayed to those with their name or scope containing a case-insensitive match of the text entered.
+
+{{< figure src="/images/Variable Editor - Filter Variables.png" >}}
### Scoped Variables
-TODO:
+Variables are scoped by the workspace that contains the selected block. {{% ctx %}} uses the principle of inherited scope in that variables available for use in the Variable Editor are those created in the current workspace and those inherited from variables scoped to the parent workspace.
-- Available variables are scoped by the workspace of the block selected
-- Can see variables of the same name that are on accessible scopes
-- Link to known limitation. If there are two or more variables with the same name, the variable with the closest scope will be always used even if another is selected
+If two or more different variables have the same case-insensitive variable name but belong to different scopes, only the variable with the closest scope to the scope of the selected block will be used or displayed in the Variable Editor dropdown.
-TODO: Image of scoped variables (different names and same names)
+{{< figure src="/images/Variable Editor - Scoped Variables.png" >}}
### Accessing Variable Properties or Indexes
-TODO:
+[Properties][Variable Properties] and [indexes][Variable Indexes] of the data type contained in a variable for both Input and Output properties may be expressed in the Variable Editor.
-- Properties and indexes can be accessed from the Variable editor
-- Translation error shown in messages viewer when using properties or indexes incorrectly for variable that is not dynamic
+However, if an index is used with a variable in an output property, the variable must have already been created and instantiated to a suitable data type, otherwise a translation error will be displayed when an attempt to execute the flow is made.
-TODO: Image of accessing variable property and index
+In addition, for input or output property types, if the data type contained in the variable is not dynamic and the property or index used does not exist, a translation error will be displayed when an attempt to execute the flow is made.
-## Missing Variables
+Conversely, If the data type contained in the variable is dynamic and the property or index does not exist, a translation error will not be displayed but a runtime exception will be raised when the flow is executed.
+
+{{< figure src="/images/Variable Editor - Variable Properties.png">}}
-TODO:
+## Missing Variables
-- If a variable does not exist, then a orange border will be shown around the Variable editor
-- It is possible to create a new variable from a missing one using the variable editor
+If the text entered in the Variable Editor does not match that of a created variable, i.e., the variable does not exist, then a red border with be shown around the Variable Editor. However, it is possible to [create][Creating Variables] a new variable of that name using the Variable Editor.
-TODO: Image of orange border for missing variables
+{{< figure src="/images/Variable Editor - Missing Variable.png" >}}
## Creating Variables
-TODO:
+If a variable does not already exist, the Variable Editor can be used to create a new variable, scoped to the current workspace.
+
+To create a new variable, enter the new variable’s name in the Variable Editor. The dropdown will reveal a filtered list of available variables, where the name or scope of variable contains the case-insensitive text entered, plus the option to create a new variable.
-- If a variable does not already exist, the variable editor can be used to create a new one at the current scope
-- If the variable name is invalid ([C# identifier naming rules][]) then there will be no option to create a new variable
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to create a new variable will not be displayed.
-TODO: Image of option to create a new variable
+{{< figure src="/images/Variable Editor - Create Variable.png" >}}
## Renaming Variables
-TODO:
+If the Variable Editor already contains a reference to an existing variable, entering the name for a variable that does not exist will not only offer the option to [create][Creating Variables] a new variable in the dropdown, but it will also display the option to rename the existing variable to that of the name entered.
+
+If an existing variable is renamed in the Variable Editor, then all other references to the existing variable will also be changed to the new variable name throughout the flow.
-- If a variable editor already contains a reference to a variable that exists, typing the name of a non-existent variable will provide the option to rename the previously selected variable (and all references to it within the flow) to the new variable name
-- If the variable name is invalid ([C# identifier naming rules][]) then there will be no option to rename the variable
-- Renaming a variable does not include any index or method expressions (e.g. renaming to `($)NewVar.ToString()` will rename the selected variable to `($)NewVar`)
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to rename the variable will not be displayed.
-TODO: Image of option to rename a variable
+Renaming a variable will keep intact any indexes or property references to the object contained in the variable; any changes made to the indexes or property references will not affect the indexes or property references elsewhere in the flow.
+
+{{< figure src="/images/Variable Editor - Rename Variable.png" >}}
## Remarks
### Known Limitations
-TODO:
+* When two or more characters are entered into the Variable Editor, causing the dropdown to display a list of available variables, the variable name of the first closest match is sometimes displayed in the Variable Editor, e.g., entering My will cause MyVar to be displayed in the Variable Editor, however, pressing the Tab key will not automatically enter the full variable name. The variable name must either be entered in full, or an option on the dropdown must be selected.
-- If there are two or more variables with the same name, the variable with the closest scope will be always used even if another is selected
-- Currently, available variables are not restricted based on the type of the variable and if that is valid for the selected property
+* Variable references used elsewhere in the flow as the index to other variables, e.g. the variable Var2 used in the reference `Var1[($)Var2]`, will remain referencing Var2 even when the variable Var2 is renamed in the Variable Editor or Variables Grid.
## See Also
### Related Concepts
-TODO
+* [Blocks][What is a Block?]
+* [Block Properties][What is a Block Property?]
+* [Variable Scopes][]
+* [Variables][What is a Variable?]
+* [Workspaces][What is a Workspace?]
### Related Blocks
-TODO
+* [All Blocks][Blocks]
### Related Data Types
-TODO
+* [All Data Types][Reference Data Types]
### External Documentation
-TODO
+* [C# identifier naming rules][]
+
+[Creating Variables]: {{< ref "#creating-variables" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Reference Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Variable Indexes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Indexes" >}}
+[Variable Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Properties" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
[C# identifier naming rules]: {{< url path="MSDocs.CSharp.IdentifierNamingRules" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/architecture.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/architecture.md
index 6c2b36499..5bf3764c2 100644
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/architecture.md
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/architecture.md
@@ -12,8 +12,8 @@ weight: 10
| Component | Purpose | Required/Optional |Server Role |
|-----------|---------|----------|------------|
| [Grafana][] | Web application that provides querying and visualisation of data in the form of dashboards. | Required | Grafana Cloud managed service |
+| [Grafana Alloy][] | An observability collector that can ingest logs and send them to a Grafana Loki instance. It should be deployed to every machine that has a Microsoft Service Fabric node used by {{% ctx %}}. | Required | Application Server |
| [Grafana Loki][Grafana Loki] | Log aggregation system designed to store and query logs from applications and infrastructure. | Required | Grafana Cloud managed service |
-| [Promtail][] | An agent which ships the contents of local logs to a Grafana Loki instance. It should be deployed to every machine that has a Microsoft Service Fabric node used by {{% ctx %}}. | Required | Application Server |
## Recommended Architecture
@@ -27,6 +27,6 @@ The following architecture requires 1..n Application servers and 1 [Grafana Clou
[Prerequisites]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.Prerequisites.MainDoc" >}}
[Grafana]: {{< url path="Grafana.Products.Grafana.MainDoc" >}}
+[Grafana Alloy]: {{< url path="Grafana.Products.Loki.Alloy.MainDoc" >}}
[Grafana Cloud]: {{< url path="Grafana.MainDoc" >}}
[Grafana Loki]: {{< url path="Grafana.Products.Loki.MainDoc" >}}
-[Promtail]: {{< url path="Grafana.Products.Loki.Promtail.MainDoc" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
index 25665a706..d1c53e8da 100644
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
@@ -32,13 +32,18 @@ Please ensure that the set up for [Grafana][] and [Loki][] have been completed b
1. Click the Dashboards menu item.
1. Click the *New* dropdown and select *Import*.
1. Click on *Upload dashboard JSON file*.
-1. Locate the `Flow Execution Requests.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
+1. Locate the `Flow Execution Details.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
1. Select the file and click *Open*.
1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
1. Select your [configured Loki data source][] from the dropdown menu, e.g. *grafanacloud-cortex-logs*.
1. Click *Import*.
+1. Repeat steps 2 - 10 for the `Flow Execution Requests.json` file.
1. Repeat steps 2 - 10 for the `Platform Health.json` file.
+{{% alert title="Warning" color="warning" %}}
+The *Flow Execution Details* dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
## Configure Data Sources
It is necessary to update the Custom Filter inside the dashboards to use the correct data source.
@@ -57,7 +62,7 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
1. Select your [configured Loki data source][] in the *Adhoc Options* > *Data source* drop-down menu, e.g. *grafanacloud-cortex-logs*.
1. Click *Apply*.
1. Click the dashboard name in the breadcrumb at the top left corner of the page to go back to the dashboard.
-1. Click the + icon next to the Custom Filter to confirm that a list of available filter options is visible. If Grafana Loki has not received any logs from Promtail there will be no options available for selection.
+1. Click the + icon next to the Custom Filter to confirm that a list of available filter options is visible. If Grafana Loki has not received any logs from Grafana Alloy there will be no options available for selection.
1. Repeat steps 2 - 9 for all additional default dashboards.
## Next Steps?
@@ -66,6 +71,6 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
[configured Loki data source]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.MainDoc" >}}
[Grafana]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupGrafana.MainDoc" >}}
-[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.GrafanaDashboardsZip" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
[Loki]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.MainDoc" >}}
[Try it Out]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.TryItOut.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/_index.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/_index.md
new file mode 100644
index 000000000..eab08d409
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Install Grafana Alloy"
+linkTitle: "Install Grafana Alloy"
+description: "Information about installing and configuring Grafana Alloy on the Application Server(s)."
+weight: 50
+---
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
new file mode 100644
index 000000000..ee755708d
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
@@ -0,0 +1,36 @@
+---
+title: "Configure Grafana Alloy"
+linkTitle: "Configure Grafana Alloy"
+description: "Information about configuring Grafana Alloy on the Application Server(s)."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to configure Grafana Alloy on the Application Server(s).
+
+{{% alert type="note" title="Note" %}}These steps must be performed for every Grafana Alloy installation in the cluster.{{% /alert %}}
+
+## Configure Grafana Alloy
+
+1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
+1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json"`.
+1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
+1. Set the Grafana Loki `url` in the `loki.write "default"` > `endpoint` section, which can be found at the end of the file, with the url value noted down during the [Setup Grafana Loki][] steps.
+
+ A correct URL should be similar to `https://239948:eyJrIjoiaWVjNzE4MmVjOThkNTgxMMQ5MzIyZjdlMjAyYWY4NWJjO1I1OTc4NSIsIm4iOiJUZXN0S2V5IiwiaWQiOjY4Nzk0MX0=@logs-prod-008.grafana.net/api/prom/push`.
+1. Delete the line containing `bearer_token_file` in the `loki.write "default"` > `endpoint` section, which can be found at the end of the file.
+1. Save the file.
+
+### Re-Start the Grafana Alloy Service
+
+1. Open `services.msc`.
+1. Locate the `Alloy` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Import Dashboards][]
+
+[Import Dashboards]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.ImportDashboards.MainDoc" >}}
+[Setup Grafana Loki]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.SetUpGrafanaLoki" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
new file mode 100644
index 000000000..90e348d2b
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
@@ -0,0 +1,31 @@
+---
+title: "Install Grafana Alloy"
+linkTitle: "Install Grafana Alloy"
+description: "Information about installing Grafana Alloy on the Application Server(s)."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to install Grafana Alloy on the Application Server(s). Please ensure that the [Prerequisites][] have been completed before starting this installation.
+
+## Install Grafana Alloy
+
+1. Download the [Grafana Alloy 1.15.1][] archive.
+1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Download the [Grafana Alloy.zip][] archive and extract its contents alongside the previously extracted Grafana Alloy `alloy-installer-windows-amd64.exe`.
+This archive contains the `config.alloy` configuration file and PowerShell scripts to install Grafana Alloy as a Windows service.
+1. Run Windows PowerShell as Administrator
+1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\ProgramData\Cortex\Observability\Grafana Alloy"`.
+1. Execute the `.\Install-Alloy.ps1` command to install the downloaded `alloy-installer-windows-amd64.exe` as a service.
+1. When prompted, enter the credentials that the Grafana Alloy Service should run as.
+1. When prompted to enter the bearer token, leave it blank and press Enter.
+
+## Next Steps?
+
+1. [Configure Grafana Alloy][]
+
+[Configure Grafana Alloy]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.InstallAlloy.ConfigureAlloy.MainDoc" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaAlloyInstallZip" >}}
+[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/_index.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/_index.md
deleted file mode 100644
index 6f53df537..000000000
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/_index.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "Install Promtail"
-linkTitle: "Install Promtail"
-description: "Information about installing and configuring Promtail on the Application Server(s)."
-weight: 50
----
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md
deleted file mode 100644
index 4546b0a10..000000000
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: "Configure Promtail"
-linkTitle: "Configure Promtail"
-description: "Information about configuring Promtail on the Application Server(s)."
-weight: 20
----
-
-# {{% param title %}}
-
-This guide describes how to configure Promtail on the Application Server(s).
-
-{{% alert type="note" title="Note" %}}These steps must be performed for every Promtail installation in the cluster.{{% /alert %}}
-
-## Configure Promtail
-
-### Set Client URL for Grafana Loki
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Replace the Grafana Loki `URL` template in the `clients` section with the `url` value noted down during [Set Up Grafana Loki][] steps.
- A correct URL should be similar to `https://239948:eyJrIjoiaWVjNzE4MmVjOThkNTgxMMQ5MzIyZjdlMjAyYWY4NWJjO1I1OTc4NSIsIm4iOiJUZXN0S2V5IiwiaWQiOjY4Nzk0MX0=@logs-prod-008.grafana.net/api/prom/push`.
-1. Save the file.
-
-### Set the positions.yaml File Path
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Set the `filename` in the `positions` section to the location where you want the `positions.yaml` file to be created on Promtail startup, e.g. `C:/Program Data/Cortex/Observability/Promtail/Positions.yaml`.
-1. Create all the folders of the path specified in the previous step.
-1. Save the file.
-
-{{% alert title="Note" %}}
-If the specified path to the folder for the `positions.yaml` file doesn't exists, the file will not get created on Promtail startup.
-{{% /alert %}}
-
-### Set the Path to the API Gateway Service Log Files
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Set the `__path__` in the `static_configs` > `targets` > `labels` section to the path of the `Logs` folder specified in the `appSettings.json` file during installation of the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/*.json"`.
-1. Save the file.
-
-### Start Promtail
-
-1. Run Windows PowerShell as Administrator.
-1. Change the location to the folder where the `promtail-windows-amd64.exe` file is located.
-1. Execute the `.\Start-Promtail.ps1` command to start the Promtail Windows service.
-
-## Next Steps?
-
-1. [Import Dashboards][]
-
-[Import Dashboards]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.ImportDashboards.MainDoc" >}}
-[Set Up Grafana Loki]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.SetUpGrafanaLoki" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md
deleted file mode 100644
index 5eed9d97d..000000000
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-title: "Install Promtail"
-linkTitle: "Install Promtail"
-description: "Information about installing Promtail on the Application Server(s)."
-weight: 10
----
-
-# {{% param title %}}
-
-This guide describes how to install Promtail on the Application Server(s). Please ensure that the [Prerequisites][] have been completed before starting this installation.
-
-## Install Promtail
-
-1. Download [Promtail 3.0.0][] archive.
-1. Extract content of the downloaded archive to a suitable location, e.g. `C:\Program Data\Cortex\Observability\Promtail`.
-1. Download the [Promtail Install.zip][] archive and extract its contents alongside the previously extracted Promtail `promtail-windows-amd64.exe`.
-This archive contains the `promtail-local-config.yaml` configuration file, [NSSM][] (the Non-Sucking Service Manager program) and PowerShell scripts to help manage Promtail as a Windows service.
-1. Run Windows PowerShell as Administrator
-1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\Program Data\Cortex\Observability\Promtail"`.
-1. Execute the `.\Install-Promtail.ps1` command to install the downloaded `promtail-windows-amd64.exe` as a service.
-
-## Next Steps?
-
-1. [Configure Promtail][]
-
-[Configure Promtail]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.InstallPromtail.ConfigurePromtail.MainDoc" >}}
-[NSSM]: {{< url path="NSSM.MainDoc" >}}
-[Prerequisites]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.Prerequisites.MainDoc" >}}
-[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
-[Promtail Install.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.PromtailInstallZip" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
index b7a1163f1..6acc51610 100644
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
@@ -10,7 +10,7 @@ The prerequisites required for each server role (as described in [Architecture][
## Hardware Requirements
-The application servers (as described in {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.Architecture" title="Architecture" >}}) to which Promtail will be added have already been installed as part of the {{% ctx %}} install process and do not require any hardware modifications for the observability platform installation.
+The application servers (as described in {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.Architecture" title="Architecture" >}}) to which Grafana Alloy will be added have already been installed as part of the {{% ctx %}} install process and do not require any hardware modifications for the observability platform installation.
{{% alert title="Note" %}}
The application servers must have internet access in order to communicate with the Grafana Cloud managed service.
@@ -21,7 +21,7 @@ The application servers must have internet access in order to communicate with t
| Server Role | Windows Server[^1] | Other Software |
|--------------------|------------------------------------------------|--------------------|
-| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | [Promtail 3.0.0][] |
+| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | [Grafana Alloy 1.15.1][] |
[^1]: Windows Server Standard and Datacenter editions are supported. Filesystem **must be NTFS** and networking **must use IPv4**. Linux is not supported, but may be in the future.
@@ -48,6 +48,10 @@ These requirements apply to each of the Application Servers.
A domain user which is a member of the Local Administrators group on all Application Servers must be available to perform the installation.
+#### Service User
+
+Grafana Alloy requires a domain user that is not a member of the Local Administrators group on any of the Application Servers. This user must be given the `Log on as a service` right otherwise the service will not be able to run. This permission will be granted as part of the install if it is not already granted.
+
## Next Steps?
1. [Set up Grafana][]
@@ -55,5 +59,5 @@ A domain user which is a member of the Local Administrators group on all Applica
[2019 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2019" >}}
[2022 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2022" >}}
[Architecture]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.Architecture.MainDoc" >}}
-[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
[Set up Grafana]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupGrafana.MainDoc" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/setup-loki.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/setup-loki.md
index d8495b8b6..f086f2c35 100644
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/setup-loki.md
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/setup-loki.md
@@ -26,8 +26,8 @@ The token name is used in the Grafana Cloud website to easily identify the key a
## Next Steps?
-1. [Install Promtail][]
+1. [Install Grafana Alloy][]
-[Install Promtail]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.InstallPromtail.MainDoc" >}}
+[Install Grafana Alloy]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.InstallAlloy.MainDoc" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.Prerequisites.MainDoc" >}}
[Sign Up For Grafana Cloud]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupGrafana.SignUpForGrafanaCloud" >}}
diff --git a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
index 0ab653084..db6b83f4b 100644
--- a/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
+++ b/content/en/docs/2025.3/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
@@ -17,7 +17,7 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
| Property | Value |
|---------------|-------------------------------------------------------------------------------------|
| Action | POST |
- | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
| Content Type | application/json |
| Body | {} |
| Authentication| Basic |
@@ -27,6 +27,16 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
{{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
1. Once the request has completed, using a web browser, log in to your configured Grafana.
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the folder name that the dashboards were imported to, if not already expanded.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
1. Click the Dashboards menu item.
1. Click the folder name that the dashboards were imported to, if not already expanded.
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/architecture.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/architecture.md
index 09c898254..322188254 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/architecture.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/architecture.md
@@ -12,9 +12,9 @@ weight: 10
| Component | Purpose | Required/Optional |Server Role |
|-----------|---------|----------|------------|
| [Grafana][] | Web application that provides querying and visualisation of data in the form of dashboards. | Required | Web Application Server |
+| [Grafana Alloy][] | An observability collector that can ingest logs and send them to a Grafana Loki instance. It should be deployed to every machine that has a Microsoft Service Fabric node used by {{% ctx %}}. | Required | Application Server |
| [Grafana Loki][] | Log aggregation system designed to store and query logs from applications and infrastructure. | Required | Web Application Server |
| [Microsoft Internet Information Services (IIS)][IIS] | Web server used as a reverse proxy for Grafana Loki. | Required | Web Application Server |
-| [Promtail][] | An agent which ships the contents of local logs to a Grafana Loki instance. It should be deployed to every machine that has a Microsoft Service Fabric node used by {{% ctx %}}. | Required | Application Server |
## Recommended Architecture
@@ -35,6 +35,6 @@ The following architecture requires 1 + 1..n servers:
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
[Grafana]: {{< url path="Grafana.Products.Grafana.MainDoc" >}}
+[Grafana Alloy]: {{< url path="Grafana.Products.Loki.Alloy.MainDoc" >}}
[Grafana Loki]: {{< url path="Grafana.Products.Loki.MainDoc" >}}
-[Promtail]: {{< url path="Grafana.Products.Loki.Promtail.MainDoc" >}}
[IIS]: {{< url path="IIS.MainDoc" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/_index.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/_index.md
new file mode 100644
index 000000000..eab08d409
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Install Grafana Alloy"
+linkTitle: "Install Grafana Alloy"
+description: "Information about installing and configuring Grafana Alloy on the Application Server(s)."
+weight: 50
+---
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
new file mode 100644
index 000000000..990eae7ad
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
@@ -0,0 +1,60 @@
+---
+title: "Configure Grafana Alloy"
+linkTitle: "Configure Grafana Alloy"
+description: "Information about configuring Grafana Alloy on the Application Server(s)."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to configure Grafana Alloy on the Application Server(s).
+
+{{% alert type="note" title="Note" %}}These steps must be performed for every Grafana Alloy installation in the cluster.{{% /alert %}}
+
+## Install Certificate
+
+If a self-signed certificate was obtained in the [prerequisites][], the CA certificate used to create this certificate must be imported on each Application Server. Otherwise, Grafana Alloy will not be able to establish communication with Grafana Loki.
+
+To import the CA certificate:
+
+1. Copy the `cortexCA.pfx` CA certificate created during the [root CA certificate generation][Generate The Root CA Certificate] steps into a suitable location on the Application Server.
+1. Double click on the `cortexCA.pfx` file to import the certificate into the Windows Certificate Store.
+1. Select `Local Machine` then click `Next`.
+1. Click `Next`.
+1. Enter the Export Password which the certificate was generated with then click `Next`.
+1. Select `Place all certificates in the following store`.
+1. Click `Browse…`.
+1. Select `Trusted Root Certification Authorities`, click `OK` then click `Next`.
+1. Click `Finish`.
+
+## Configure Grafana Alloy
+
+1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
+1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json"`.
+1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
+1. Set the Grafana Loki `url` in the `loki.write "default"` > `endpoint` section which can be found at the end of the file.
+
+ The following template has been provided for convenience:
+ `https://:/loki/api/v1/push`
+| Element | Description |
+|------|-------------|
+| loki host address | The host address of the machine where the Grafana Loki reverse proxy was configured during [Add a New Website][] steps. This must match the configured host name. |
+| loki reverse proxy port | The port of the Grafana Loki reverse proxy configured during [Add a New Website][] steps. Usually 2100. |
+
+ A correct URL should be similar to `https://hostaddress:2100/loki/api/v1/push`.
+1. Save the file.
+
+### Re-Start the Grafana Alloy Service
+
+1. Open `services.msc`.
+1. Locate the `Alloy` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Setup Grafana][]
+
+[Add a New Website]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.AddANewWebsite" >}}
+[Generate The Root CA Certificate]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.GenerateTheRootCaCertificate" >}}
+[prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.WebAppCertificateRequirements" >}}
+[Setup Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SetupGrafana" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
new file mode 100644
index 000000000..5cea6a2c8
--- /dev/null
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
@@ -0,0 +1,32 @@
+---
+title: "Install Grafana Alloy"
+linkTitle: "Install Grafana Alloy"
+description: "Information about installing Grafana Alloy on the Application Server(s)."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to install Grafana Alloy on the Application Server(s). Please ensure that the [Prerequisites][] have been completed before starting this installation.
+
+## Install Grafana Alloy
+
+1. Download the [Grafana Alloy 1.15.1][] archive.
+1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Download the [Grafana Alloy.zip][] archive and extract its contents alongside the previously extracted Grafana Alloy `alloy-installer-windows-amd64.exe`.
+This archive contains the `config.alloy` configuration file and PowerShell scripts to install Grafana Alloy as a Windows service.
+1. Run Windows PowerShell as Administrator
+1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\ProgramData\Cortex\Observability\Grafana Alloy"`.
+1. Execute the `.\Install-Alloy.ps1` command to install the downloaded `alloy-installer-windows-amd64.exe` as a service.
+1. When prompted, enter the credentials that the Grafana Alloy Service should run as.
+1. When prompted, enter the bearer token that was specified when [configuring authentication for the Reverse Proxy][Reverse Proxy Authentication]
+
+## Next Steps?
+
+1. [Configure Grafana Alloy][]
+
+[Configure Grafana Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.ConfigureAlloy" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaAlloyInstallZip" >}}
+[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
+[Reverse Proxy Authentication]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.ConfigureAuthentication" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
index 58de4bcdd..ac31059d9 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
@@ -11,7 +11,7 @@ This guide describes how to install Grafana on the Web Application Server. Pleas
## Install Grafana
-1. Download the [Grafana 10.4.1][] Windows installer.
+1. Download the [Grafana 13.0.1][] Windows installer.
1. Run the installer and install Grafana to a suitable location.
## Next Steps?
@@ -19,6 +19,5 @@ This guide describes how to install Grafana on the Web Application Server. Pleas
1. [Configure Grafana][]
[Configure Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.ConfigureGrafana" >}}
-[Grafana 10.4.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.10_4_1.Windows" >}}
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.WindowsInstaller" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
-[Software Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SoftwareRequirements" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/configure-loki.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/configure-loki.md
index 3db8584be..c8a5c1799 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/configure-loki.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/configure-loki.md
@@ -28,18 +28,6 @@ To verify the certificate is imported:
All of the steps must be carried out on the Web Application Server.
-### Install IIS Basic Authentication
-
-1. Run *Server Manager*.
-1. Expand the *Manage* menu and select *Add Roles and Features*.
-1. In the left-hand menu, select *Server Selection*.
-1. Select the name of the Web Application Server, click *Next*.
-1. On the *Server Roles* page, in the *Roles* tree, expand *Web Server (IIS)* --> *Web Server* --> *Security*.
-1. Select *Basic Authentication*, click *Next*.
-1. Click *Next* to get to the *Confirm installation selections* page.
-1. Click *Install*.
-1. Click *Close* on the *Results* page.
-
### Install IIS URL Rewrite Module
1. Download the [URL Rewrite module 2.1][]
@@ -78,15 +66,43 @@ To set up a reverse proxy, carry out the following configuration.
- *SSL certificate*: Select the certificate created as part of the [Certificate Requirements][prerequisites] instructions.
- Click *OK* to add the website.
-#### Enable Basic Authentication
+#### Configure URL Rewrite Rules
+
+##### Configure Authentication for the Reverse Proxy
1. In the *Connection* pane, browse to *Sites*.
1. Select the newly created website.
-1. Double-click on the *Authentication* icon.
-1. Disable *Anonymous Authentication*.
-1. Enable *Basic Authentication*.
-
-## Configure URL Rewrite Rule
+1. Double-click on the *URL Rewrite* icon.
+1. In the *Actions* pane, click *Add Rule(s)...*.
+1. Select *Blank rule* from the *Inbound Rules* section.
+1. Click *OK*.
+1. In the *Edit Inbound Rule* Dialog:
+ * Enter a *Name* for the rule, e.g. *Bearer Authentication*.
+ * Configure the *Match URL* section:
+ * *Requested URL* should be set to `Matches the Pattern`.
+ * *Using* should be set to `Regular Expressions`.
+ * *Pattern* should be set to `.*`.
+ * *Ignore case* should be checked.
+ * In the *Conditions* section:
+ * *Logical Grouping* should be set to `Match Any`.
+ * Click `Add...` to add a new condition.
+ * In the *Edit Condition* dialog:
+ * *Condition Input* should be set to `{HTTP_AUTHORIZATION}`.
+ * *Check if input string:* should be set to `Does Not Match the Pattern`.
+ * *Pattern* should be set to `^Bearer $` replacing <Bearer Token> with an appropriate value.
+
+ A valid Bearer Token can be generated by any token generator, e.g. [Token Generator][], and should be a minimum of 64 characters consisting of uppercase and lowercase letters as well as numbers but should not contain any symbols. This token value should be saved for use when [installing Grafana Alloy][].
+ * *Ignore case* should be unchecked.
+ * Click `OK`.
+ * In the *Action* section:
+ * *Action Type* should be set to `Custom Response`.
+ * *Action Properties* should be configured as follows:
+ * *Status code* should be set to `401`.
+ * *Reason* should be set to `Unauthorised`.
+ * *Error description* should be set to `Invalid Bearer Token`.
+1. In the *Actions* pane, click *Apply*.
+
+##### Configure the Routing for the Reverse Proxy
1. In the *Connection* pane, browse to *Sites*.
1. Select the newly created website.
@@ -99,34 +115,52 @@ To set up a reverse proxy, carry out the following configuration.
1. Ensure that *Enable SSL Offloading* is checked.
1. Click *OK*.
-#### Restart the Website
+##### Ensure Correct Ordering of URL Rewrite Rules
+
+The URL Rewrite rules should be in the following order:
+
+1. Bearer Authentication
+2. ReverseProxyInboundRule
+
+If the order is incorrect:
+
+1. Select the *Bearer Authentication* rule.
+1. In the *Actions* pane, click *Move Up*.
+1. If prompted that inheritance will be affected, click *Yes*.
+
+##### Restart the Website
1. In the *Connection* pane, browse to *Sites*.
1. Select the newly created website.
1. In the *Manage Website* pane, click *Restart*.
-#### Create Loki User
+## Configure Log Retention
+
+Grafana Loki is configured with a default retention period of 12 months for it's logs. This means that Grafana can query data up to 12 months old. Once the 12 months is reached, Loki will remove older logs.
+
+If a different retention period is required then this can be set, however, it should only be set to the period that is needed otherwise excessive disk space may be used unnecessarily.
+
+To change the retention period:
-1. Run Windows PowerShell as Administrator.
-1. Execute the following command to create a new local user on the Web Application Server:
+1. Open the `loki-local-config.yaml` configuration file, which is located in the folder that Loki was installed to eg `C:\ProgramData\Cortex\Observability\Loki`.
+1. Locate the `retention_period:` configuration value at approximately line 55.
+1. Set the value of the retention required in hours, e.g. 6 months would be `4380h` or 9 months would be `6570h`.
+1. Save the file.
- ```Powershell
- New-LocalUser "" -Password (ConvertTo-SecureString "" -AsPlainText -force) -FullName "" -Description "" –PasswordNeverExpires
- ```
+### Re-Start the Grafana Loki Service
- | Parameter | Description |
- |------|-------------|
- | username | The username of the user to be created. |
- | password | The password for the user account. |
- | name | The full name for the user account. |
- | description | The description of the user account. |
+1. Open `services.msc`.
+1. Locate the `Loki` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
## Next Steps?
-1. [Install Promtail][]
+1. [Install Grafana Alloy][]
+[Token Generator]: {{< url path="IT-Tools.TokenGenerator" >}}
[Application Request Routing 3.0]: {{< url path="IIS.Downloads.ApplicationRequestRouting-3_0" >}}
-[Install Promtail]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallPromtail.MainDoc" >}}
+[Install Grafana Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.MainDoc" >}}
+[Installing Grafana Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.InstallAlloy.MainDoc" >}}
[prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.WebAppCertificateRequirements" >}}
[Software Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SoftwareRequirements" >}}
[URL Rewrite module 2.1]: {{< url path="IIS.Downloads.UrlRewrite-2_1" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
index 8e3f9b8f1..dce9df684 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
@@ -11,12 +11,12 @@ This guide describes how to install Grafana Loki on the Web Application Server.
## Install Grafana Loki
-1. Download [Grafana Loki 3.0.0][] archive.
-1. Extract content of the downloaded archive to a suitable location, e.g. `C:\Program Data\Cortex\Observability\Loki`.
+1. Download [Grafana Loki 3.7.1][] archive.
+1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
1. Download the [Grafana Loki Install.zip][] archive and extract its contents alongside the previously extracted Grafana Loki `loki-windows-amd64.exe`.
This archive contains the `loki-local-config.yaml` configuration file, [NSSM][] (the Non-Sucking Service Manager program) and PowerShell scripts to help manage Grafana Loki as a Windows service.
1. Run Windows PowerShell as Administrator.
-1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\Program Data\Cortex\Observability\Loki"`.
+1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\ProgramData\Cortex\Observability\Loki"`.
1. Execute the `.\Install-Loki.ps1` command to install the downloaded Grafana Loki `loki-windows-amd64.exe` as a service.
1. Execute the `.\Start-Loki.ps1` command to start the Grafana Loki service.
@@ -25,8 +25,7 @@ This archive contains the `loki-local-config.yaml` configuration file, [NSSM][]
1. [Configure Loki][]
[Configure Loki]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.ConfigureLoki" >}}
-[Grafana Loki 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_0_0.GrafanaLokiInstallZip" >}}
-[Grafana Loki Install.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.GrafanaLokiInstallZip" >}}
+[Grafana Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.GrafanaLokiInstallZip" >}}
+[Grafana Loki Install.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaLokiInstallZip" >}}
[NSSM]: {{< url path="NSSM.MainDoc" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
-[Software Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SoftwareRequirements" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/_index.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/_index.md
deleted file mode 100644
index 6f53df537..000000000
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/_index.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "Install Promtail"
-linkTitle: "Install Promtail"
-description: "Information about installing and configuring Promtail on the Application Server(s)."
-weight: 50
----
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md
deleted file mode 100644
index 3e9433911..000000000
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/configure-promtail.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-title: "Configure Promtail"
-linkTitle: "Configure Promtail"
-description: "Information about configuring Promtail on the Application Server(s)."
-weight: 20
----
-
-# {{% param title %}}
-
-This guide describes how to configure Promtail on the Application Server(s).
-
-{{% alert type="note" title="Note" %}}These steps must be performed for every Promtail installation in the cluster.{{% /alert %}}
-
-## Install Certificate
-
-If a self-signed certificate was obtained in the [prerequisites][], the CA certificate used to create this certificate must be imported on each Application Server. Otherwise, Promtail will not be able to establish communication with Grafana Loki.
-
-To import the CA certificate:
-
-1. Copy the `cortexCA.pfx` CA certificate created during the [root CA certificate generation][Generate The Root CA Certificate] steps into a suitable location on the Application Server.
-1. Double click on the `cortexCA.pfx` file to import the certificate into the Windows Certificate Store.
-1. Select `Local Machine` then click `Next`.
-1. Click `Next`.
-1. Enter the Export Password which the certificate was generated with then click `Next`.
-1. Select `Place all certificates in the following store`.
-1. Click `Browse…`.
-1. Select `Trusted Root Certification Authorities`, click `OK` then click `Next`.
-1. Click `Finish`.
-
-## Configure Promtail
-
-### Set Client URL for Grafana Loki
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Set the Grafana Loki `URL` in the `clients` section.
-
- The following template has been provided for convenience:
- `https://:@:/loki/api/v1/push`
-| Element | Description |
-|------|-------------|
-| username | The username of the user created during [Create Loki User][] steps. |
-| password | The password which was set for the user during [Create Loki User][] steps. |
-| loki host address | The host address of the machine where the Grafana Loki reverse proxy was configured during [Add a New Website][] steps . This must match the configured host name. |
-| loki reverse proxy port | The port of the Grafana Loki reverse proxy configured during [Add a New Website][] steps. Usually 2100. |
-
- A correct URL should be similar to `https://username:password@hostaddress:2100/loki/api/v1/push`.
-1. Save the file.
-
-### Set the positions.yaml File Path
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Set the `filename` in the `positions` section to the location where you want the `positions.yaml` file to be created on Promtail startup, e.g. `C:/Program Data/Cortex/Observability/Promtail/Positions.yaml`.
-1. Create all the folders of the path specified in the previous step.
-1. Save the file.
-
-{{% alert title="Note" %}}
-If the specified path to the folder for the `positions.yaml` file doesn't exists, the file will not get created on Promtail startup.
-{{% /alert %}}
-
-### Set the Path to the API Gateway Service Log Files
-
-1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file.
-1. Set the `__path__` in the `static_configs` > `targets` > `labels` section to the path of the `Logs` folder specified in the `appSettings.json` file during installation of the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{_[0-9][0-9][0-9],}.json"`.
-1. Save the file.
-
-### Start Promtail
-
-1. Run Windows PowerShell as Administrator.
-1. Change the location to the folder where the `promtail-windows-amd64.exe` file is located.
-1. Execute the `.\Start-Promtail.ps1` command to start the Promtail Windows service.
-
-## Next Steps?
-
-1. [Setup Grafana][]
-
-[Add a New Website]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.AddANewWebsite" >}}
-[Create Loki User]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.CreateLokiUser" >}}
-[Generate The Root CA Certificate]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.GenerateTheRootCaCertificate" >}}
-[prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.WebAppCertificateRequirements" >}}
-[Setup Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SetupGrafana" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md
deleted file mode 100644
index a4a13c486..000000000
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/install-promtail/install-promtail.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-title: "Install Promtail"
-linkTitle: "Install Promtail"
-description: "Information about installing Promtail on the Application Server(s)."
-weight: 10
----
-
-# {{% param title %}}
-
-This guide describes how to install Promtail on the Application Server(s). Please ensure that the [Prerequisites][] have been completed before starting this installation.
-
-## Install Promtail
-
-1. Download [Promtail 3.0.0][] archive.
-1. Extract content of the downloaded archive to a suitable location, e.g. `C:\Program Data\Cortex\Observability\Promtail`.
-1. Download the [Promtail Install.zip][] archive and extract its contents alongside the previously extracted Promtail `promtail-windows-amd64.exe`.
-This archive contains the `promtail-local-config.yaml` configuration file, [NSSM][] (the Non-Sucking Service Manager program) and PowerShell scripts to help manage Promtail as a Windows service.
-1. Run Windows PowerShell as Administrator
-1. Change the location to where all the files were extracted to in step 2, e.g. `cd "C:\Program Data\Cortex\Observability\Promtail"`.
-1. Execute the `.\Install-Promtail.ps1` command to install the downloaded `promtail-windows-amd64.exe` as a service.
-
-## Next Steps?
-
-1. [Configure Promtail][]
-
-[Configure Promtail]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallPromtail.ConfigurePromtail" >}}
-[NSSM]: {{< url path="NSSM.MainDoc" >}}
-[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
-[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
-[Promtail Install.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.PromtailInstallZip" >}}
-[Software Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SoftwareRequirements" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
index 7b7c0a4e9..05ac508b3 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
@@ -33,21 +33,20 @@ The table below specifies additional resources that are recommended to be added
| Web Application Server (Shared with {{% ctx %}} Gateway) | 4+ *Recommended* 2 *Minimum* | 12+ *Recommended* 6 *Minimum* | 10+ *Recommended* 5 *Minimum*|
{{% alert title="Note" %}}
-The application servers (as described in {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.Architecture" title="Architecture" >}}) to which Promtail will be added have already been installed as part of the {{% ctx %}} install process and do not require any hardware modifications for the observability platform installation.
+The application servers (as described in {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.Architecture" title="Architecture" >}}) to which Grafana Alloy will be added have already been installed as part of the {{% ctx %}} install process and do not require any hardware modifications for the observability platform installation.
{{% /alert %}}
## Software Requirements
| Server Role | Windows Server[^1] | IIS[^2] | Other Software |
|------------------|-------------------------|---------|----------|
-| Web Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | 10.0.20348[^3] 10.0.17763[^4] IIS Basic Authentication[^5] [URL Rewrite module 2.1][] | [Grafana 10.4.1][] *Enterprise Edition* [Grafana Loki 3.0.0][]|
-| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | | [Promtail 3.0.0][]|
+| Web Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | 10.0.20348[^3] 10.0.17763[^4] [URL Rewrite module 2.1][] | [Grafana 13.0.1][] *Enterprise Edition* [Grafana Loki 3.7.1][]|
+| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | | [Grafana Alloy 1.15.1][]|
[^1]: Windows Server Standard and Datacenter editions are supported. Filesystem **must be NTFS** and networking **must use IPv4**. Linux is not supported, but may be in the future.
[^2]: IIS is supported; other web servers, including IIS Express are not supported.
[^3]: Ships as a windows role within Windows Server 2022.
[^4]: Ships as a windows role within Windows Server 2019.
-[^5]: Installed during the [Install IIS Basic Authentication][] configuration steps.
## Domain Requirements
@@ -86,7 +85,7 @@ For production systems, it is recommended that X.509 SSL certificates are obtain
An X.509 SSL certificate (standard, wildcard or self-signed) should be used to secure communication between:
-* Promtail on the Application Servers and the reverse proxy configured for Grafana Loki on the Web Application Server.
+* Grafana Alloy on the Application Servers and the reverse proxy configured for Grafana Loki on the Web Application Server.
* Grafana end users and the Grafana Web Application on the Web Application Server.
The wildcard certificate used for installing {{% ctx %}} can be used if it is available in the .PEM file format, otherwise a new certificate can be obtained from a Certificate Authority, such as [Let’s Encrypt][], and must meet the following requirements:
@@ -148,6 +147,10 @@ These requirements apply to each of the Application Servers.
A domain user which is a member of the Local Administrators group on all Application Servers must be available to perform the installation.
+#### Service User
+
+Grafana Alloy requires a domain user that is not a member of the Local Administrators group on any of the Application Servers. This user must be given the `Log on as a service` right otherwise the service will not be able to run. This permission will be granted as part of the install if it is not already granted.
+
## Next Steps?
1. [Install Grafana][]
@@ -156,15 +159,13 @@ A domain user which is a member of the Local Administrators group on all Applica
[2022 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2022" >}}
[Architecture]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Architecture" >}}
[configuring Grafana to use HTTPS]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.ConfigureHTTPS" >}}
-[Create Self-Signed Certificates]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.CreateSelfSignedCertificates" >}}
[Make Installation Artefacts Available]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.MakeInstallationArtefactsAvailableNew" >}}
-[Grafana 10.4.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.10_4_1.Windows" >}}
-[Grafana Loki 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_0_0.GrafanaLokiInstallZip" >}}
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.WindowsInstaller" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.GrafanaLokiInstallZip" >}}
[Install Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.MainDoc" >}}
-[Install IIS Basic Authentication]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.InstallIISBasicAuthentication" >}}
[installation]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.InstallCertificate" >}}
[Let’s Encrypt]: {{< url path="LetsEncrypt.MainDoc" >}}
-[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
[SSL Best Practices]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.SSLBestPractices" >}}
[URL Rewrite module 2.1]: {{< url path="IIS.Downloads.UrlRewrite-2_1" >}}
[Port Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.PortRequirements" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
index a0373aefd..823154490 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
@@ -9,7 +9,7 @@ weight: 60
This guide describes where to get the default {{% ctx %}} Dashboards from and how to import them for use in Grafana.
-Please ensure that the Installations for [Grafana][] and [Loki][] have been completed before starting this section.
+Please ensure that the Installations for [Grafana][], [Loki][] and [Alloy] have been completed before starting this section.
## Configure Loki Data Source in Grafana
@@ -47,13 +47,18 @@ Please ensure that the Installations for [Grafana][] and [Loki][] have been comp
1. Go to *Dashboards* via the menu on the left sidebar.
1. Click the *New* button and select *Import* from the drop-down menu.
1. Click the *Upload JSON file* button.
-1. Locate the `Flow Execution Requests.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
+1. Locate the `Flow Execution Details.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
1. Select the file and click *Open*.
1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
1. Select your configured Loki data source from the dropdown menu.
1. Click *Import*.
+1. Repeat steps 2 - 8 for the `Flow Execution Requests.json` file.
1. Repeat steps 2 - 8 for the `Platform Health.json` file.
+{{% alert title="Warning" color="warning" %}}
+The *Flow Execution Details* dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
## Configure Data Sources
It is necessary to update the Custom Filter inside the dashboards to use the correct data source.
@@ -64,7 +69,7 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
1. To open a dashboard:
1. Go to *Dashboards* via the menu on the left sidebar.
1. Click the folder name that the dashboards were imported to.
- 1. Click the *Flow Execution Requests* dashboard to open it.
+ 1. Click the *Flow Execution Details* dashboard to open it.
1. Open the *Dashboard settings* menu via the cog icon in the top right-hand side of the dashboard.
1. Click *Variables* from the top menu of the *Settings* page.
1. Click *CustomFilter* at the bottom of the *Variables* list.
@@ -72,13 +77,15 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
1. Click *Apply*.
1. Click the dashboard name in the breadcrumb at the top left corner of the page to go back to the dashboard.
1. Click the + icon next to the Custom Filter to confirm that a list of available filter options is visible.
+1. Repeat steps 2 - 9 for the *Flow Execution Requests* dashboard.
1. Repeat steps 2 - 9 for the *Platform Health* dashboard.
## Next Steps?
1. [Try it Out][]
-[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.GrafanaDashboardsZip" >}}
+[Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.MainDoc" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
[Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.MainDoc" >}}
[Loki]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.MainDoc" >}}
[Try it Out]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
index 8e60d6f7a..76dbd552c 100644
--- a/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
+++ b/content/en/docs/2025.3/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
@@ -17,7 +17,7 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
| Property | Value |
|---------------|-------------------------------------------------------------------------------------|
| Action | POST |
- | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
| Content Type | application/json |
| Body | {} |
| Authentication| Basic |
@@ -27,6 +27,15 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
{{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
1. Once the request has completed, using a web browser, log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
1. Open the *Dashboards* page via the menu on the left sidebar.
1. Click the folder name that the dashboards were imported to.
1. Click the *Flow Execution Requests* dashboard to open it.
diff --git a/content/en/docs/2025.9/FAQs/change-logging-levels/_index.md b/content/en/docs/2025.9/FAQs/change-logging-levels/_index.md
new file mode 100644
index 000000000..09a7c8d67
--- /dev/null
+++ b/content/en/docs/2025.9/FAQs/change-logging-levels/_index.md
@@ -0,0 +1,20 @@
+---
+title: "How do I change the Logging Level?"
+linkTitle: "How do I change the Logging Level?"
+description: "Instructions on how to change the {{% ctx %}} Logging Level."
+weight: 1000
+---
+
+{{% ctx %}} Logging Levels are set to `Error` by default for most services. However, levels can be changed whilst {{% ctx %}} is running by sending REST calls to the {{% ctx %}} API Gateway service.
+
+{{% alert title="Note" %}}
+Although the Logging Level for the {{% ctx %}} API Gateway service can be increased, it will still always log all API calls regardless of Logging Level configured.
+{{% / alert %}}
+
+If increasing the Logging Level, particularly if increasing for everything or for Block Logging, we recommend that this is done only when required. Increasing log levels will lead to an increase in disk usage and disk writes, which can impact the performance of the {{% ctx %}} platform if not monitored.
+
+Whilst increased Logging Levels are in place, we would recommend closely monitoring system performance and disk space usage.
+
+All REST calls to update Logging Levels use Basic Auth and can be made using REST clients such as [Postman][] or using scripts such as PowerShell.
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
diff --git a/content/en/docs/2025.9/FAQs/change-logging-levels/change-all-logging.md b/content/en/docs/2025.9/FAQs/change-logging-levels/change-all-logging.md
new file mode 100644
index 000000000..05085ad7f
--- /dev/null
+++ b/content/en/docs/2025.9/FAQs/change-logging-levels/change-all-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change All Logging Levels"
+linkTitle: "Change All Logging Levels"
+description: "Instructions on how to change the Logging Level for All Logging."
+weight: 10
+---
+
+# {{% param title %}}
+
+To change the Logging Level for all services, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.9/FAQs/change-logging-levels/change-block-logging.md b/content/en/docs/2025.9/FAQs/change-logging-levels/change-block-logging.md
new file mode 100644
index 000000000..9c983c5a7
--- /dev/null
+++ b/content/en/docs/2025.9/FAQs/change-logging-levels/change-block-logging.md
@@ -0,0 +1,84 @@
+---
+title: "Change Block Logging Level"
+linkTitle: "Change Block Logging Level"
+description: "Instructions on how to change the Logging Level for Block Logging."
+weight: 5
+---
+
+# {{% param title %}}
+
+Block Logging in {{% ctx %}} logs the following Block Properties by default regardless of the log level configured:
+
+* Execute Data Command
+ * Command > commandText
+ * Command > parameters
+* Execute Http Request
+ * Http Request
+ * Http Response
+* Execute Soap Request
+ * Soap Request
+ * Soap Response
+* Execute PowerShell Script
+ * Script
+ * Parameters
+ * Outputs
+ * Records
+* Execute Ssh Command
+ * Command
+ * Response
+ * Ssh Logs
+
+To change the Logging Level for Block Logging so that every block is logged when executed, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/workspaces/blocks/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.9/FAQs/change-logging-levels/change-flow-logging.md b/content/en/docs/2025.9/FAQs/change-logging-levels/change-flow-logging.md
new file mode 100644
index 000000000..6aa8a4e9d
--- /dev/null
+++ b/content/en/docs/2025.9/FAQs/change-logging-levels/change-flow-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change Flow Logging Level"
+linkTitle: "Change Flow Logging Level"
+description: "Instructions on how to change the Logging Level for Flow Logging."
+weight: 1
+---
+
+# {{% param title %}}
+
+To change the Logging Level for Flow Logging, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
index eb64f53ad..dab0c3593 100644
--- a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
+++ b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -18,4 +18,4 @@ This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensur
1. [Post-Upgrade][]
[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeGateway" >}}
-[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.PostUpgrade" >}}
\ No newline at end of file
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md
index f4130d7a5..d9491a473 100644
--- a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md
+++ b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md
@@ -35,6 +35,6 @@ On each Application Server that Promtail is installed on:
1. [Migrate Promtail to Grafana Alloy][Migrate to Alloy]
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
+[Grafana Alloy 1.10.2]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_10_2.Windows" >}}
[Grafana Alloy Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaAlloyInstallZip" >}}
[Migrate to Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.MigrateToAlloy" >}}
diff --git a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md
index 6a54769a7..f0e157e13 100644
--- a/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md
+++ b/content/en/docs/2025.9/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md
@@ -72,6 +72,6 @@ Grafana Alloy requires a domain user that is not a member of the Local Administr
[Grafana 12.1.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.12_1_1.Windows" >}}
[Grafana Loki 3.5.5]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_5_5.GrafanaLokiInstallZip" >}}
[Grafana Loki Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaLokiInstallZip" >}}
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
+[Grafana Alloy 1.10.2]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_10_2.Windows" >}}
[Grafana Alloy Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaAlloyInstallZip" >}}
[Upgrade Grafana]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
diff --git a/content/en/docs/2025.9/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md b/content/en/docs/2025.9/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
index e1d8e2409..1ce8f775d 100644
--- a/content/en/docs/2025.9/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
+++ b/content/en/docs/2025.9/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
@@ -7,96 +7,114 @@ weight: 100
# {{% param title %}}
-{{< workinprogress >}}
-
## Summary
-TODO
+The Variable Editor is used to reference any available [variable][What is a Variable?] that is in scope of the [block][What is a Block?] and can be used with most [block properties][What is a Block Property?].
+
+{{< figure src="/images/Variable Editor.png" >}}
## Using Variables
-TODO:
+The variables available to the Variable Editor are restricted by the [scope][Variable Scopes] of the currently selected block, which in turn is determined by the [workspace][What is a Workspace?] containing it.
+
+The variable is referenced by either entering the variable name (without the prefix of `($)`) into the Variable Editor, or by selecting an available variable from the dropdown, which is revealed when the Variable Editor is selected.
-- You can use any available variable.
-- Available variables are restricted by the scope of the currently selected block
-- All available variables will be shown when the variable editor is empty; typing in the editor will filter the available variables with those that match (contains text) on either the variable name or scope
+If the editor’s field is empty, all available variables will be displayed in the dropdown.
-TODO: Image of using a variable
+{{< figure src="/images/Variable Editor - Select Variable.png" >}}
-TODO: Image of selecting available variables
+Typing characters into the Variable Editor will filter the available variables displayed to those with their name or scope containing a case-insensitive match of the text entered.
+
+{{< figure src="/images/Variable Editor - Filter Variables.png" >}}
### Scoped Variables
-TODO:
+Variables are scoped by the workspace that contains the selected block. {{% ctx %}} uses the principle of inherited scope in that variables available for use in the Variable Editor are those created in the current workspace and those inherited from variables scoped to the parent workspace.
-- Available variables are scoped by the workspace of the block selected
-- Can see variables of the same name that are on accessible scopes
-- Link to known limitation. If there are two or more variables with the same name, the variable with the closest scope will be always used even if another is selected
+If two or more different variables have the same case-insensitive variable name but belong to different scopes, only the variable with the closest scope to the scope of the selected block will be used or displayed in the Variable Editor dropdown.
-TODO: Image of scoped variables (different names and same names)
+{{< figure src="/images/Variable Editor - Scoped Variables.png" >}}
### Accessing Variable Properties or Indexes
-TODO:
+[Properties][Variable Properties] and [indexes][Variable Indexes] of the data type contained in a variable for both Input and Output properties may be expressed in the Variable Editor.
-- Properties and indexes can be accessed from the Variable editor
-- Translation error shown in messages viewer when using properties or indexes incorrectly for variable that is not dynamic
+However, if an index is used with a variable in an output property, the variable must have already been created and instantiated to a suitable data type, otherwise a translation error will be displayed when an attempt to execute the flow is made.
-TODO: Image of accessing variable property and index
+In addition, for input or output property types, if the data type contained in the variable is not dynamic and the property or index used does not exist, a translation error will be displayed when an attempt to execute the flow is made.
-## Missing Variables
+Conversely, If the data type contained in the variable is dynamic and the property or index does not exist, a translation error will not be displayed but a runtime exception will be raised when the flow is executed.
+
+{{< figure src="/images/Variable Editor - Variable Properties.png">}}
-TODO:
+## Missing Variables
-- If a variable does not exist, then a orange border will be shown around the Variable editor
-- It is possible to create a new variable from a missing one using the variable editor
+If the text entered in the Variable Editor does not match that of a created variable, i.e., the variable does not exist, then a red border with be shown around the Variable Editor. However, it is possible to [create][Creating Variables] a new variable of that name using the Variable Editor.
-TODO: Image of orange border for missing variables
+{{< figure src="/images/Variable Editor - Missing Variable.png" >}}
## Creating Variables
-TODO:
+If a variable does not already exist, the Variable Editor can be used to create a new variable, scoped to the current workspace.
+
+To create a new variable, enter the new variable’s name in the Variable Editor. The dropdown will reveal a filtered list of available variables, where the name or scope of variable contains the case-insensitive text entered, plus the option to create a new variable.
-- If a variable does not already exist, the variable editor can be used to create a new one at the current scope
-- If the variable name is invalid ([C# identifier naming rules][]) then there will be no option to create a new variable
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to create a new variable will not be displayed.
-TODO: Image of option to create a new variable
+{{< figure src="/images/Variable Editor - Create Variable.png" >}}
## Renaming Variables
-TODO:
+If the Variable Editor already contains a reference to an existing variable, entering the name for a variable that does not exist will not only offer the option to [create][Creating Variables] a new variable in the dropdown, but it will also display the option to rename the existing variable to that of the name entered.
+
+If an existing variable is renamed in the Variable Editor, then all other references to the existing variable will also be changed to the new variable name throughout the flow.
-- If a variable editor already contains a reference to a variable that exists, typing the name of a non-existent variable will provide the option to rename the previously selected variable (and all references to it within the flow) to the new variable name
-- If the variable name is invalid ([C# identifier naming rules][]) then there will be no option to rename the variable
-- Renaming a variable does not include any index or method expressions (e.g. renaming to `($)NewVar.ToString()` will rename the selected variable to `($)NewVar`)
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to rename the variable will not be displayed.
-TODO: Image of option to rename a variable
+Renaming a variable will keep intact any indexes or property references to the object contained in the variable; any changes made to the indexes or property references will not affect the indexes or property references elsewhere in the flow.
+
+{{< figure src="/images/Variable Editor - Rename Variable.png" >}}
## Remarks
### Known Limitations
-TODO:
+* When two or more characters are entered into the Variable Editor, causing the dropdown to display a list of available variables, the variable name of the first closest match is sometimes displayed in the Variable Editor, e.g., entering My will cause MyVar to be displayed in the Variable Editor, however, pressing the Tab key will not automatically enter the full variable name. The variable name must either be entered in full, or an option on the dropdown must be selected.
-- If there are two or more variables with the same name, the variable with the closest scope will be always used even if another is selected
-- Currently, available variables are not restricted based on the type of the variable and if that is valid for the selected property
+* Variable references used elsewhere in the flow as the index to other variables, e.g. the variable Var2 used in the reference `Var1[($)Var2]`, will remain referencing Var2 even when the variable Var2 is renamed in the Variable Editor or Variables Grid.
## See Also
### Related Concepts
-TODO
+* [Blocks][What is a Block?]
+* [Block Properties][What is a Block Property?]
+* [Variable Scopes][]
+* [Variables][What is a Variable?]
+* [Workspaces][What is a Workspace?]
### Related Blocks
-TODO
+* [All Blocks][Blocks]
### Related Data Types
-TODO
+* [All Data Types][Reference Data Types]
### External Documentation
-TODO
+* [C# identifier naming rules][]
+
+[Creating Variables]: {{< ref "#creating-variables" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Reference Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Variable Indexes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Indexes" >}}
+[Variable Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Properties" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
[C# identifier naming rules]: {{< url path="MSDocs.CSharp.IdentifierNamingRules" >}}
diff --git a/content/en/docs/2025.9/Tutorials/Administration/package-management.md b/content/en/docs/2025.9/Tutorials/Administration/package-management.md
index 0adf8f5af..a5b318af9 100644
--- a/content/en/docs/2025.9/Tutorials/Administration/package-management.md
+++ b/content/en/docs/2025.9/Tutorials/Administration/package-management.md
@@ -61,7 +61,7 @@ weight: 200
#### Create a Trigger on a Package Version
-{{< scribe title="How_to_Create_a_Trigger_on_a_CORTEX_Package" id="z6CwThFVTHSRdL1mAMFPsQ" >}}
+{{< scribe title="How_to_Create_a_Trigger_on_a_CORTEX_Package" id="XXso2_3PQfOyVnii2sSWxA" >}}
### Running Executions
diff --git a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
index 102f60ce0..1ccc49672 100644
--- a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
+++ b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/import-dashboards.md
@@ -32,13 +32,18 @@ Please ensure that the set up for [Grafana][] and [Loki][] have been completed b
1. Click the Dashboards menu item.
1. Click the *New* dropdown and select *Import*.
1. Click on *Upload dashboard JSON file*.
-1. Locate the `Flow Execution Requests.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
+1. Locate the `Flow Execution Details.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
1. Select the file and click *Open*.
1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
1. Select your [configured Loki data source][] from the dropdown menu, e.g. *grafanacloud-cortex-logs*.
1. Click *Import*.
+1. Repeat steps 2 - 10 for the `Flow Execution Requests.json` file.
1. Repeat steps 2 - 10 for the `Platform Health.json` file.
+{{% alert title="Warning" color="warning" %}}
+The *Flow Execution Details* dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
## Configure Data Sources
It is necessary to update the Custom Filter inside the dashboards to use the correct data source.
@@ -66,6 +71,6 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
[configured Loki data source]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.MainDoc" >}}
[Grafana]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupGrafana.MainDoc" >}}
-[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.4_2_1.GrafanaDashboardsZip" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
[Loki]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupLoki.MainDoc" >}}
[Try it Out]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.TryItOut.MainDoc" >}}
diff --git a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
index 60f4c0c6e..ee755708d 100644
--- a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
+++ b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
@@ -14,7 +14,7 @@ This guide describes how to configure Grafana Alloy on the Application Server(s)
## Configure Grafana Alloy
1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
-1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{_[0-9][0-9][0-9],}.json"`.
+1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json"`.
1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
1. Set the Grafana Loki `url` in the `loki.write "default"` > `endpoint` section, which can be found at the end of the file, with the url value noted down during the [Setup Grafana Loki][] steps.
diff --git a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
index 9972851c7..90e348d2b 100644
--- a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
+++ b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
@@ -11,7 +11,7 @@ This guide describes how to install Grafana Alloy on the Application Server(s).
## Install Grafana Alloy
-1. Download the [Grafana Alloy 1.10.2][] archive.
+1. Download the [Grafana Alloy 1.15.1][] archive.
1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
1. Download the [Grafana Alloy.zip][] archive and extract its contents alongside the previously extracted Grafana Alloy `alloy-installer-windows-amd64.exe`.
This archive contains the `config.alloy` configuration file and PowerShell scripts to install Grafana Alloy as a Windows service.
@@ -26,6 +26,6 @@ This archive contains the `config.alloy` configuration file and PowerShell scrip
1. [Configure Grafana Alloy][]
[Configure Grafana Alloy]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.InstallAlloy.ConfigureAlloy.MainDoc" >}}
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
-[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.4_2_1.GrafanaAlloyInstallZip" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaAlloyInstallZip" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
diff --git a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
index 1abad13b0..6acc51610 100644
--- a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
+++ b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/prerequisites.md
@@ -21,7 +21,7 @@ The application servers must have internet access in order to communicate with t
| Server Role | Windows Server[^1] | Other Software |
|--------------------|------------------------------------------------|--------------------|
-| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | [Grafana Alloy 1.10.2][] |
+| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | [Grafana Alloy 1.15.1][] |
[^1]: Windows Server Standard and Datacenter editions are supported. Filesystem **must be NTFS** and networking **must use IPv4**. Linux is not supported, but may be in the future.
@@ -59,5 +59,5 @@ Grafana Alloy requires a domain user that is not a member of the Local Administr
[2019 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2019" >}}
[2022 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2022" >}}
[Architecture]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.Architecture.MainDoc" >}}
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
[Set up Grafana]: {{< url path="Cortex.GettingStarted.Cloud.AddObservabilityToInnovation.Grafana.SetupGrafana.MainDoc" >}}
diff --git a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
index 64115dc9a..c7ceaba47 100644
--- a/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
+++ b/content/en/docs/2025.9/getting-started/cloud/add-observability-to-innovation/Grafana/try-it-out.md
@@ -27,6 +27,16 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
{{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
1. Once the request has completed, using a web browser, log in to your configured Grafana.
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the folder name that the dashboards were imported to, if not already expanded.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
1. Click the Dashboards menu item.
1. Click the folder name that the dashboards were imported to, if not already expanded.
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
index eb7b152ee..990eae7ad 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/configure-alloy.md
@@ -30,7 +30,7 @@ To import the CA certificate:
## Configure Grafana Alloy
1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
-1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{_[0-9][0-9][0-9],}.json"`.
+1. Set the `__path__` in the `local.file_match "ApiGateway"` > `path_targets` section to the path of the `Logs` folder for the API Gateway Service, e.g. `"C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json"`.
1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
1. Set the Grafana Loki `url` in the `loki.write "default"` > `endpoint` section which can be found at the end of the file.
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
index d6e1e6005..5cea6a2c8 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-alloy/install-alloy.md
@@ -11,7 +11,7 @@ This guide describes how to install Grafana Alloy on the Application Server(s).
## Install Grafana Alloy
-1. Download the [Grafana Alloy 1.10.2][] archive.
+1. Download the [Grafana Alloy 1.15.1][] archive.
1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
1. Download the [Grafana Alloy.zip][] archive and extract its contents alongside the previously extracted Grafana Alloy `alloy-installer-windows-amd64.exe`.
This archive contains the `config.alloy` configuration file and PowerShell scripts to install Grafana Alloy as a Windows service.
@@ -26,7 +26,7 @@ This archive contains the `config.alloy` configuration file and PowerShell scrip
1. [Configure Grafana Alloy][]
[Configure Grafana Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.ConfigureAlloy" >}}
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
-[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.4_2_1.GrafanaAlloyInstallZip" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Alloy.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaAlloyInstallZip" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
[Reverse Proxy Authentication]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.ConfigureAuthentication" >}}
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
index 105c263c1..ac31059d9 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-grafana/install-grafana.md
@@ -11,7 +11,7 @@ This guide describes how to install Grafana on the Web Application Server. Pleas
## Install Grafana
-1. Download the [Grafana 12.1.1][] Windows installer.
+1. Download the [Grafana 13.0.1][] Windows installer.
1. Run the installer and install Grafana to a suitable location.
## Next Steps?
@@ -19,6 +19,5 @@ This guide describes how to install Grafana on the Web Application Server. Pleas
1. [Configure Grafana][]
[Configure Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.ConfigureGrafana" >}}
-[Grafana 12.1.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.12_1_1.Windows" >}}
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.WindowsInstaller" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
-[Software Requirements]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.SoftwareRequirements" >}}
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
index 5dea373d6..dce9df684 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/install-loki/install-loki.md
@@ -11,7 +11,7 @@ This guide describes how to install Grafana Loki on the Web Application Server.
## Install Grafana Loki
-1. Download [Grafana Loki 3.5.5][] archive.
+1. Download [Grafana Loki 3.7.1][] archive.
1. Extract content of the downloaded archive to a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
1. Download the [Grafana Loki Install.zip][] archive and extract its contents alongside the previously extracted Grafana Loki `loki-windows-amd64.exe`.
This archive contains the `loki-local-config.yaml` configuration file, [NSSM][] (the Non-Sucking Service Manager program) and PowerShell scripts to help manage Grafana Loki as a Windows service.
@@ -25,7 +25,7 @@ This archive contains the `loki-local-config.yaml` configuration file, [NSSM][]
1. [Configure Loki][]
[Configure Loki]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.ConfigureLoki" >}}
-[Grafana Loki 3.5.5]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_5_5.GrafanaLokiInstallZip" >}}
-[Grafana Loki Install.zip]: {{< url path="GitHub.Cortex.Observability.4_2_1.GrafanaLokiInstallZip" >}}
+[Grafana Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.GrafanaLokiInstallZip" >}}
+[Grafana Loki Install.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaLokiInstallZip" >}}
[NSSM]: {{< url path="NSSM.MainDoc" >}}
[Prerequisites]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Prerequisites" >}}
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
index 20fe1d777..05ac508b3 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/prerequisites.md
@@ -40,8 +40,8 @@ The application servers (as described in {{< ahref path="Cortex.GettingStarted.O
| Server Role | Windows Server[^1] | IIS[^2] | Other Software |
|------------------|-------------------------|---------|----------|
-| Web Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | 10.0.20348[^3] 10.0.17763[^4] [URL Rewrite module 2.1][] | [Grafana 12.1.1][] *Enterprise Edition* [Grafana Loki 3.5.5][]|
-| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | | [Grafana Alloy 1.10.2][]|
+| Web Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | 10.0.20348[^3] 10.0.17763[^4] [URL Rewrite module 2.1][] | [Grafana 13.0.1][] *Enterprise Edition* [Grafana Loki 3.7.1][]|
+| Application Server | [2022 (x64)][] *Recommended* [2019 (x64)][] | | [Grafana Alloy 1.15.1][]|
[^1]: Windows Server Standard and Datacenter editions are supported. Filesystem **must be NTFS** and networking **must use IPv4**. Linux is not supported, but may be in the future.
[^2]: IIS is supported; other web servers, including IIS Express are not supported.
@@ -159,11 +159,10 @@ Grafana Alloy requires a domain user that is not a member of the Local Administr
[2022 (x64)]: {{< url path="Microsoft.Downloads.Windows.Server2022" >}}
[Architecture]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Architecture" >}}
[configuring Grafana to use HTTPS]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.ConfigureHTTPS" >}}
-[Create Self-Signed Certificates]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.Advanced.CreateSelfSignedCertificates" >}}
[Make Installation Artefacts Available]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.MakeInstallationArtefactsAvailableNew" >}}
-[Grafana 12.1.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.12_1_1.Windows" >}}
-[Grafana Alloy 1.10.2]: {{< url path="Grafana.Products.Loki.Alloy.1_10.2" >}}
-[Grafana Loki 3.5.5]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_5_5.GrafanaLokiInstallZip" >}}
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.WindowsInstaller" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Grafana Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.GrafanaLokiInstallZip" >}}
[Install Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.MainDoc" >}}
[installation]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.InstallCertificate" >}}
[Let’s Encrypt]: {{< url path="LetsEncrypt.MainDoc" >}}
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
index 50bd252a7..823154490 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/setup-grafana.md
@@ -9,7 +9,7 @@ weight: 60
This guide describes where to get the default {{% ctx %}} Dashboards from and how to import them for use in Grafana.
-Please ensure that the Installations for [Grafana][] and [Loki][] have been completed before starting this section.
+Please ensure that the Installations for [Grafana][], [Loki][] and [Alloy] have been completed before starting this section.
## Configure Loki Data Source in Grafana
@@ -47,13 +47,18 @@ Please ensure that the Installations for [Grafana][] and [Loki][] have been comp
1. Go to *Dashboards* via the menu on the left sidebar.
1. Click the *New* button and select *Import* from the drop-down menu.
1. Click the *Upload JSON file* button.
-1. Locate the `Flow Execution Requests.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
+1. Locate the `Flow Execution Details.json` file extracted from the downloaded `Grafana.Dashboards.zip`.
1. Select the file and click *Open*.
1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
1. Select your configured Loki data source from the dropdown menu.
1. Click *Import*.
+1. Repeat steps 2 - 8 for the `Flow Execution Requests.json` file.
1. Repeat steps 2 - 8 for the `Platform Health.json` file.
+{{% alert title="Warning" color="warning" %}}
+The *Flow Execution Details* dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
## Configure Data Sources
It is necessary to update the Custom Filter inside the dashboards to use the correct data source.
@@ -64,7 +69,7 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
1. To open a dashboard:
1. Go to *Dashboards* via the menu on the left sidebar.
1. Click the folder name that the dashboards were imported to.
- 1. Click the *Flow Execution Requests* dashboard to open it.
+ 1. Click the *Flow Execution Details* dashboard to open it.
1. Open the *Dashboard settings* menu via the cog icon in the top right-hand side of the dashboard.
1. Click *Variables* from the top menu of the *Settings* page.
1. Click *CustomFilter* at the bottom of the *Variables* list.
@@ -72,13 +77,15 @@ To do this, follow these steps for all default {{% ctx %}} dashboards imported:
1. Click *Apply*.
1. Click the dashboard name in the breadcrumb at the top left corner of the page to go back to the dashboard.
1. Click the + icon next to the Custom Filter to confirm that a list of available filter options is visible.
+1. Repeat steps 2 - 9 for the *Flow Execution Requests* dashboard.
1. Repeat steps 2 - 9 for the *Platform Health* dashboard.
## Next Steps?
1. [Try it Out][]
-[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.4_2_1.GrafanaDashboardsZip" >}}
+[Alloy]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallAlloy.MainDoc" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
[Grafana]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallGrafana.MainDoc" >}}
[Loki]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.InstallLoki.MainDoc" >}}
[Try it Out]: {{< url path="Cortex.GettingStarted.OnPremise.AddObservabilityToInnovation.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
index 019415dfc..c838ca748 100644
--- a/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
+++ b/content/en/docs/2025.9/getting-started/on-premise/add-observability-to-innovation/Grafana/try-it-out.md
@@ -27,6 +27,15 @@ This test uses the test flow published as part of testing the {{% ctx %}} instal
{{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
1. Once the request has completed, using a web browser, log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
1. Open the *Dashboards* page via the menu on the left sidebar.
1. Click the folder name that the dashboards were imported to.
1. Click the *Flow Execution Requests* dashboard to open it.
diff --git a/content/en/docs/2026.3/FAQs/_index.md b/content/en/docs/2026.3/FAQs/_index.md
new file mode 100644
index 000000000..936fa46c6
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/_index.md
@@ -0,0 +1,6 @@
+---
+title: "FAQs"
+linkTitle: "FAQs"
+description: "Answers to our most frequently asked questions."
+weight: 10000
+---
diff --git a/content/en/docs/2026.3/FAQs/change-logging-levels/_index.md b/content/en/docs/2026.3/FAQs/change-logging-levels/_index.md
new file mode 100644
index 000000000..09a7c8d67
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/change-logging-levels/_index.md
@@ -0,0 +1,20 @@
+---
+title: "How do I change the Logging Level?"
+linkTitle: "How do I change the Logging Level?"
+description: "Instructions on how to change the {{% ctx %}} Logging Level."
+weight: 1000
+---
+
+{{% ctx %}} Logging Levels are set to `Error` by default for most services. However, levels can be changed whilst {{% ctx %}} is running by sending REST calls to the {{% ctx %}} API Gateway service.
+
+{{% alert title="Note" %}}
+Although the Logging Level for the {{% ctx %}} API Gateway service can be increased, it will still always log all API calls regardless of Logging Level configured.
+{{% / alert %}}
+
+If increasing the Logging Level, particularly if increasing for everything or for Block Logging, we recommend that this is done only when required. Increasing log levels will lead to an increase in disk usage and disk writes, which can impact the performance of the {{% ctx %}} platform if not monitored.
+
+Whilst increased Logging Levels are in place, we would recommend closely monitoring system performance and disk space usage.
+
+All REST calls to update Logging Levels use Basic Auth and can be made using REST clients such as [Postman][] or using scripts such as PowerShell.
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
diff --git a/content/en/docs/2026.3/FAQs/change-logging-levels/change-all-logging.md b/content/en/docs/2026.3/FAQs/change-logging-levels/change-all-logging.md
new file mode 100644
index 000000000..05085ad7f
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/change-logging-levels/change-all-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change All Logging Levels"
+linkTitle: "Change All Logging Levels"
+description: "Instructions on how to change the Logging Level for All Logging."
+weight: 10
+---
+
+# {{% param title %}}
+
+To change the Logging Level for all services, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2026.3/FAQs/change-logging-levels/change-block-logging.md b/content/en/docs/2026.3/FAQs/change-logging-levels/change-block-logging.md
new file mode 100644
index 000000000..9c983c5a7
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/change-logging-levels/change-block-logging.md
@@ -0,0 +1,84 @@
+---
+title: "Change Block Logging Level"
+linkTitle: "Change Block Logging Level"
+description: "Instructions on how to change the Logging Level for Block Logging."
+weight: 5
+---
+
+# {{% param title %}}
+
+Block Logging in {{% ctx %}} logs the following Block Properties by default regardless of the log level configured:
+
+* Execute Data Command
+ * Command > commandText
+ * Command > parameters
+* Execute Http Request
+ * Http Request
+ * Http Response
+* Execute Soap Request
+ * Soap Request
+ * Soap Response
+* Execute PowerShell Script
+ * Script
+ * Parameters
+ * Outputs
+ * Records
+* Execute Ssh Command
+ * Command
+ * Response
+ * Ssh Logs
+
+To change the Logging Level for Block Logging so that every block is logged when executed, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/workspaces/blocks/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2026.3/FAQs/change-logging-levels/change-flow-logging.md b/content/en/docs/2026.3/FAQs/change-logging-levels/change-flow-logging.md
new file mode 100644
index 000000000..6aa8a4e9d
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/change-logging-levels/change-flow-logging.md
@@ -0,0 +1,63 @@
+---
+title: "Change Flow Logging Level"
+linkTitle: "Change Flow Logging Level"
+description: "Instructions on how to change the Logging Level for Flow Logging."
+weight: 1
+---
+
+# {{% param title %}}
+
+To change the Logging Level for Flow Logging, the below PowerShell script can be used to make a REST call against your {{% ctx %}} platform.
+
+1. Run Windows PowerShell ISE as Administrator.
+1. Copy the following script into the PowerShell window:
+
+ ``` powershell
+ $serverFQDN = "server.domain.com"
+ $APIGatewayPort = 8722
+ $loglevel = 4
+ $user = "BasicAuthUser"
+
+ $securePass = Read-Host -Prompt "Enter password for $user" -AsSecureString
+
+ $ptr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($securePass)
+ try {
+ $plainPass = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
+
+ $authBytes = [System.Text.Encoding]::ASCII.GetBytes("$user`:$plainPass")
+ $base64AuthInfo = [Convert]::ToBase64String($authBytes)
+ }
+ finally {
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr)
+
+ $plainPass = $null
+ Remove-Variable -Name plainPass -Force
+ }
+
+ $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
+ $headers.Add("Content-Type", "application/json")
+ $headers.Add("Accept", "application/json")
+ $headers.Add("Authorization", "Basic $base64AuthInfo")
+ $path = "applications/execution/services/engine/blocks/packages/versions/executions/flows/logging"
+ $body = @"
+ $loglevel
+ "@
+
+ $response = Invoke-RestMethod "https://${serverFQDN}:$APIGatewayPort/api/v1/default/default/$path" -Method PUT -Headers $headers -Body $body
+ $response
+ ```
+
+1. Configure the following variables:
+ * `$serverFQDN` – The fully qualified domain name for the Application Server or Load Balancer
+ * `$APIGatewayPort` – {{% ctx %}} API Gateway Service port (8722) or Load Balancer port (typically 443 or 8722)
+ * `$loglevel` – Desired log level as an integer, `1` is enabled and `4` is the default error level
+ * `$user` – {{% ctx %}} API Gateway Basic Auth Username
+
+1. Execute the script, entering the Basic Auth User's password when prompted.
+1. Confirm success response:
+
+ If the call was successful, there should be no errors and the following response should be received
+
+ ``` powershell
+ LogLevel was successfully configured.
+ ```
diff --git a/content/en/docs/2026.3/FAQs/check-cluster-health/_index.md b/content/en/docs/2026.3/FAQs/check-cluster-health/_index.md
new file mode 100644
index 000000000..9c462d343
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/check-cluster-health/_index.md
@@ -0,0 +1,6 @@
+---
+title: "How do I check cluster health?"
+linkTitle: "How do I check cluster health?"
+description: "Instructions on how to check the health of your cluster."
+weight: 100
+---
diff --git a/content/en/docs/2026.3/FAQs/check-cluster-health/multi-server-with-ha.md b/content/en/docs/2026.3/FAQs/check-cluster-health/multi-server-with-ha.md
new file mode 100644
index 000000000..c2bd40ffa
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/check-cluster-health/multi-server-with-ha.md
@@ -0,0 +1,23 @@
+---
+title: "Multiple Server with HA"
+linkTitle: "Multiple Server with HA"
+description: "Instructions on how to check the health of your multiple server cluster."
+weight: 1
+---
+
+# Check Cluster Health
+
+## Import Client Certificate
+
+In order to access the [Service Fabric Explorer][] to check the health of the cluster, it is necessary for the client certificate specified during the [installation of {{% ctx %}}][Configure Installation Script] to be imported in to the current user store on the machine it is being accessed from.
+
+Instructions on how to do this can be found [here][Import Client Certificate].
+
+## View Cluster Health
+
+1. Open a web browser.
+1. {{< section "/install-application-server/multi-server/check-application-services.md">}}
+
+[Configure Installation Script]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Import Client Certificate]: {{< url path="Cortex.Faqs.ImportClientCertificate.MultiServer" >}}
+[Service Fabric Explorer]: {{< url path="Cortex.Reference.Glossary.P-T.ServiceFabricExplorer" >}}
diff --git a/content/en/docs/2026.3/FAQs/check-cluster-health/single-server-without-ha.md b/content/en/docs/2026.3/FAQs/check-cluster-health/single-server-without-ha.md
new file mode 100644
index 000000000..89ac2d99a
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/check-cluster-health/single-server-without-ha.md
@@ -0,0 +1,23 @@
+---
+title: "Single Server without HA"
+linkTitle: "Single Server without HA"
+description: "Instructions on how to check the health of your single server cluster."
+weight: 2
+---
+
+# Check Cluster Health
+
+## Import Client Certificate
+
+In order to access the [Service Fabric Explorer][] to check the health of the cluster, it is necessary for the client certificate specified during the [installation of {{% ctx %}}][Configure Installation Script] to be imported in to the current user store on the machine it is being accessed from.
+
+Instructions on how to do this can be found [here][Import Client Certificate].
+
+## View Cluster Health
+
+1. Open a web browser.
+1. {{< section "/install-application-server/single-server/check-application-services.md">}}
+
+[Configure Installation Script]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[Import Client Certificate]: {{< url path="Cortex.Faqs.ImportClientCertificate.SingleServer" >}}
+[Service Fabric Explorer]: {{< url path="Cortex.Reference.Glossary.P-T.ServiceFabricExplorer" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/_index.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/_index.md
new file mode 100644
index 000000000..3574aa6fa
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/_index.md
@@ -0,0 +1,8 @@
+---
+title: "How do I configure the code analyser?"
+linkTitle: "How do I configure the code analyser?"
+description: "Instructions on how to configure the code analyser to allow flows to be run."
+weight: 200
+---
+
+{{< section "/configure-code-analyser/configure-code-analyser.md" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/_index.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/_index.md
new file mode 100644
index 000000000..7648e0464
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server With HA"
+linkTitle: "Multiple Server With HA"
+description: "Instructions on how to configure the code analyser on a multiple server cluster."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/disable-code-analyser.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/disable-code-analyser.md
new file mode 100644
index 000000000..3d723e9dd
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/disable-code-analyser.md
@@ -0,0 +1,12 @@
+---
+title: "How do I disable the code analyser on a multiple server cluster?"
+linkTitle: "How do I disable the code analyser on a multiple server cluster?"
+description: "Instructions on how to disable the code analyser on a multiple server cluster."
+weight: 20
+---
+
+# Disable Code Analyser
+
+On each Application Server and the Web Application Server:
+
+{{< section "/configure-code-analyser/multi-server/disable-code-analyser.md" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/update-code-analyser.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/update-code-analyser.md
new file mode 100644
index 000000000..55a0b9533
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/multi-server-with-ha/update-code-analyser.md
@@ -0,0 +1,10 @@
+---
+title: "How do I update the code analyser allowed list on a multiple server cluster?"
+linkTitle: "How do I update the code analyser allowed list on a multiple server cluster?"
+description: "Instructions on how to update the code analyser allowed list on a multiple server cluster."
+weight: 10
+---
+
+# Update Code Analyser Allowed List
+
+{{< section "/configure-code-analyser/update-code-analyser.md" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/_index.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/_index.md
new file mode 100644
index 000000000..2cb23ae24
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server Without HA"
+linkTitle: "Single Server Without HA"
+description: "Instructions on how to configure the code analyser on a single server cluster."
+weight: 20
+---
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/disable-code-analyser.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/disable-code-analyser.md
new file mode 100644
index 000000000..d4abff218
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/disable-code-analyser.md
@@ -0,0 +1,12 @@
+---
+title: "How do I disable the code analyser on a single server cluster?"
+linkTitle: "How do I disable the code analyser on a single server cluster?"
+description: "Instructions on how to disable the code analyser on a single server cluster."
+weight: 20
+---
+
+# Disable Code Analyser
+
+On the Application Server:
+
+{{< section "/configure-code-analyser/single-server/disable-code-analyser.md" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/update-code-analyser.md b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/update-code-analyser.md
new file mode 100644
index 000000000..50cb7ad95
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-code-analyser/single-server-without-ha/update-code-analyser.md
@@ -0,0 +1,10 @@
+---
+title: "How do I update the code analyser allowed list on a single server cluster?"
+linkTitle: "How do I update the code analyser allowed list on a single server cluster?"
+description: "Instructions on how to update the code analyser allowed list on a single server cluster."
+weight: 10
+---
+
+# Update Code Analyser Allowed List
+
+{{< section "/configure-code-analyser/update-code-analyser.md" >}}
diff --git a/content/en/docs/2026.3/FAQs/configure-oidc-authentication/_index.md b/content/en/docs/2026.3/FAQs/configure-oidc-authentication/_index.md
new file mode 100644
index 000000000..9453678bf
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-oidc-authentication/_index.md
@@ -0,0 +1,6 @@
+---
+title: "How do I configure OpenID Connect authentication?"
+linkTitle: "How do I configure OpenID Connect authentication?"
+description: "Instructions on how to configure OpenID Connect authentication for {{% ctx %}} Gateway."
+weight: 300
+---
diff --git a/content/en/docs/2026.3/FAQs/configure-oidc-authentication/microsoft-entra.md b/content/en/docs/2026.3/FAQs/configure-oidc-authentication/microsoft-entra.md
new file mode 100644
index 000000000..56b25fe71
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/configure-oidc-authentication/microsoft-entra.md
@@ -0,0 +1,88 @@
+---
+title: "Microsoft Entra"
+linkTitle: "Microsoft Entra"
+description: "Instructions on how to configure Microsoft Entra OIDC Authentication for use in {{% ctx %}} Gateway."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Configure Microsoft Entra OIDC Provider
+
+{{% alert title="Note" %}}
+In order to configure a Microsoft Entra Provider a Microsoft Azure account with at least the `Application Developer` role is needed. A `Workforce` or `External Tenant` is also required.
+{{% /alert %}}
+
+1. Register {{% ctx %}} Gateway as an application to create a trust relationship between {{% ctx %}} Gateway and the Microsoft Identity Platform:
+ 1. Login to Microsoft Azure and navigate to `Microsoft Entra ID` > `Manage` > `App registrations`.
+ 1. Select `+ New registration`.
+ 1. Enter a meaningful Name for the {{% ctx %}} Gateway application.
+ 1. Select the appropriate Supported account type, e.g. `Accounts in this organizational directory only`.
+ 1. Click `Register`.
+1. Add a Redirect URI to allow {{% ctx %}} Gateway to send log in and log out requests to the Entra endpoint:
+ 1. Select the application registration created in Step 1.
+ 1. Click `Redirect URIs`.
+ 1. Click `+ Add a platform`.
+ 1. Select Single-page application and set:
+ * `Redirect URIs` to `://://redirect`, e.g. `https://server.domain.com/gateway/redirect`.
+ * `Front-channel logout URL` to `https://localhost:44321/signout-callback-oidc`.
+ * `Implicit grant and hybrid flows` to `ID tokens`.
+ 1. Click `Configure`.
+1. Configure permissions for {{% ctx %}} Gateway to access the user's data using Microsoft Graph:
+ 1. Select the application registration created in Step 1.
+ 1. Select `API permissions` from the menu on the left.
+ {{% alert title="Note" %}}The Delegated permission `User.Read` was added automatically when the application was registered.{{% /alert %}}
+ 1. Click `+ Add a permission`
+ * Select `Microsoft Graph`
+ * Select `Application permissions`.
+ * Locate and expand `GroupMember` and select `GroupMember.Read.All` to allow the application to authenticate itself without user interaction or consent.
+ * Click `Add permissions`.
+ 1. Click `+ Add a permission` again.
+ * Select `Microsoft Graph`
+ * Select `Delegated permissions`
+ * Locate and expand `Openid permissions`, and select:
+ * `email` to allow access to view the users’ email address.
+ * `offline_access` to maintain access to data already accessed.
+ * `openid` to allow users to sign in.
+ * `profile` to allow access to view the user’s basic profile.
+ * Click `Add permissions`.
+1. Configure the application registration to return the Entra groups to {{% ctx %}} Gateway:
+ 1. Select the application registration created in Step 1.
+ 1. Select `Token configuration` from the menu on the left.
+ 1. Click `+ Add groups claim`.
+ 1. Select `Security groups`.
+ 1. Locate and expand `ID`.
+ * Select `sAMAccountName`.
+ 1. Click `Add`.
+1. Create credentials for {{% ctx %}} Gateway to authenticate with Entra securely:
+ 1. Select the application registration created in Step 1.
+ 1. Select `Client credentials`.
+ 1. Click `+ New client secret`.
+ 1. Enter a `Description` for the client secret.
+ 1. In the `Expires` dropdown, select an expiration for the secret or specify a custom lifetime.
+ 1. Select `Add`.
+ {{% alert title="Warning" color="warning" %}}Make a note of the client secret Value as this is never displayed again after you have left this page.{{% /alert %}}
+
+## Configure {{% ctx %}} Gateway to use Microsoft Entra Authentication
+
+{{% alert title="Note" %}}
+In order to configure {{% ctx %}} Gateway to use a Microsoft Entra OpenID Connect Provider, an application MUST be registered and configured as specified in {{< ahref path="Cortex.Faqs.ConfigureOidcAuthentication.MicrosoftEntra.Entra" title="Configure Microsoft Entra OIDC Provider" >}}
+{{% /alert %}}
+
+1. Log on to {{% ctx %}} Gateway using the local Administrator account or as a user with the `Admin` role.
+1. Select `Admin` > `Authentication`.
+1. Select the `OpenID Connect` tab.
+1. Click `+ New Provider` and enter the provider details:
+ 1. `Identifier` - a unique free-format identifier for this provider. This cannot be edited once the form has been saved.
+ 1. `Display Name` - free-format text to be displayed on the provider tab and login button.
+ 1. `Authority` - the URL to access the provider authentication. For Microsoft Entra authentication this should be `https://login.microsoftonline.com`.
+ 1. `Tenant Identifier` - the Tenant ID. This can be obtained from the Application registration details in Microsoft Entra by clicking on the registration to display its details. Copy the value for `Directory (tenant) ID`.
+ 1. `Client Identifier` - the Client ID. This can be obtained from the Application registration details in Microsoft Entra by clicking on the registration to display its details. Copy the value for `Application (client) ID`.
+ 1. `Client Secret` - the client secret that was revealed when creating the client credentials for the Application in Microsoft Entra. If you do not have access to the client secret, it will be necessary to create a new client secret in Microsoft Entra - for guidance see step 5 in [Configure Microsoft Entra OIDC][].
+1. Click `Validate` to validate the information entered and enable the Save button.
+ {{% alert title="Note" %}}Validate does not validate the accuracy of the information entered, it only validates that it is of the correct format.{{% /alert %}}
+1. Click `Save` to save the provider’s configuration.
+
+ {{% alert title="Note" %}}It may be necessary to refresh the browser to ensure correct operation.{{% /alert %}}
+
+[Configure Microsoft Entra OIDC]: {{< url path="Cortex.Faqs.ConfigureOidcAuthentication.MicrosoftEntra.Entra" >}}
diff --git a/content/en/docs/2026.3/FAQs/import-client-certificate/_index.md b/content/en/docs/2026.3/FAQs/import-client-certificate/_index.md
new file mode 100644
index 000000000..732186a62
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/import-client-certificate/_index.md
@@ -0,0 +1,6 @@
+---
+title: "How do I import the client certificate used to check cluster health?"
+linkTitle: "How do I import the client certificate used to check cluster health?"
+description: "Instructions on how to import the client certificate used to check the cluster health."
+weight: 100
+---
diff --git a/content/en/docs/2026.3/FAQs/import-client-certificate/multi-server-with-ha.md b/content/en/docs/2026.3/FAQs/import-client-certificate/multi-server-with-ha.md
new file mode 100644
index 000000000..22b2544d8
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/import-client-certificate/multi-server-with-ha.md
@@ -0,0 +1,23 @@
+---
+title: "Multiple Server with HA"
+linkTitle: "Multiple Server with HA"
+description: "Instructions on how to import the client certificate used to check your multiple server cluster health."
+weight: 1
+---
+
+# Import Client Certificate
+
+## Using CA Certificates
+
+In order to check the cluster health in Service Fabric Explorer and RabbitMQ, the certificate specified for `ClientCertificatePath` during [installation of the Application Servers][Configure Application Server Installation Script], or `ServerCertificatePath` during [installation of the Flow Debugger][Configure Flow Debugger Installation Script] will need to be imported to the local certificate store on the machine that is being used to browse from:
+
+{{< section "/faqs/import-ca-client-certificate.md">}}
+
+## Using Self Signed Certificates
+
+In order to check the cluster health in Service Fabric Explorer and RabbitMQ, the certificate generated when specifying `UseSelfSignedCertificates` during [installation of the Application Servers][Configure Application Server Installation Script], or during [installation of the Flow Debugger][Configure Flow Debugger Installation Script] will need to be imported to the local certificate store on the machine that is being used to browse from:
+
+{{< section "/faqs/import-selfsigned-client-certificate.md">}}
+
+[Configure Application Server Installation Script]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Configure Flow Debugger Installation Script]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureDebuggerInstallationScript" >}}
diff --git a/content/en/docs/2026.3/FAQs/import-client-certificate/single-server-without-ha.md b/content/en/docs/2026.3/FAQs/import-client-certificate/single-server-without-ha.md
new file mode 100644
index 000000000..5df26d5d1
--- /dev/null
+++ b/content/en/docs/2026.3/FAQs/import-client-certificate/single-server-without-ha.md
@@ -0,0 +1,22 @@
+---
+title: "Single Server without HA"
+linkTitle: "Single Server without HA"
+description: "Instructions on how to import the client certificate used to check your single server cluster health."
+weight: 1
+---
+
+# Import Client Certificate
+
+## Using CA Certificates
+
+In order to check the cluster health in Service Fabric Explorer and RabbitMQ, the certificate specified for `ServerCertificatePath` during [installation of the Application Servers][Configure Application Server Installation Script] will need to be imported to the local certificate store on the machine that is being used to browse from:
+
+{{< section "/faqs/import-ca-client-certificate.md">}}
+
+## Using Self Signed Certificates
+
+In order to check the cluster health in Service Fabric Explorer and RabbitMQ, the certificate generated when specifying `UseSelfSignedCertificates` during [installation of the Application Servers][Configure Application Server Installation Script] will need to be imported to the local certificate store on the machine that is being used to browse from:
+
+{{< section "/faqs/import-selfsigned-client-certificate.md">}}
+
+[Configure Application Server Installation Script]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
diff --git a/content/en/docs/2026.3/Guides/_index.md b/content/en/docs/2026.3/Guides/_index.md
new file mode 100644
index 000000000..24fab80d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Guides"
+linkTitle: "Guides"
+description: "This section includes all guides for the {{% ctx %}} platform."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-gateway/_index.md b/content/en/docs/2026.3/Guides/cortex-gateway/_index.md
new file mode 100644
index 000000000..830d278ba
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-gateway/_index.md
@@ -0,0 +1,9 @@
+---
+title: "CORTEX Gateway"
+linkTitle: "CORTEX Gateway"
+description: "The centralised web-based portal for accessing all user applications and tooling in the {{% ctx %}} platform."
+weight: 50
+outOfSupport: true
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-gateway/settings/_index.md b/content/en/docs/2026.3/Guides/cortex-gateway/settings/_index.md
new file mode 100644
index 000000000..4303ed2bb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-gateway/settings/_index.md
@@ -0,0 +1,7 @@
+---
+title: "CORTEX Gateway Management"
+linkTitle: "CORTEX Gateway Management"
+description: "{{% ctx %}} Gateway and Studio Management tools and settings"
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-authorisation.md b/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-authorisation.md
new file mode 100644
index 000000000..e4e6647d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-authorisation.md
@@ -0,0 +1,7 @@
+---
+title: "LDAP Authorisation"
+linkTitle: "LDAP Authorisation"
+description: "Configure RBAC by assining roles to security groups."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-connection.md b/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-connection.md
new file mode 100644
index 000000000..9d4f4c87f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-gateway/settings/ldap-connection.md
@@ -0,0 +1,7 @@
+---
+title: "LDAP Connection"
+linkTitle: "LDAP Connection"
+description: "Connect to an Active Directory using LDAP."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/_index.md
new file mode 100644
index 000000000..39f0f630e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/_index.md
@@ -0,0 +1,7 @@
+---
+title: "CORTEX Applications"
+linkTitle: "CORTEX Applications"
+description: "The Service Fabric applications hosting the services within the {{% ctx %}} platform."
+weight: 300
+outOfSupport: true
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/_index.md
new file mode 100644
index 000000000..87cdd11cd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Core Application"
+linkTitle: "Core Application"
+description: "The Core Application."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/_index.md
new file mode 100644
index 000000000..3bb8a5855
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Services"
+linkTitle: "Services"
+description: "The Core Application Services."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/api-gateway-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/api-gateway-service/_index.md
new file mode 100644
index 000000000..31c122c46
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/api-gateway-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "API Gateway Service"
+linkTitle: "API Gateway Service"
+description: "The API Gateway Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/authorisation-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/authorisation-service/_index.md
new file mode 100644
index 000000000..9ff8c5979
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/authorisation-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Authorisation Service"
+linkTitle: "Authorisation Service"
+description: "The Authorisation Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/concurrency-management-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/concurrency-management-service/_index.md
new file mode 100644
index 000000000..8974784b2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/concurrency-management-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Concurrency Management Service"
+linkTitle: "Concurrency Management Service"
+description: "The Concurrency Management Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/configuration-management-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/configuration-management-service/_index.md
new file mode 100644
index 000000000..0e25b5739
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/configuration-management-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Configuration Management Service"
+linkTitle: "Configuration Management Service"
+description: "The Configuration Management Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/data-storage-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/data-storage-service/_index.md
new file mode 100644
index 000000000..61d5fb9d1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/data-storage-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Data Storage Service"
+linkTitle: "Data Storage Service"
+description: "The Data Storage Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/execution-management-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/execution-management-service/_index.md
new file mode 100644
index 000000000..4b49b1866
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/execution-management-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Execution Management Service"
+linkTitle: "Execution Management Service"
+description: "The Execution Management Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/licence-management-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/licence-management-service/_index.md
new file mode 100644
index 000000000..ad3a309fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/licence-management-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Licence Management Service"
+linkTitle: "Licence Management Service"
+description: "The Licence Management Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/listeners-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/listeners-service/_index.md
new file mode 100644
index 000000000..3cc2cd206
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/listeners-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Listeners Service"
+linkTitle: "Listeners Service"
+description: "The Listeners Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/monitoring-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/monitoring-service/_index.md
new file mode 100644
index 000000000..f3ae65537
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/monitoring-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Monitoring Service"
+linkTitle: "Monitoring Service"
+description: "The Monitoring Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/package-management-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/package-management-service/_index.md
new file mode 100644
index 000000000..8e451b3a7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/package-management-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Package Management Service"
+linkTitle: "Package Management Service"
+description: "The Package Management Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/provisioning-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/provisioning-service/_index.md
new file mode 100644
index 000000000..165229e50
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/provisioning-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Provisioning Service"
+linkTitle: "Provisioning Service"
+description: "The Provisioning Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/scheduling-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/scheduling-service/_index.md
new file mode 100644
index 000000000..4a06f4fdf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/scheduling-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Scheduling Service"
+linkTitle: "Scheduling Service"
+description: "The Scheduling Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/triggers-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/triggers-service/_index.md
new file mode 100644
index 000000000..415b9aa71
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/core-application/services/triggers-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Triggers Service"
+linkTitle: "Triggers Service"
+description: "The Triggers Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/_index.md
new file mode 100644
index 000000000..3ec60b6f4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Execution Application"
+linkTitle: "Execution Application"
+description: "The Execution Application."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/_index.md
new file mode 100644
index 000000000..33f2fe7b6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Services"
+linkTitle: "Services"
+description: "The Execution Application Services."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/execution-service/_index.md b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/execution-service/_index.md
new file mode 100644
index 000000000..3c8bea4c3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/cortex-innovation/execution-application/services/execution-service/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Execution Service"
+linkTitle: "Execution Service"
+description: "The Execution Service."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/_index.md
new file mode 100644
index 000000000..c6443f390
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Disaster Recovery Guides"
+linkTitle: "Disaster Recovery Guides"
+description: "This section includes all disaster recovery guides for the {{% ctx %}} platform."
+weight: 30
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..c8e5e84eb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Instructions for disaster recovery of a {{% ctx %}} platform installed on multiple on-premise servers with high availability (HA)."
+weight: 50
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/_index.md
new file mode 100644
index 000000000..43b9c8445
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Backup"
+linkTitle: "Backup"
+description: "Instructions to backup {{% ctx %}} on multiple on-premise servers with high availability (HA)."
+weight: 100
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-of-encryption-key.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-of-encryption-key.md
new file mode 100644
index 000000000..f91905f80
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-of-encryption-key.md
@@ -0,0 +1,28 @@
+---
+title: "Add Backup of Encryption Key"
+linkTitle: "Add Backup of Encryption Key"
+description: "Instructions to backup the Encryption Key."
+weight: 30
+---
+
+# {{% param title %}}
+
+{{< section "/disaster-recovery/encryption-key/backup/description.md">}}
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/encryption-key/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/encryption-key/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/encryption-key/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Add Scheduled Backup to Application Server][]
+
+[Add Scheduled Backup to Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupToApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-to-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-to-application.md
new file mode 100644
index 000000000..96e03ad89
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/add-backup-to-application.md
@@ -0,0 +1,28 @@
+---
+title: "Add Scheduled Backup to Application Server"
+linkTitle: "Add Scheduled Backup to Application Server"
+description: "Instructions to add scheduled backups to the Application Server."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to configure a scheduled backup of the Application Servers. This will backup the application's reliable collections, the cluster's configuration, the service's appsettings, manifests and settings.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Add Scheduled Backups to Web Application Server][]
+
+[Add Scheduled Backups to Web Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupsToWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/pre-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/pre-backup.md
new file mode 100644
index 000000000..9311d6635
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/pre-backup.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Backup"
+linkTitle: "Pre-Backup"
+description: "Information about the steps required to be completed prior to starting the backup process."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the backup of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/disaster-recovery/multi-make-installation-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Add Backup of Encryption Key][]
+
+[Add Backup of Encryption Key]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupOfEncryptionKey" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/_index.md
new file mode 100644
index 000000000..085855920
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Add Scheduled Backups to Web Application Server"
+linkTitle: "Add Scheduled Backups to Web Application Server"
+description: "Instructions to add scheduled backups to the Web Application Server."
+weight: 200
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-flow-debugger.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-flow-debugger.md
new file mode 100644
index 000000000..b3665c6bf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-flow-debugger.md
@@ -0,0 +1,28 @@
+---
+title: "Add Scheduled Backup to Flow Debugger"
+linkTitle: "Add Scheduled Backup to Flow Debugger"
+description: "Instructions to add scheduled backups to the Flow Debugger."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to configure a scheduled backup of the Flow Debugger on the Web Application Server. This will backup the application's reliable collections, the cluster's configuration and the service's appsettings.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Add Scheduled Backup to Gateway][]
+
+[Add Scheduled Backup to Gateway]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupToGateway" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-gateway.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-gateway.md
new file mode 100644
index 000000000..047a41cde
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/backup/web-application-server/add-backup-to-gateway.md
@@ -0,0 +1,22 @@
+---
+title: "Add Scheduled Backup to Gateway"
+linkTitle: "Add Scheduled Backup to Gateway"
+description: "Instructions to add scheduled backups to Gateway."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to configure a scheduled backup of Gateway on the Web Application Server. This will back up the flow repositories, OpenAPI definitions, and the web config file.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/_index.md
new file mode 100644
index 000000000..b35730b64
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Recovery"
+linkTitle: "Recovery"
+description: "Instructions to recover {{% ctx %}} on multiple on-premise servers with high availability (HA)."
+weight: 200
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/pre-recovery.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/pre-recovery.md
new file mode 100644
index 000000000..b7e0730a2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/pre-recovery.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Recovery"
+linkTitle: "Pre-Recovery"
+description: "Information about the steps required to be completed prior to starting the recovery process."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the recovery of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/disaster-recovery/multi-make-installation-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Recover Encryption Key from Backup][]
+
+[Recover Encryption Key from Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Recovery.RecoveryEncryptionKeyFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-application-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-application-from-backup.md
new file mode 100644
index 000000000..2438d1d10
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-application-from-backup.md
@@ -0,0 +1,32 @@
+---
+title: "Recover Application Server from Scheduled Backup"
+linkTitle: "Recover Application Server from Scheduled Backup"
+description: "Instructions to recover the Application Server from scheduled backups."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Application Servers from a backup. This will recover the application's reliable collections. Any recovery needed for the cluster's configuration, the service's appsettings, manifests or settings must be done manually.
+
+### Configure the Recovery Script
+
+{{< section "/disaster-recovery/application-server/recover/configure-recover-script.md">}}
+
+### Run the Recovery Script
+
+{{% alert title="Warning" color="warning" %}}
+A backup policy must be configured on the Application Server before running a recovery, see {{< ahref path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupToApplicationServer" title="Add Scheduled Backup to Application Server" >}} for further information.
+{{% /alert %}}
+
+{{< section "/disaster-recovery/application-server/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Recover Web Application Server from Scheduled Backups][]
+
+[Recover Web Application Server from Scheduled Backups]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Recovery.RecoverWebApplicationServerFromBackups" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-encryption-key-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-encryption-key-from-backup.md
new file mode 100644
index 000000000..b90e635c3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/recover-encryption-key-from-backup.md
@@ -0,0 +1,47 @@
+---
+title: "Recover Encryption Key from Backup"
+linkTitle: "Recover Encryption Key from Backup"
+description: "Instructions to recover the Encryption Key from backups."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Encryption Key from a backup. This will recover the Encryption Key to the application servers, the web application server, and the load balancer server if the built-in load balancer is used.
+
+{{% alert title="Warning" color="warning" %}}
+If recovering to new hardware, the Encryption Key must be recovered before {{% ctx %}} is installed.
+{{% /alert %}}
+
+### Configure the Recovery Script
+1. In the `Cortex Innovation {{< version >}} - App Server Install Scripts\Recovery` folder, locate the `Cortex.Innovation.EncryptionKey.Recover.ps1` script and open it with a text editor.
+1. Configure the script according to the details given below:
+
+ ```powershell
+ .\Cortex.EncryptionKey.Recover.ps1 `
+ -TargetMachines @("app-server1", "app-server2", "app-server3", "lb-server", "web-server") `
+ -BackupPath "\\UncPath\BackupLocation" `
+ -Credential $Credential
+ ```
+
+ | Name | Description |
+ |------------------------------------------------|-------------|
+ |`TargetMachines` | Configure the values to contain the NETBIOS name or fully qualified domain name of the application servers, the web application server and load balancer server if using the built-in load balancer.|
+ |`BackupPath` | Replace `\\UncPath\BackupLocation` with the path of the location the backups are stored in. If the path is a network path then the `Credentials` will be used to access that location.|
+ |`Credential` | The credentials of the user which will be used to access the `BackupPath`. It must be a domain user that is a member of the local Administrators group on the server.
This does not need to be changed, a prompt will appear to enter this information when the script is run.|
+
+1. Save and close `Cortex.Innovation.EncryptionKey.Recover.ps1`.
+
+### Run the Recovery Script
+
+{{< section "/disaster-recovery/encryption-key/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/encryption-key/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Recover Application Server from Scheduled Backup][]
+
+[Recover Application Server from Scheduled Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Recovery.RecoverApplicationServerFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/_index.md
new file mode 100644
index 000000000..993e5e418
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Recover Web Application from Scheduled Backups"
+linkTitle: "Recover Web Application from Scheduled Backups"
+description: "Instructions to recover the Web Application Server from scheduled backups."
+weight: 200
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-flow-debugger-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-flow-debugger-from-backup.md
new file mode 100644
index 000000000..3df2c727a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-flow-debugger-from-backup.md
@@ -0,0 +1,32 @@
+---
+title: "Recover Flow Debugger from Scheduled Backup"
+linkTitle: "Recover Flow Debugger from Scheduled Backup"
+description: "Instructions to recover the Flow Debugger from scheduled backups."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Flow Debugger from a backup. This will recover the application's reliable collections. Any recovery needed for the cluster's configuration, the service's appsettings, manifests or settings must be done manually.
+
+### Configure the Recovery Script
+
+{{< section "/disaster-recovery/application-server/recover/configure-recover-script.md">}}
+
+### Run the Recovery Script
+
+{{% alert title="Warning" color="warning" %}}
+A backup policy must be configured on the Application Server before running a recovery, see {{< ahref path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupToFlowDebugger" title="Add Scheduled Backup to Flow Debugger" >}} for further information.
+{{% /alert %}}
+
+{{< section "/disaster-recovery/application-server/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Recover Gateway from Scheduled Backup][]
+
+[Recover Gateway from Scheduled Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Recovery.RecoverGatewayFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-gateway-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-gateway-from-backup.md
new file mode 100644
index 000000000..74f119a5a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/recovery/web-application-server/recover-gateway-from-backup.md
@@ -0,0 +1,26 @@
+---
+title: "Recover Gateway from Scheduled Backup"
+linkTitle: "Recover Gateway from Scheduled Backup"
+description: "Instructions to recover Gateway from scheduled backups."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to recover Gateway from a backup. This will recover the flow repositories and the OpenAPI definitions. Any recovery needed for the web config must be done manually.
+
+### Configure the Recovery Script
+
+{{< section "/disaster-recovery/web-application-server/recover/configure-recover-script.md">}}
+
+### Run the Recovery Script
+
+{{% alert title="Note" %}}
+A backup policy should be configured on the application server before running a recovery, see {{< ahref path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Backup.AddBackupToGateway" title="Add Scheduled Backup to Gateway" >}} for further information.
+{{% /alert %}}
+
+{{< section "/disaster-recovery/web-application-server/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/_index.md
new file mode 100644
index 000000000..b6cc3f281
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Remove Scheduled Backups"
+linkTitle: "Remove Scheduled Backups"
+description: "Instructions to remove any scheduled backups of CORTEX on multiple on-premise servers with high availability (HA)."
+weight: 300
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/remove-backup-from-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/remove-backup-from-application.md
new file mode 100644
index 000000000..ee9f77c0a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/remove-backup-from-application.md
@@ -0,0 +1,28 @@
+---
+title: "Remove Scheduled Backup from Application Server"
+linkTitle: "Remove Scheduled Backup from Application Server"
+description: "Instructions to remove scheduled backups from the Application Server."
+weight: 50
+---
+
+# {{% param title %}}
+
+This guide describes how to remove a scheduled backup from the Application Server. This will not delete any files created from the backup.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-remove-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-remove-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Remove Scheduled Backups from Web Application Server][]
+
+[Remove Scheduled Backups from Web Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Remove.RemoveBackupsFromWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/_index.md
new file mode 100644
index 000000000..37571e741
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Remove Scheduled Backups from Web Application Server"
+linkTitle: "Remove Scheduled Backups from Web Application Server"
+description: "Instructions to remove scheduled backups from the Web Application Server."
+weight: 200
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-flow-debugger.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-flow-debugger.md
new file mode 100644
index 000000000..6c2c95fa7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-flow-debugger.md
@@ -0,0 +1,28 @@
+---
+title: "Remove Scheduled Backup from Flow Debugger"
+linkTitle: "Remove Scheduled Backup from Flow Debugger"
+description: "Instructions to remove scheduled backups from the Flow Debugger."
+weight: 50
+---
+
+# {{% param title %}}
+
+This guide describes how to remove a scheduled backup from the Flow Debugger. This will not delete any files created from the backup.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-remove-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-remove-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Remove Scheduled Backup from Gateway][]
+
+[Remove Scheduled Backup from Gateway]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.MultipleServerWithHA.Remove.RemoveBackupFromGateway" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-gateway.md b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-gateway.md
new file mode 100644
index 000000000..6d5552430
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/multiple-server-with-ha/remove/web-application-server/remove-backup-from-gateway.md
@@ -0,0 +1,22 @@
+---
+title: "Remove Scheduled Backup from Gateway"
+linkTitle: "Remove Scheduled Backup from Gateway"
+description: "Instructions to remove scheduled backups from Gateway."
+weight: 50
+---
+
+# {{% param title %}}
+
+This guide describes how to remove a scheduled backup of Gateway. This will not delete any files created from the backup.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/configure-remove-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/run-remove-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/_index.md
new file mode 100644
index 000000000..547413c7b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Instructions for disaster recovery of a {{% ctx %}} platform installed on a single on-premise server without high availability (HA)."
+weight: 50
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/_index.md
new file mode 100644
index 000000000..ec19b72dd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Backup"
+linkTitle: "Backup"
+description: "Instructions to backup {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 100
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-of-encryption-key.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-of-encryption-key.md
new file mode 100644
index 000000000..15dc2fec1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-of-encryption-key.md
@@ -0,0 +1,28 @@
+---
+title: "Add Backup of Encryption Key"
+linkTitle: "Add Backup of Encryption Key"
+description: "Instructions to backup the Encryption Key."
+weight: 30
+---
+
+# {{% param title %}}
+
+{{< section "/disaster-recovery/encryption-key/backup/description.md">}}
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/encryption-key/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/encryption-key/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/encryption-key/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Add Scheduled Backup to Application Server][]
+
+[Add Scheduled Backup to Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Backup.AddBackupToApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-application.md
new file mode 100644
index 000000000..9d3751ab6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-application.md
@@ -0,0 +1,28 @@
+---
+title: "Add Scheduled Backup to Application Server"
+linkTitle: "Add Scheduled Backup to Application Server"
+description: "Instructions to add scheduled backups to the Application Server."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to configure a scheduled backup of the Application Server. This will backup the application's reliable collections, the cluster's configuration and the service's appsettings.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Add Scheduled Backup to Web Application Server][]
+
+[Add Scheduled Backup to Web Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Backup.AddBackupToWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-web-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-web-application.md
new file mode 100644
index 000000000..14d2a17c9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/add-backup-to-web-application.md
@@ -0,0 +1,22 @@
+---
+title: "Add Scheduled Backup to Web Application Server"
+linkTitle: "Add Scheduled Backup to Web Application Server"
+description: "Instructions to add scheduled backups to the Web Application Server."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to configure a scheduled backup of the Web Application Server. This will back up the flow repositories, OpenAPI definitions, and the web config file.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/configure-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/run-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/pre-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/pre-backup.md
new file mode 100644
index 000000000..c2b8ca659
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/backup/pre-backup.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Backup"
+linkTitle: "Pre-Backup"
+description: "Information about the steps required to be completed prior to starting the backup process."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the backup of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/disaster-recovery/single-make-installation-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Add Backup of Encryption Key][]
+
+[Add Backup of Encryption Key]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Backup.AddBackupOfEncryptionKey" >}}
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/_index.md
new file mode 100644
index 000000000..b149284ce
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Recovery"
+linkTitle: "Recovery"
+description: "Instructions to recover {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 200
+---
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/pre-recovery.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/pre-recovery.md
new file mode 100644
index 000000000..b485f3b5a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/pre-recovery.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Recovery"
+linkTitle: "Pre-Recovery"
+description: "Information about the steps required to be completed prior to starting the recovery process."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the recovery of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/disaster-recovery/single-make-installation-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Recover Encryption Key from Backup][]
+
+[Recover Encryption Key from Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Recovery.RecoveryEncryptionKeyFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-application-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-application-from-backup.md
new file mode 100644
index 000000000..6c172ac1b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-application-from-backup.md
@@ -0,0 +1,32 @@
+---
+title: "Recover Application Server from Scheduled Backup"
+linkTitle: "Recover Application Server from Scheduled Backup"
+description: "Instructions to recover the Application Server from scheduled backups."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Application Server from a backup. This will recover the application's reliable collections. Any recovery needed for the cluster's configuration, the service's appsettings, manifests or settings must be done manually.
+
+### Configure the Recovery Script
+
+{{< section "/disaster-recovery/application-server/recover/configure-recover-script.md">}}
+
+### Run the Recovery Script
+
+{{% alert title="Warning" color="warning" %}}
+A backup policy must be configured on the Application Server before running a recovery, see {{< ahref path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Backup.AddBackupToApplicationServer" title="Add Backup to Application Server" >}} for further information.
+{{% /alert %}}
+
+{{< section "/disaster-recovery/application-server/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Recover Web Application Server from Scheduled Backup][]
+
+[Recover Web Application Server from Scheduled Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Recovery.RecoverWebApplicationServerFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-encryption-key-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-encryption-key-from-backup.md
new file mode 100644
index 000000000..793ddea7a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-encryption-key-from-backup.md
@@ -0,0 +1,47 @@
+---
+title: "Recover Encryption Key from Backup"
+linkTitle: "Recover Encryption Key from Backup"
+description: "Instructions to recover the Encryption Key from backups."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Encryption Key from a backup. This will recover the Encryption key to the web application server.
+
+{{% alert title="Warning" color="warning" %}}
+If recovering to new hardware, the Encryption Key must be recovered before {{% ctx %}} is installed.
+{{% /alert %}}
+
+### Configure the Recovery Script
+1. In the `Cortex Innovation {{< version >}} - App Server Install Scripts\Recovery` folder, locate the `Cortex.Innovation.EncryptionKey.Recover.ps1` script and open it with a text editor.
+1. Configure the script according to the details given below:
+
+ ```powershell
+ .\Cortex.EncryptionKey.Recover.ps1 `
+ -TargetMachines @("web-server") `
+ -BackupPath "\\UncPath\BackupLocation" `
+ -Credential $Credential
+ ```
+
+ | Name | Description |
+ |------------------------------------------------|-------------|
+ |`TargetMachines` | Configure the value to contain the NETBIOS name or fully qualified domain name of the web application server.|
+ |`BackupPath` | Replace `\\UncPath\BackupLocation` with the path of the location the backups are stored in. If the path is a network path then the `Credentials` will be used to access that location.|
+ |`Credential` | The credentials of the user which will be used to access the `BackupPath`. It must be a domain user that is a member of the local Administrators group on the server.
This does not need to be changed, a prompt will appear to enter this information when the script is run.|
+
+1. Save and close `Cortex.Innovation.EncryptionKey.Recover.ps1`.
+
+### Run the Recovery Script
+
+{{< section "/disaster-recovery/encryption-key/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/encryption-key/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Recover Application Server from Scheduled Backup][]
+
+[Recover Application Server from Scheduled Backup]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Recovery.RecoverApplicationServerFromBackup" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-web-application-from-backup.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-web-application-from-backup.md
new file mode 100644
index 000000000..c658d00f7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/recovery/recover-web-application-from-backup.md
@@ -0,0 +1,26 @@
+---
+title: "Recover Web Application Server from Scheduled Backup"
+linkTitle: "Recover Web Application Server from Scheduled Backup"
+description: "Instructions to recover the Web Application Server from scheduled backups."
+weight: 50
+---
+
+# {{% param title %}}
+
+This guide describes how to recover the Web Application Server from a backup. This will recover the flow repositories and the OpenAPI definitions. Any recovery needed for the web config must be done manually.
+
+### Configure the Recovery Script
+
+{{< section "/disaster-recovery/web-application-server/recover/configure-recover-script.md">}}
+
+### Run the Recovery Script
+
+{{% alert title="Note" %}}
+A backup policy should be configured on the web application server before running a recovery, see {{< ahref path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Backup.AddBackupToWebApplicationServer" title="Add Backup to Web Application Server" >}} for further information.
+{{% /alert %}}
+
+{{< section "/disaster-recovery/web-application-server/recover/run-recover-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/_index.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/_index.md
new file mode 100644
index 000000000..db9d8083e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Remove Scheduled Backups"
+linkTitle: "Remove Scheduled Backups"
+description: "Instructions to remove any scheduled backups of CORTEX on a single on-premise server without high availability (HA)"
+weight: 300
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-application.md
new file mode 100644
index 000000000..729922672
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-application.md
@@ -0,0 +1,28 @@
+---
+title: "Remove Scheduled Backup from Application Server"
+linkTitle: "Remove Scheduled Backup from Application Server"
+description: "Instructions to remove scheduled backups from the Application Server."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to remove a scheduled backup from the Application Server. This will not delete any files created from the backup.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/configure-remove-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/application-server/backup/run-remove-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
+
+## Next Steps?
+
+1. [Remove Scheduled Backup from Web Application Server][]
+
+[Remove Scheduled Backup from Web Application Server]: {{< url path="Cortex.Guides.DisasterRecoveryGuides.SingleServerWithoutHA.Remove.RemoveBackupFromWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-web-application.md b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-web-application.md
new file mode 100644
index 000000000..e2851c924
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/disaster-recovery/single-server-without-ha/remove/remove-backup-from-web-application.md
@@ -0,0 +1,22 @@
+---
+title: "Remove Scheduled Backup from Web Application Server"
+linkTitle: "Remove Scheduled Backup from Web Application Server"
+description: "Instructions to remove scheduled backups from the Web Application Server."
+weight: 50
+---
+
+# {{% param title %}}
+
+This guide describes how to remove a scheduled backup from the Web Application Server. This will not delete any files created from the backup.
+
+## Configure the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/configure-remove-backup-script.md">}}
+
+## Run the Backup Script
+
+{{< section "/disaster-recovery/web-application-server/backup/run-remove-backup-script.md">}}
+
+## Preserve Installation Files
+
+{{< section "/disaster-recovery/preserve-scripts.md">}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/_index.md
new file mode 100644
index 000000000..bcfe82c73
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Upgrade Guides"
+linkTitle: "Upgrade Guides"
+description: "This section includes all upgrade guides for the {{% ctx %}} platform."
+weight: 25
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/_index.md
new file mode 100644
index 000000000..95f39822f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.1 to 2024.3"
+linkTitle: "2024.1 to 2024.3"
+description: "Instructions to upgrade {{% ctx %}} 2024.1 to 2024.3"
+weight: 1000
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..820e17b86
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..c9dea65db
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,65 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.1 to 2024.3.
+
+## Make Installation Artefacts Available
+
+1. Choose one of the Application Servers to be used to perform the upgrade from, and copy the following artefacts to a folder on it:
+ * Cortex Innovation 2024.3 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.3 - App Services.zip
+ * Cortex Innovation 2024.3 - Block Packages.zip
+
+1. Extract the `Cortex Innovation 2024.3 - App Server Install Scripts.zip` file to a folder with the same name.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2024.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Configure the script, changing the parameters according to the details given below:
+
+ ```powershell
+ .\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ ```
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..332b6e679
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.1 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..ee920bf9b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
@@ -0,0 +1,30 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about performing the prerequisities for the Upgrade of the Web Application Server."
+weight: 10
+---
+
+# {{% param title %}}
+
+Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.1 version of Gateway and its prerequisites have already been installed.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the machine:
+
+ * Cortex Innovation 2024.3 - App Services.zip
+ * Cortex Innovation 2024.3 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.3 - Block Packages.zip
+ * Cortex Innovation 2024.3 - Gateway.zip
+ * Cortex Innovation 2024.3 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.3 - App Server Install Scripts.zip` file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.3 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Next Steps?
+
+1. [Upgrade Flow Debugger][]
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..9f68b4459
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,32 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.1 to 2024.3.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..784ffaf77
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.1 to 2024.3."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.1 to 2024.3. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..619ecc8a7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..7e477243c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.1 to 2024.3.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2024.3/upgrade-application-server/single-server/make-installation-artefacts-available.md" >}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..5f08d6be5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-web-application-server.md
@@ -0,0 +1,38 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.1 to 2024.3."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.1 to 2024.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the server:
+
+ * Cortex Innovation 2024.5 - Gateway.zip
+ * Cortex Innovation 2024.5 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.5 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_1to2024_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/_index.md
new file mode 100644
index 000000000..843dc1be9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.11 to 2025.1"
+linkTitle: "2024.11 to 2025.1"
+description: "Instructions to upgrade {{% ctx %}} 2024.11 to 2025.1"
+weight: 940
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..8cc1d0c1d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.1/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..d22edff6e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..dc93d9079
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..bc3b8f15f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.11 to 2025.1. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.1 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.1 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.1 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.1 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.1 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..3d4ca5943
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.11 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..5a54bfbcd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.11 to 2025.1. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..d4a99dfb6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.11 to 2025.1."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.11 to 2025.1. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Upgrade {{% ctx %}} Interaction Portal
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..fdb891322
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.1/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..6e27ae9e1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..1eda5be14
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..f163bc0be
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.11 to 2025.1. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-web-application-server.md
new file mode 100644
index 000000000..5d717c621
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.11-to-2025.1/single-server-without-ha/upgrade/upgrade-web-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.11 to 2025.1."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.11 to 2025.1. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Upgrade {{% ctx %}} Interaction Portal
+
+{{< section "/upgrade/2025.1/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_11to2025_1.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/_index.md
new file mode 100644
index 000000000..c59ea49ee
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.3 to 2024.5"
+linkTitle: "2024.3 to 2024.5"
+description: "Instructions to upgrade {{% ctx %}} 2024.3 to 2024.5"
+weight: 990
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..e5752bbfe
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..1ae2c9cbf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,65 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.3 to 2024.5.
+
+## Make Installation Artefacts Available
+
+1. Choose one of the Application Servers to be used to perform the upgrade from, and copy the following artefacts to a folder on it:
+ * Cortex Innovation 2024.5 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.5 - App Services.zip
+ * Cortex Innovation 2024.5 - Block Packages.zip
+
+1. Extract the `Cortex Innovation 2024.5 - App Server Install Scripts.zip` file to a folder with the same name.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2024.5 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Configure the script, changing the parameters according to the details given below:
+
+ ```powershell
+ .\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.5 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.5 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ ```
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..364c29a8c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.3 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..be54f45a7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
@@ -0,0 +1,30 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about performing the prerequisities for the Upgrade of the Web Application Server."
+weight: 10
+---
+
+# {{% param title %}}
+
+Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.3 version of Gateway and its prerequisites have already been installed.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the machine:
+
+ * Cortex Innovation 2024.5 - App Services.zip
+ * Cortex Innovation 2024.5 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.5 - Block Packages.zip
+ * Cortex Innovation 2024.5 - Gateway.zip
+ * Cortex Innovation 2024.5 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.5 - App Server Install Scripts.zip` file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.5 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Next Steps?
+
+1. [Upgrade Flow Debugger][]
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..eba3bf402
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,32 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.3 to 2024.5.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..dde1b68dd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.3 to 2024.5."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.3 to 2024.5. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..537e26cae
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..5653d5fa5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.3 to 2024.5.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2024.5/upgrade-application-server/single-server/make-installation-artefacts-available.md" >}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..a436e82b6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-web-application-server.md
@@ -0,0 +1,38 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.3 to 2024.5."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.3 to 2024.5. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the server:
+
+ * Cortex Innovation 2024.5 - Gateway.zip
+ * Cortex Innovation 2024.5 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.5 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.5/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_3to2024_5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/_index.md
new file mode 100644
index 000000000..d939b7310
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.5 to 2024.7"
+linkTitle: "2024.5 to 2024.7"
+description: "Instructions to upgrade {{% ctx %}} 2024.5 to 2024.7"
+weight: 980
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..34919c1a8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..968833301
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,79 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.5 to 2024.7.
+
+## Make Installation Artefacts Available
+
+1. Choose one of the Application Servers to be used to perform the upgrade from, and copy the following artefacts to a folder on it:
+ * Cortex Innovation 2024.7 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.7 - App Services.zip
+ * Cortex Innovation 2024.7 - Block Packages.zip
+
+1. Extract the `Cortex Innovation 2024.7 - App Server Install Scripts.zip` file to a folder with the same name.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2024.7 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.7 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.7 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.7 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.7 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..9ada27763
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.5 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..4ee86e1c5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
@@ -0,0 +1,32 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about performing the prerequisities for the Upgrade of the Web Application Server."
+weight: 10
+---
+
+# {{% param title %}}
+
+Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.5 version of Gateway and its prerequisites have already been installed.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the machine:
+
+ * Cortex Innovation 2024.7 - App Services.zip
+ * Cortex Innovation 2024.7 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.7 - Block Packages.zip
+ * Cortex Innovation 2024.7 - Gateway.zip
+ * Cortex Innovation 2024.7 - Flows Upgrader.zip
+ * Cortex Innovation 2024.7 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.7 - App Server Install Scripts.zip` file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.7 - Flows Upgrader.zip` zip file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.7 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Next Steps?
+
+1. [Upgrade Flow Debugger][]
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..f6cf100a0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,32 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.5 to 2024.7.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..e943fd02c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.5 to 2024.7."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.5 to 2024.7. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+If the {{% ctx %}} Interaction Portal is used in your environment, you must also upgrade those flows.
+{{% /alert %}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..b70a11c9f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..93a8d5970
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.5 to 2024.7.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2024.7/upgrade-application-server/single-server/make-installation-artefacts-available.md" >}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..c29abbb49
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-web-application-server.md
@@ -0,0 +1,48 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.5 to 2024.7."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.5 to 2024.7. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the server:
+
+ * Cortex Innovation 2024.7 - Gateway.zip
+ * Cortex Innovation 2024.7 - Flows Upgrader.zip
+ * Cortex Innovation 2024.7 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.7 - Flows Upgrader.zip` zip file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.7 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+If the {{% ctx %}} Interaction Portal is used in your environment, you must also upgrade those flows.
+{{% /alert %}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_5to2024_7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/_index.md
new file mode 100644
index 000000000..5e7521be6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.7 to 2024.9"
+linkTitle: "2024.7 to 2024.9"
+description: "Instructions to upgrade {{% ctx %}} 2024.7 to 2024.9"
+weight: 970
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..4ca2f9100
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..ef94a729b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,79 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.7 to 2024.9.
+
+## Make Installation Artefacts Available
+
+1. Choose one of the Application Servers to be used to perform the upgrade from, and copy the following artefacts to a folder on it:
+ * Cortex Innovation 2024.9 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.9 - App Services.zip
+ * Cortex Innovation 2024.9 - Block Packages.zip
+
+1. Extract the `Cortex Innovation 2024.9 - App Server Install Scripts.zip` file to a folder with the same name.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2024.9 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.9 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.9 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..eb9e2fa09
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.7 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..65d66db5b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
@@ -0,0 +1,30 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about performing the prerequisities for the Upgrade of the Web Application Server."
+weight: 10
+---
+
+# {{% param title %}}
+
+Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.7 version of Gateway and its prerequisites have already been installed.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the machine:
+
+ * Cortex Innovation 2024.9 - App Services.zip
+ * Cortex Innovation 2024.9 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.9 - Block Packages.zip
+ * Cortex Innovation 2024.9 - Gateway.zip
+ * Cortex Innovation 2024.9 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.9 - App Server Install Scripts.zip` file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.9 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Next Steps?
+
+1. [Upgrade Flow Debugger][]
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..e31c44ce4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.7 to 2024.9. Please ensure that the [prerequisites][] have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.WebApplicationServerPreqrequisites" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..e955f986f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,59 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.7 to 2024.9."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.7 to 2024.9. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Republish Packages
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the cleanup of the NServiceBus endpoint and RabbitMQ queues.{{< /alert >}}
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. In the `Package Definitions` grid, select `Is Published` filter option on the `Is Published` column to show all published packages.
+1. For each published package version:
+ * Select the package.
+ * Click `Unpublish` at the bottom of the `Definition` tab and click `Unpublish` on the confirmation pop-up dialog. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+ * Sometimes the list of published packages in the `Package Definitions` grid disappears. To fix, set the `Is Published` filter in the `Package Definitions` grid to blank option and then set the filter to `Is Published` option again to show all published packages.
+
+## Delete Old Execution Services
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the cleanup of the NServiceBus endpoint and RabbitMQ queues.{{< /alert >}}
+
+1. Open a web browser.
+1. Navigate to `https://server.domain.com:9080/Explorer`, where `server.domain.com` is the fully qualified domain name of one of the application servers. Replace `9080` with new `httpGatewayEndpointPort` value if it was changed during configuration of the original installation.
+1. Expand `Cluster` then `Applications` then `Cortex.Innovation.Execution`.
+1. For all old execution applications:
+ * Click on the drop down menu and select `Delete Application`. Confirm application deletion by following the on-screen instructions.
+ * Give this a few minutes. If the application does not delete:
+ * Expand `Nodes`
+ * For each node:
+ * Expand the node and select the application that matches the engine version number of the application that is being attempted to be deleted.
+ * Expand each level up to and including `Code Packages`.
+ * Click on the drop down menu for `Code` and select `Restart`. Confirm application restart by following the on-screen instructions.
+ * Give this a few minutes. Once all nodes have been restarted the application should be deleted and disappear from the list of applications.
+
+Repeat the above instructions for the `Flow Debugger`. In step 2 `server.domain.com` is the fully qualified domain name of the web application server.
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..583d5a7b8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..a75396998
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.7 to 2024.9.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2024.9/upgrade-application-server/single-server/make-installation-artefacts-available.md" >}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..bf9357307
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-web-application-server.md
@@ -0,0 +1,64 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.7 to 2024.9."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.7 to 2024.9. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the server:
+
+ * Cortex Innovation 2024.9 - Gateway.zip
+ * Cortex Innovation 2024.9 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.9 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Publish New Package Versions
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the cleanup of the NServiceBus endpoint and RabbitMQ queues.{{< /alert >}}
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. For each previously published package version:
+ * Select the package.
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+
+## Delete Old Execution Service
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the cleanup of the NServiceBus endpoint and RabbitMQ queues.{{< /alert >}}
+
+1. Open a web browser.
+1. Navigate to `https://server.domain.com:9080/Explorer`, where `server.domain.com` is the fully qualified domain name of the server. Replace `9080` with new `httpGatewayEndpointPort` value if it was changed during configuration of the original installation.
+1. Expand `Cluster` then `Applications` then `Cortex.Innovation.Execution`.
+1. For all old execution applications:
+ * Click on the drop down menu and select `Delete Application`. Confirm application deletion by following the on-screen instructions.
+ * Give this a few minutes. If the application does not delete:
+ * Expand `Nodes`
+ * For each node:
+ * Expand the node and select the application that matches the engine version number of the application that is being attempted to be deleted.
+ * Expand each level up to and including `Code Packages`.
+ * Click on the drop down menu for `Code` and select `Restart`. Confirm application restart by following the on-screen instructions.
+ * Give this a few minutes. Once all nodes have been restarted the application should be deleted and disappear from the list of applications.
+
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_7to2024_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/_index.md
new file mode 100644
index 000000000..9e5bd8ab8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2024.9 to 2024.11"
+linkTitle: "2024.9 to 2024.11"
+description: "Instructions to upgrade {{% ctx %}} 2024.9 to 2024.11"
+weight: 960
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/prerequisites.md
new file mode 100644
index 000000000..159015f64
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/prerequisites.md
@@ -0,0 +1,60 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about the prerequisites required before starting the upgrade."
+weight: 10
+---
+
+# {{< param title >}}
+
+The prerequisites required to be considered before starting the upgrade.
+
+## Encryption Requirements
+
+{{% alert title="Note" %}}This step is only required if the load balancer installed is the load balancer that is included with the {{% ctx %}} software.{{% /alert %}}
+
+### Retrieve Existing Encryption Key
+
+On one of the Application Servers:
+
+1. On the Start menu, choose `Run`.
+1. In the open box, enter `regedit.exe`. You must have administrative credentials to run regedit.exe.
+1. In the Registry Editor, locate the registry value `Key` which can be found at the following location `HKEY_LOCAL_MACHINE\SOFTWARE\Innovise\Cerberus`.
+1. Copy the value of `Key` and save it to a known location.
+
+### Add Encryption Key to Load Balancer Server
+
+On the Load Balancer Server:
+
+1. On the Start menu, choose `Run`.
+1. In the open box, enter `regedit.exe`. You must have administrative credentials to run regedit.exe.
+1. In the Registry Editor, navigate through the subkeys to `HKEY_LOCAL_MACHINE\SOFTWARE\Innovise\Cerberus`.
+
+ If any of the subkeys do not exist create them, repeating for each subsequent subkey:
+
+ 1. Right click on the parent subkey.
+ 1. Select `New`.
+ 1. Select `Key`.
+ 1. Set the name to be the subkey that you are creating e.g. `Innovise`.
+
+1. Under the `Cerberus` subkey locate the registry value `Key`.
+
+ If the registry value does not exist create it:
+
+ * Right click in the right window.
+ * Select `New`.
+ * Select `String`.
+ * Set the name to be `Key`.
+
+1. Set the value of `Key` to be the value copied from the Application Server in Step 4 of [Retrieve Existing Encryption Key][]:
+
+ 1. Double click on the registry value `Key` to open the Edit dialog.
+ 1. Set the value.
+ 1. Click `OK`.
+
+## Next Steps?
+
+1. [Upgrade Application Servers and Load Balancer][]
+
+[Retrieve Existing Encryption Key]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.RetrieveAppServerEncryptionKey" >}}
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..e1315174f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..b4f320237
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,80 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.9 to 2024.11. Please ensure that the [Prerequisites][] have been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Choose one of the Application Servers to be used to perform the upgrade from, and copy the following artefacts to a folder on it:
+ * Cortex Innovation 2024.11 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.11 - App Services.zip
+ * Cortex Innovation 2024.11 - Block Packages.zip
+
+1. Extract the `Cortex Innovation 2024.11 - App Server Install Scripts.zip` file to a folder with the same name.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2024.11 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.11 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.11 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2024.11 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2024.11 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.Prerequisites" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..94c0609d8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.9 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..020c17c87
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
@@ -0,0 +1,30 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "Information about performing the prerequisities for the Upgrade of the Web Application Server."
+weight: 10
+---
+
+# {{% param title %}}
+
+Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.9 version of Gateway and its prerequisites have already been installed.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the machine:
+
+ * Cortex Innovation 2024.11 - App Services.zip
+ * Cortex Innovation 2024.11 - App Server Install Scripts.zip
+ * Cortex Innovation 2024.11 - Block Packages.zip
+ * Cortex Innovation 2024.11 - Gateway.zip
+ * Cortex Innovation 2024.11 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.11 - App Server Install Scripts.zip` file to a folder with the same name.
+1. Extract the `Cortex Innovation 2024.11 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Next Steps?
+
+1. [Upgrade Flow Debugger][]
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..9ec9ab4ed
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeGateway" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..6be6251fa
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.9 to 2024.11. Please ensure that the [prerequisites][] have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.WebApplicationServerPreqrequisites" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..82105e3e3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.9 to 2024.11."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.9 to 2024.11. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..cd81ee553
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/try-it-out.md
@@ -0,0 +1,19 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/test-upgrade.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..b7edd0fd8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.9 to 2024.11.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2024.11/upgrade-application-server/single-server/make-installation-artefacts-available.md" >}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..965930850
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9-to-2024.11/single-server-without-ha/upgrade-web-application-server.md
@@ -0,0 +1,42 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server from 2024.9 to 2024.11."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.9 to 2024.11. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Make Installation Artefacts Available
+
+1. Copy the following artefacts to a folder on the server:
+
+ * Cortex Innovation 2024.11 - Gateway.zip
+ * Cortex Innovation 2024.11 - Web App Server Install Scripts.zip
+
+1. Extract the `Cortex Innovation 2024.11 - Web App Server Install Scripts.zip` zip file to a folder with the same name.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Upgrade {{% ctx %}} Interaction Portal
+
+{{< section "/upgrade/2024.11/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9to2024_11.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/_index.md
new file mode 100644
index 000000000..be85541e0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2024.9.25161 to 2025.3"
+linkTitle: "2024.9.25161 to 2025.3"
+description: "Instructions to upgrade {{% ctx %}} 2024.9.25161 to 2025.3"
+weight: 950
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..54d5889bb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2024.9.25161.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..0526ed14d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,20 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.3/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..6f9bb86e5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..207e9bfc6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..ef86a881b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2024.9.25161 to 2025.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..7bf4e4cbc
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2024.9.25161 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..9f9a38e94
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeGateway" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..b31f8c278
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2024.9.25161 to 2025.3. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..fba42f1f8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2024.9.25161 to 2025.3."
+weight: 40
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.9.25161 to 2025.3. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..538f315af
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.3/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..9ec038a35
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..ae62d8d81
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..041987456
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2024.9.25161 to 2025.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..2584be939
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2024.9.25161 to 2025.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..65c560bb7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeGateway" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..760fab2b2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2024.9.25161-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,65 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2024.9.25161 to 2025.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Delete Old Execution Services
+
+1. Open a web browser.
+1. Navigate to `https://server.domain.com:9080/Explorer`, where `server.domain.com` is the fully qualified domain name of one of the application servers. Replace `9080` with new `httpGatewayEndpointPort` value if it was changed during configuration of the original installation.
+1. Expand `Cluster` then `Applications` then `Cortex.Innovation.Execution`.
+1. For all old execution applications:
+ * Click on the drop down menu and select `Delete Application`. Confirm application deletion by following the on-screen instructions.
+ * Give this a few minutes. If the application does not delete:
+ * Expand `Nodes`
+ * For each node:
+ * Expand the node and select the application that matches the engine version number of the application that is being attempted to be deleted.
+ * Expand each level up to and including `Code Packages`.
+ * Click on the drop down menu for `Code` and select `Restart`. Confirm application restart by following the on-screen instructions.
+ * Give this a few minutes. Once all nodes have been restarted the application should be deleted and disappear from the list of applications.
+
+Repeat the above instructions for the `Flow Debugger`. In step 2 `server.domain.com` is the fully qualified domain name of the web application server.
+
+## Republish Packages
+
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. In the `Package Definitions` grid, select `Is Published` filter option on the `Is Published` column to show all published packages.
+1. For each published package version:
+ * Select the package.
+ * Click `Unpublish` at the bottom of the `Definition` tab and click `Unpublish` on the confirmation pop-up dialog. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+ * Sometimes the list of published packages in the `Package Definitions` grid disappears. To fix, set the `Is Published` filter in the `Package Definitions` grid to blank option and then set the filter to `Is Published` option again to show all published packages.
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2024_9_25161to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/_index.md
new file mode 100644
index 000000000..1f7c29358
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2025.1 to 2025.3"
+linkTitle: "2025.1 to 2025.3"
+description: "Instructions to upgrade {{% ctx %}} 2025.1 to 2025.3"
+weight: 930
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..9afa9bd39
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+Due to breaking changes required for upgrading RabbitMQ from version 3 to version 4 the Application Servers need to be reinstalled rather than upgraded. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..289a09417
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,29 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.3/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the RabbitMQ upgrade.{{< /alert >}}
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..fba3720b8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Servers and Load Balancer Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Application Servers and Load Balancer Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..68318971a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..ab1ade7c8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,75 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.1 to 2025.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+Due to breaking changes required for upgrading RabbitMQ from version 3 to version 4 the Application Servers need to be reinstalled rather than upgraded. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..41869a3a9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.1 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..862e17dd3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+No upgrade required
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeGateway" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..e55072f0d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.1 to 2025.3. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..cedfda296
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.1 to 2025.3."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.1 to 2025.3. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Delete Old Execution Services
+
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the RabbitMQ upgrade.{{< /alert >}}
+
+1. Open a web browser.
+1. Navigate to `https://server.domain.com:9080/Explorer`, where `server.domain.com` is the fully qualified domain name of one of the application servers. Replace `9080` with new `httpGatewayEndpointPort` value if it was changed during configuration of the original installation.
+1. Expand `Cluster` then `Applications` then `Cortex.Innovation.Execution`.
+1. For all old execution applications:
+ * Click on the drop down menu and select `Delete Application`. Confirm application deletion by following the on-screen instructions.
+ * Give this a few minutes. If the application does not delete:
+ * Expand `Nodes`
+ * For each node:
+ * Expand the node and select the application that matches the engine version number of the application that is being attempted to be deleted.
+ * Expand each level up to and including `Code Packages`.
+ * Click on the drop down menu for `Code` and select `Restart`. Confirm application restart by following the on-screen instructions.
+ * Give this a few minutes. Once all nodes have been restarted the application should be deleted and disappear from the list of applications.
+
+Repeat the above instructions for the `Flow Debugger`. In step 2 `server.domain.com` is the fully qualified domain name of the web application server.
+
+## Republish Packages
+
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the RabbitMQ upgrade.{{< /alert >}}
+
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. In the `Package Definitions` grid, select `Is Published` filter option on the `Is Published` column to show all published packages.
+1. For each published package version:
+ * Select the package.
+ * Click `Unpublish` at the bottom of the `Definition` tab and click `Unpublish` on the confirmation pop-up dialog. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+ * Sometimes the list of published packages in the `Package Definitions` grid disappears. To fix, set the `Is Published` filter in the `Package Definitions` grid to blank option and then set the filter to `Is Published` option again to show all published packages.
+
+## Restore Configuration Portal Data
+
+ {{< alert type="note" title="Note" >}} This only needs to happen for upgrading to this release version as breaking changes were introduced as part of the RabbitMQ upgrade.{{< /alert >}}
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..fcb50f156
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.3/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..ad4348996
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/try-it-out.md
@@ -0,0 +1,25 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that both the [Application Server Upgrade][] and [Web Application Server Upgrade][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/upgrade/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/upgrade/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/upgrade/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..eea326caf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..526f17366
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.1 to 2025.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..1353129f3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.1 to 2025.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..5e03a040d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+No upgrade required
+
+## Next Steps?
+
+1. [Try It Out][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeGateway" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..ae11e924a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.1-to-2025.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,65 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.1 to 2025.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Delete Old Execution Services
+
+1. Open a web browser.
+1. Navigate to `https://server.domain.com:9080/Explorer`, where `server.domain.com` is the fully qualified domain name of one of the application servers. Replace `9080` with new `httpGatewayEndpointPort` value if it was changed during configuration of the original installation.
+1. Expand `Cluster` then `Applications` then `Cortex.Innovation.Execution`.
+1. For all old execution applications:
+ * Click on the drop down menu and select `Delete Application`. Confirm application deletion by following the on-screen instructions.
+ * Give this a few minutes. If the application does not delete:
+ * Expand `Nodes`
+ * For each node:
+ * Expand the node and select the application that matches the engine version number of the application that is being attempted to be deleted.
+ * Expand each level up to and including `Code Packages`.
+ * Click on the drop down menu for `Code` and select `Restart`. Confirm application restart by following the on-screen instructions.
+ * Give this a few minutes. Once all nodes have been restarted the application should be deleted and disappear from the list of applications.
+
+Repeat the above instructions for the `Flow Debugger`. In step 2 `server.domain.com` is the fully qualified domain name of the web application server.
+
+## Republish Packages
+
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. In the `Package Definitions` grid, select `Is Published` filter option on the `Is Published` column to show all published packages.
+1. For each published package version:
+ * Select the package.
+ * Click `Unpublish` at the bottom of the `Definition` tab and click `Unpublish` on the confirmation pop-up dialog. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+ * Sometimes the list of published packages in the `Package Definitions` grid disappears. To fix, set the `Is Published` filter in the `Package Definitions` grid to blank option and then set the filter to `Is Published` option again to show all published packages.
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_1to2025_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/_index.md
new file mode 100644
index 000000000..0cd6860e8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2025.3 to 2025.5"
+linkTitle: "2025.3 to 2025.5"
+description: "Instructions to upgrade {{% ctx %}} 2025.3 to 2025.5"
+weight: 920
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..70fc9c421
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/configure-code-analyser.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/configure-code-analyser.md
new file mode 100644
index 000000000..05edf4ac6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/configure-code-analyser.md
@@ -0,0 +1,24 @@
+---
+title: "Configure Code Analyser"
+linkTitle: "Configure Code Analyser"
+description: "Information about configuring the code analyser to allow flows to be executed."
+weight: 20
+---
+
+# {{% param title %}}
+
+{{< section "/configure-code-analyser/configure-code-analyser.md" >}}
+
+The Code Analyser can either be [updated][Update Code Analyser] to allow required C# data types and namespaces, or it can be [disabled][Disable Code Analyser].
+
+### Update Code Analyser Allowed List
+
+{{< section "/configure-code-analyser/update-code-analyser.md" >}}
+
+### Disable Code Analyser
+
+Instructions on how to disable the Code Analyser can be found [here][Disable Code Analyser FAQ].
+
+[Update Code Analyser]: {{< ref "#update-code-analyser-allowed-list" >}}
+[Disable Code Analyser]: {{< ref "#disable-code-analyser" >}}
+[Disable Code Analyser FAQ]: {{< url path="Cortex.Faqs.ConfigureCodeAnalyser.MultipleServerWithHA.DisableCodeAnalyser" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..034563d22
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Configure Code Analyser][]
+
+[Configure Code Analyser]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.ConfigureCodeAnalyser" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..011d36edb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.5/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..9665e45df
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..720dd1a7e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.3 to 2025.5. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.5 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.5 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.5 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.5 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.5 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..9a9d7ef1e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.3 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..a8406df2f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..61246b945
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.3 to 2025.5. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..d50ad8af9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,30 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.3 to 2025.5."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3 to 2025.5. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..d4050b836
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/configure-code-analyser.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/configure-code-analyser.md
new file mode 100644
index 000000000..6bd2e03f8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/configure-code-analyser.md
@@ -0,0 +1,24 @@
+---
+title: "Configure Code Analyser"
+linkTitle: "Configure Code Analyser"
+description: "Information about configuring the code analyser to allow flows to be executed."
+weight: 20
+---
+
+# {{% param title %}}
+
+{{< section "/configure-code-analyser/configure-code-analyser.md" >}}
+
+The Code Analyser can either be [updated][Update Code Analyser] to allow required C# data types and namespaces, or it can be [disabled][Disable Code Analyser].
+
+### Update Code Analyser Allowed List
+
+{{< section "/configure-code-analyser/update-code-analyser.md" >}}
+
+### Disable Code Analyser
+
+Instructions on how to disable the Code Analyser can be found [here][Disable Code Analyser FAQ].
+
+[Update Code Analyser]: {{< ref "#update-code-analyser-allowed-list" >}}
+[Disable Code Analyser]: {{< ref "#disable-code-analyser" >}}
+[Disable Code Analyser FAQ]: {{< url path="Cortex.Faqs.ConfigureCodeAnalyser.SingleServerWithoutHA.DisableCodeAnalyser" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..8a6e34bd1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Configure Code Analyser][]
+
+[Configure Code Analyser]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.ConfigureCodeAnalyser" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..bd1d41d8e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.5/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..5074c8a20
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..5700118da
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.3 to 2025.5. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..5a6107d5f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.3 to 2025.5. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..41072c581
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..64a250db1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3-to-2025.5/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,48 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3 to 2025.5. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.5/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Republish Packages
+
+1. Log in to Gateway with a user that has the `Admin` role.
+1. Click on the `Admin` charm, then `Packages`.
+1. In the `Package Definitions` grid, select `Is Published` filter option on the `Is Published` column to show all published packages.
+1. For each published package version:
+ * Select the package.
+ * Click `Unpublish` at the bottom of the `Definition` tab and click `Unpublish` on the confirmation pop-up dialog. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy
+ * Click `Create New Version` then click `Save` and wait for the new version to be created.
+ * Click `Publish`. A success message should appear. If it doesn't it means that there is a problem with the configuration in the `web.config` file for {{% ctx %}} Gateway, or the Application Services aren't healthy.
+ * Sometimes the list of published packages in the `Package Definitions` grid disappears. To fix, set the `Is Published` filter in the `Package Definitions` grid to blank option and then set the filter to `Is Published` option again to show all published packages.
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3to2025_5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/_index.md
new file mode 100644
index 000000000..cf1555347
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.3.25411 to 2025.3.26111"
+linkTitle: "2025.3.25411 to 2025.3.26111"
+description: "Instructions to upgrade {{% ctx %}} 2025.3.25411 to 2025.3.26111"
+weight: 920
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..41b0fe16c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.25411.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..9c7a8d8c0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..5700f9a2c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..7afd382c2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..25a7aaba7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.3.26111/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..06a0adb3f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..70e005553
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.3.25411 to 2025.3.26111. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..0b77db34a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.3.25411 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..ad32fd7d1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..8a9151546
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.3.25411 to 2025.3.26111. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..6963c083e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,30 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.3.25411 to 2025.3.26111."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.25411 to 2025.3.26111. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/_index.md
new file mode 100644
index 000000000..a43e88369
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..47d26558e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..7970d87c4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,24 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..41ddafeb8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..1161ee83a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.3.26111/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..dd83aff9f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..8a7426258
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.3.25411 to 2025.3.26111. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..64a966492
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.3.25411 to 2025.3.26111. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..d34be4f42
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.PostUpgrade" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..83fa7b25a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.3.26111/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.25411 to 2025.3.26111. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.3.26111/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_3_26111.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/_index.md
new file mode 100644
index 000000000..9f1edfaa8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.3.25411 to 2025.9"
+linkTitle: "2025.3.25411 to 2025.9"
+description: "Instructions to upgrade {{% ctx %}} 2025.3.25411 to 2025.9"
+weight: 919
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..41b0fe16c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.25411.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..5f81df364
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..51853c21b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..bed842de9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..34a7d4bf2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.9/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..b1d52b0c4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..12406b889
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.3.25411 to 2025.9. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.9 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..8d57c1066
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.3.25411 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..a0e2e6f2c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..a018033d5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.3.25411 to 2025.9. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..dcbf347d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,30 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.3.25411 to 2025.9."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.25411 to 2025.9. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..dbb528618
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..6a6384dcf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Warning" color="warning" %}}
+These steps must be carried out as the old Execution Service has been removed following upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..655303b20
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..8da9c9092
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.9/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..5749e29c1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..e374957cb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.3.25411 to 2025.9. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..0321a987e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.3.25411 to 2025.9. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..6ec19d3d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..66d1c65b6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.25411-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.25411 to 2025.9. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_25411to2025_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/_index.md
new file mode 100644
index 000000000..5ed05a968
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.3.26111 to 2025.9.26161"
+linkTitle: "2025.3.26111 to 2025.9.26161"
+description: "Instructions to upgrade {{% ctx %}} 2025.3.26111 to 2025.9.26161"
+weight: 902
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..06f457f37
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.26111.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..a43223583
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..d78f12fe4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..aaf28fdce
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..2191233d2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.9.26161/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..23b28a4cd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..04bc82fe1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.3.26111 to 2025.9.26161. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.9 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..aba4bd659
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.9 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
new file mode 100644
index 000000000..117ede58e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Configuration Portal"
+linkTitle: "Upgrade Configuration Portal"
+description: "Information about upgrading {{% ctx %}} Configuration Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Configuration Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-configuration-portal.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..cd91f7cba
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..ed3631864
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.3.26111 to 2025.9.26161. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..33246c66b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.3.26111 to 2025.9.26161."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.26111 to 2025.9.26161. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Configuration Portal][Upgrade CCP]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CCP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.MultipleServerWithHA.UpgradeCCP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/_index.md
new file mode 100644
index 000000000..e86de277d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.26111.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..760d788d7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..081b73ca6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,24 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..69b3ecb6b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..0011d6cac
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.9.26161/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..63298afba
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..2d0d80180
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.3.26111 to 2025.9.26161. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..8b647e37b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.3.26111 to 2025.9.26161. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
new file mode 100644
index 000000000..81d84450e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Configuration Portal"
+linkTitle: "Upgrade Configuration Portal"
+description: "Information about upgrading {{% ctx %}} Configuration Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Configuration Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-configuration-portal.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeGateway" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..dab0c3593
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..f579c4089
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.26111 to 2025.9.26161. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Configuration Portal][Upgrade CCP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CCP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeCCP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2025_9_26161.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/_index.md
new file mode 100644
index 000000000..99a178461
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.3.26111 to 2026.3"
+linkTitle: "2025.3.26111 to 2026.3"
+description: "Instructions to upgrade {{% ctx %}} 2025.3.26111 to 2026.3"
+weight: 901
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..06f457f37
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.26111.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..7cfe294bb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..181206f51
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..392a4c67d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..dd66e31c6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2026.3/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..3b2ae69ee
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..92a9a5d1b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.3.26111 to 2026.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2026.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2026.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2026.3 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2026.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2026.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..9070c6c55
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.9 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..07090eeac
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.3.26111 to 2026.3. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..bd32a0204
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.3.26111 to 2026.3."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.26111 to 2026.3. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/_index.md
new file mode 100644
index 000000000..e86de277d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.3.26111.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..a4d713f27
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..d2da48673
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,24 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+## Upgrade Flows
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..d3c6108df
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..b08c1ca21
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2026.3/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..9e4adbb5a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..ef02c668c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.3.26111 to 2026.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..821bad653
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.3.26111 to 2026.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..80fc52b08
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.3.26111-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.3.26111 to 2026.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.PostUpgrade" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_3_26111to2026_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/_index.md
new file mode 100644
index 000000000..34dc8d356
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/_index.md
@@ -0,0 +1,7 @@
+---
+title: "2025.5 to 2025.7"
+linkTitle: "2025.5 to 2025.7"
+description: "Instructions to upgrade {{% ctx %}} 2025.5 to 2025.7"
+weight: 910
+outOfSupport: true
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..dd6a84097
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..fae091206
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,24 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..425c12f75
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.7/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..cac165d57
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..3187a6236
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.5 to 2025.7. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.7 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.7 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.7 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.7 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.7 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..8291d9c98
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.5 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..8062bad66
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..98013e689
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.5 to 2025.7. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..abb984d81
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,43 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.5 to 2025.7."
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.5 to 2025.7. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/republish-packages.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..8f4793e26
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..c2cba88d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,24 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..9dd36b3fb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.7/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..563692c1e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..ac5cb8337
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.5 to 2025.7. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..1d810aa34
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.5 to 2025.7. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..59cb778ed
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..1617b2b4c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.5-to-2025.7/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,49 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.5 to 2025.7. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.7/upgrade-web-application-server/republish-packages.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_5to2025_7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/_index.md
new file mode 100644
index 000000000..76281aea3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.7 to 2025.9"
+linkTitle: "2025.7 to 2025.9"
+description: "Instructions to upgrade {{% ctx %}} 2025.7 to 2025.9"
+weight: 900
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..10ed76d03
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..8ef11d14f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..2cee9901c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,20 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..6f07748d2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..3527a8d79
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.9/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..b82d6389b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..39a1b37fe
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.7 to 2025.9. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.9 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..7be5faa0d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.7 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..d9b9d14ad
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..c77f4846e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.7 to 2025.9. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..48d9bccbb
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,31 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.7 to 2025.9."
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.7 to 2025.9. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/_index.md
new file mode 100644
index 000000000..8364e72cf
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..e57e330ae
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..f31c15296
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,20 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Warning" color="warning" %}}
+These steps must be carried out as the old Execution Service has been removed following upgrade.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..5e3e21089
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..8961dd5d6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.9/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..1a8a5608f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..98844e84d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.7 to 2025.9. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+{{% alert title="Warning" color="warning" %}}
+The Application Server will be reinstalled as part of the upgrade. As a result packages will need to be republished and Configuration Portal data will need to be backed up and restored. Other data stored in Reliable Collections (e.g., data storage collections and semaphores) will be lost.
+{{% /alert %}}
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..77ebe53a0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.7 to 2025.9. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..2f97c8e43
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..9068c2ea5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.7-to-2025.9/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.7 to 2025.9. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_7to2025_9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/_index.md
new file mode 100644
index 000000000..e3d287f35
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.9 to 2025.9.26161"
+linkTitle: "2025.9 to 2025.9.26161"
+description: "Instructions to upgrade {{% ctx %}} 2025.9 to 2025.9.26161"
+weight: 899
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..30b7ec29a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.9.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..5cab8187e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..3542d9f82
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,28 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..e3e479677
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..3dea1d394
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2025.9.26161/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..305772e7a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..96c359ad8
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.9 to 2025.9.26161. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2025.9 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2025.9 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2025.9 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..47b053b1e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.9 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
new file mode 100644
index 000000000..9888c8bf2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Configuration Portal"
+linkTitle: "Upgrade Configuration Portal"
+description: "Information about upgrading {{% ctx %}} Configuration Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Configuration Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-configuration-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..c1d1a08d0
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Configuration Portal][Upgrade CCP]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
+[Upgrade CCP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeCCP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..42e8cef95
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.9 to 2025.9.26161. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..808dd40ce
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,30 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.9 to 2025.9.26161."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.9 to 2025.9.26161. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeDebugger" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.MultipleServerWithHA.UpgradeCIP" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/_index.md
new file mode 100644
index 000000000..1d50c4e8e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.9.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..aa24da137
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..98f691573
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,24 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+## Upgrade Flows
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-flows.md" >}}
+
+{{% alert title="Note" %}}
+Once the flows have been upgraded it is necessary to {{< ahref path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.RepublishPackages" title="republish all packages" >}} that have previously been published.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..f3c2a45cc
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..3050a162e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2025.9.26161/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..1f39849b2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..763404408
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.9 to 2025.9.26161. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..78ded6797
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.9 to 2025.9.26161. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
new file mode 100644
index 000000000..6902d385c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-ccp.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Configuration Portal"
+linkTitle: "Upgrade Configuration Portal"
+description: "Information about upgrading {{% ctx %}} Configuration Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Configuration Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-configuration-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
new file mode 100644
index 000000000..1d16b6424
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-cip.md
@@ -0,0 +1,21 @@
+---
+title: "Upgrade Interaction Portal"
+linkTitle: "Upgrade Interaction Portal"
+description: "Information about upgrading {{% ctx %}} Interaction Portal."
+weight: 60
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Interaction Portal. Please ensure that the [{{% ctx %}} Gateway Upgrade][Upgrade Gateway] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/upgrade-cortex-interaction-portal.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeGateway" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..401e13361
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9-to-2025.9.26161/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.9 to 2025.9.26161. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2025.9.26161/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade {{% ctx %}} Interaction Portal][Upgrade CIP]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade CIP]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeCIP" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9to2025_9_26161.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/_index.md
new file mode 100644
index 000000000..8543e9e3a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2025.9.26161 to 2026.3"
+linkTitle: "2025.9.26161 to 2026.3"
+description: "Instructions to upgrade {{% ctx %}} 2025.9.26161 to 2026.3"
+weight: 898
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/_index.md
new file mode 100644
index 000000000..17f495c3e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Multiple Server - With HA"
+linkTitle: "Multiple Server - With HA"
+description: "Upgrade instructions for multiple on-premise servers with high availability (HA)."
+weight: 10
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.9.26161.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..8c7bb603d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..a38255b33
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,20 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..ffb2244e9
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/multi-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/pre-upgrade.md
new file mode 100644
index 000000000..29863009c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/pre-upgrade.md
@@ -0,0 +1,21 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available on all Servers
+
+{{< section "/upgrade/2026.3/pre-upgrade/multi-server/make-artefacts-available.md">}}
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/_index.md
new file mode 100644
index 000000000..82756e7e1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} across multiple on-premise servers with high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..7b5bd9838
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-application-and-loadbalancer-servers.md
@@ -0,0 +1,71 @@
+---
+title: "Upgrade Application Servers and Load Balancer"
+linkTitle: "Upgrade Application Servers and Load Balancer"
+description: "Information about upgrading the Application Servers and Load Balancer Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Servers and Load Balancer Server from 2025.9.26161 to 2026.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+1. In the `Cortex Innovation 2026.3 - App Server Install Scripts\Upgrade Application Server` folder, locate the `Cortex.Innovation.Upgrade.ps1` script and open it with a text editor.
+1. Choose the tab below that matches the configuration for this upgrade, then update the script to match, changing the parameters according to the details given below:
+
+ {{% alert title="Note" %}}
+To check the previous configuration values open the `Cortex.Upgrade.ApplicationConfig.json` file located in `%ProgramData%\Cortex\Upgrade`. If the file does not exist or the values should be changed then use the `Use New Configuration Values` tab.
+ {{% /alert %}}
+
+ {{< tabpane lang="powershell" >}}
+ {{< tab header="Use Previous Configuration Values" >}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2026.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2026.3 - Block Packages.zip" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< tab header="Use New Configuration Values">}}
+.\Cortex.Upgrade.ps1 `
+ -AppServicesPath "C:\Install\Cortex Innovation 2026.3 - App Services.zip" `
+ -BlockPackagesPath "C:\Install\Cortex Innovation 2026.3 - Block Packages.zip" `
+ -ApplicationServerIPv4Addresses @("192.168.1.1, 192.168.1.2, 192.168.1.3") `
+ -LoadBalancerServerIPv4Address "192.168.1.4" `
+ -Credential $Credential `
+ -AcceptEULA:$AcceptEULA `
+ *>&1 | Tee-Object -FilePath "cortex-ha-upgrade-log.txt"
+ {{< /tab >}}
+ {{< /tabpane >}}
+
+ | Name | Description |
+ |----------------------------------------------|-------------|
+ |`AppServicesPath` | Configure this value with the location of the Application Services zip file on the Application Server being used for the upgrade. |
+ |`BlockPackagesPath` | Configure this value with the location of the Block Packages zip file on the Application Server being used for the upgrade. |
+ |`ApplicationServerIPv4Addresses` | The IPv4 addresses of the Application Servers. The first of these must be the Application Server being used for the upgrade.|
+ |`LoadBalancerServerIPv4Address` | The IPv4 address of the Load Balancer Server. If the built-in load balancer is not being used, this should be removed.|
+ |`Credential` | The credentials of the user which will be used to perform remote operations on the Application Servers. It must be a domain user that is a member of the local Administrators group on all servers.
This does not need to be changed, a prompt will appear to enter this information when the script is run. |
+ |`AcceptEULA` | This does not need to be changed, the EULA will be accepted at a later stage. |
+ |`FilePath` | The filename that upgrade logs are written to. If this should be written to a different location than where the installation files are then a full path should be specified. |
+
+1. Save and close `Cortex.Innovation.Upgrade.ps1`.
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/multi-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/multi-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..f84139522
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade the Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the Web Application Server. Please ensure that [Upgrade Application Servers and Load Balancer][] has been completed before starting this installation. These steps assume that the v2025.9 version of Gateway and its prerequisites have already been installed.
+
+[Upgrade Application Servers and Load Balancer]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
new file mode 100644
index 000000000..504009f48
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-debugger.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Flow Debugger"
+linkTitle: "Upgrade Flow Debugger"
+description: "Information about upgrading the Flow Debugger."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Flow Debugger on the Web Application Server from 2025.9.26161 to 2026.3. Please ensure that the [Upgrade Application and Load Balancer Servers][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/run-upgrade-script.md">}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md">}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md">}}
+
+## Next Steps?
+
+1. [Upgrade Gateway][]
+
+[Upgrade Application and Load Balancer Servers]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..646156ff3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/multiple-server-with-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway from 2025.9 to 2025.9.26161."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.9.26161 to 2026.3. Please ensure that the [Flow Debugger upgrade][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[Flow Debugger upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.MultipleServerWithHA.PostUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/_index.md
new file mode 100644
index 000000000..3c7967a4b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Single Server - Without HA"
+linkTitle: "Single Server - Without HA"
+description: "Upgrade instructions for a single on-premise server without high availability (HA)."
+weight: 500
+---
+
+{{% alert title="Warning" color="warning" %}}
+This upgrade guide is only applicable if upgrading from 2025.9.26161.
+{{% /alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/_index.md
new file mode 100644
index 000000000..23e03e60e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Post-Upgrade"
+linkTitle: "Post-Upgrade"
+description: "Information about the steps required to be completed after the upgrade of {{% ctx %}} has been completed."
+weight: 50
+---
+
+This guide describes how to perform the steps to verify the upgrade of {{% ctx %}} and perform final configuration. Please ensure that the [Upgrade][] has been completed before starting this section.
+
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
new file mode 100644
index 000000000..77c6c4200
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/move-flows-to-new-execution-service.md
@@ -0,0 +1,20 @@
+---
+title: "Move flows to new Execution Service"
+linkTitle: "Move flows to new Execution Service"
+description: "Information about moving flows to use the new Execution Service after upgrade."
+weight: 20
+---
+
+# {{% param title %}}
+
+This guide describes how to move flow execution to the new Execution Service. Please ensure that the [Try it out][] steps have been completed before proceeding.
+
+{{% alert title="Note" %}}
+These steps are optional however it is recommended so that the new Execution Service is used after upgrade.
+{{% /alert %}}
+
+## Republish Packages
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/republish-packages.md" >}}
+
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md
new file mode 100644
index 000000000..407864cc6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/post-upgrade/try-it-out.md
@@ -0,0 +1,29 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out {{% ctx %}} after upgrade."
+weight: 10
+---
+
+# {{% param title %}}
+
+This guide describes how to try out an upgraded {{% ctx %}} to make sure it is working. Please ensure that the [Upgrade Web Application Server][] has been completed before taking these steps.
+
+## Test Debugging Flows
+
+{{< section "/try-it-out/test-debugging-flows.md" >}}
+
+## Test Publishing Production Flows
+
+{{< section "/try-it-out/test-publishing-flows.md" >}}
+
+## Test Executing Production Flows
+
+{{< section "/try-it-out/single-server/test-executing-production-flows.md" >}}
+
+## Next Steps?
+
+1. [Move flows to new Execution Service][]
+
+[Move flows to new Execution Service]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.UseNewExecutionService" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/pre-upgrade.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/pre-upgrade.md
new file mode 100644
index 000000000..12d061338
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/pre-upgrade.md
@@ -0,0 +1,27 @@
+---
+title: "Pre-Upgrade"
+linkTitle: "Pre-Upgrade"
+description: "Information about the steps required to be completed prior to starting the upgrade."
+weight: 30
+---
+
+# {{% param title %}}
+
+This guide describes how to perform the steps required before starting the upgrade of {{% ctx %}}.
+
+## Make Installation Artefacts Available
+
+{{< section "/upgrade/2026.3/pre-upgrade/single-server/make-artefacts-available.md">}}
+
+## Backup Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be backed up.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Next Steps?
+
+1. [Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.Upgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/_index.md
new file mode 100644
index 000000000..d31c34069
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade"
+linkTitle: "Upgrade"
+description: "Instructions to upgrade {{% ctx %}} on a single on-premise server without high availability (HA)."
+weight: 40
+---
+
+This guide describes how to upgrade {{% ctx %}}. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting the upgrade.
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.PreUpgrade" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md
new file mode 100644
index 000000000..9b1f8733d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-application-server.md
@@ -0,0 +1,33 @@
+---
+title: "Upgrade Application Server"
+linkTitle: "Upgrade Application Server"
+description: "Information about upgrading the Application Server."
+weight: 30
+---
+
+# {{< param title >}}
+
+This guide describes how to upgrade the Application Server components on the server from 2025.9.26161 to 2026.3. Please ensure that the [Pre-Upgrade][PreUpgrade] steps have been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/configure-upgrade-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-application-server/single-server/run-upgrade-script.md" >}}
+
+## Check Application Services
+
+{{< section "/upgrade/upgrade-application-server/single-server/check-application-services.md" >}}
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Upgrade Web Application Server][]
+
+[PreUpgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.PreUpgrade" >}}
+[Upgrade Web Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..da6527482
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Upgrade Web Application Server"
+linkTitle: "Upgrade Web Application Server"
+description: "Information about upgrading the Web Application Server."
+weight: 40
+---
+
+This guide describes how to upgrade the web application server from 2025.9.26161 to 2026.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
new file mode 100644
index 000000000..292200f53
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/2025.9.26161-to-2026.3/single-server-without-ha/upgrade/upgrade-web-application-server/upgrade-gateway.md
@@ -0,0 +1,37 @@
+---
+title: "Upgrade Gateway"
+linkTitle: "Upgrade Gateway"
+description: "Information about upgrading {{% ctx %}} Gateway"
+weight: 30
+---
+
+
+# {{% param title %}}
+
+This guide describes how to upgrade {{% ctx %}} Gateway from 2025.9.26161 to 2026.3. Please ensure that the [Upgrade Application Server][] has been completed before starting this upgrade.
+
+## Configure Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/configure-gateway-script.md" >}}
+
+## Run Upgrade Script
+
+{{< section "/upgrade/2026.3/upgrade-web-application-server/run-gateway-script.md" >}}
+
+## Restore Configuration Portal Data
+
+If using the {{% ctx %}} Configuration Portal, the data will need to be restored.
+
+For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+## Preserve installation files
+
+{{< section "/preserve-installation-files.md" >}}
+
+## Next Steps?
+
+1. [Post-Upgrade][]
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
+[Post-Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.PostUpgrade" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeCortex.2025_9_26161to2026_3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/_index.md
new file mode 100644
index 000000000..4d02a4f21
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Upgrade CORTEX"
+linkTitle: "Upgrade CORTEX"
+description: "Guides to upgrade {{% ctx %}}"
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/_index.md
new file mode 100644
index 000000000..c28d33a5c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Advanced Setup"
+linkTitle: "Advanced Setup"
+description: "Supporting information about upgrading {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/ssl-best-practices.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/ssl-best-practices.md
new file mode 100644
index 000000000..5e6b69e78
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-cortex/advanced/ssl-best-practices.md
@@ -0,0 +1,9 @@
+---
+title: "SSL Best Practices"
+linkTitle: "SSL Best Practices"
+description: "Information about the recommended security settings for {{% ctx %}} servers."
+---
+
+# {{% param title %}}
+
+{{< section "/advanced/ssl-best-practices.md" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/_index.md
new file mode 100644
index 000000000..993585efa
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2.2.0 to 3.0.0"
+linkTitle: "2.2.0 to 3.0.0"
+description: "Instructions to upgrade your observability platform for {{% ctx %}} from 2.2.0 to 3.0.0."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/_index.md
new file mode 100644
index 000000000..4eaa242d6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Cloud"
+linkTitle: "Cloud"
+description: "Information about upgrading a cloud-hosted observability platform for {{% ctx %}}."
+weight: 500
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/_index.md
new file mode 100644
index 000000000..1337f8126
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading a cloud-hosted Grafana platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/prerequisites.md
new file mode 100644
index 000000000..b3c037e20
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/prerequisites.md
@@ -0,0 +1,44 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Old Version
+
+1. Navigate to your Grafana website e.g. `https://{Team URL}.grafana.net`
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Make a note of values returned in the Overview tiles, or alternatively take a screenshot of the dashboard, to use later to verify the upgrade.
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Promtail 3.0.0][] archive.
+ * [Promtail Install][] archive.
+
+1. Extract the downloaded `promtail-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Promtail.Install` archive to a folder with the same name.
+
+## Backup Old Files
+
+On each Application Server that Promtail is installed on:
+
+1. Create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location where Promtail is running from, e.g. `C:\Promtail`.
+1. Copy the `promtail-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+
+## Next Steps?
+
+1. [Upgrade Promtail][]
+
+[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
+[Promtail Install]: {{< url path="GitHub.Cortex.Observability.3_0_0.PromtailInstallZip" >}}
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.UpgradePromtail" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/try-it-out.md
new file mode 100644
index 000000000..bded6061b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/try-it-out.md
@@ -0,0 +1,48 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Promtail][] has been completed before taking these steps.
+
+## Confirm Dashboards Load
+
+1. Navigate to your Grafana website e.g. `https://{Team URL}.grafana.net`
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Confirm the data from the previous step is similar to the data captured when [verifying the old version][].
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+Any flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open a web browser and navigate to your installed {{% ctx %}} Gateway URL, e.g. `https://server.domain.com/gateway`, and log in when prompted.
+1. Open a flow that you are able to execute on an ad hoc basis.
+1. Start the flow.
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/upgrade-promtail.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/upgrade-promtail.md
new file mode 100644
index 000000000..aa60749e1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/cloud/grafana/upgrade-promtail.md
@@ -0,0 +1,75 @@
+---
+title: "Upgrade Promtail"
+linkTitle: "Upgrade Promtail"
+description: "The steps to upgrade Promtail."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Promtail installation. Please ensure that the [Prerequisites] for upgrading Observability have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Promtail service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Promtail is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Remove the current Promtail installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Promtail.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Promtail service is confirmed.
+1. Open a File Explorer and navigate to the folder where Promtail was running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`
+1. Delete the following files from the directory:
+
+ * Install-Promtail.ps1
+ * nssm.exe
+ * Promtail-local-config.yaml
+ * Promtail-windows-amd64.exe
+ * Remove-Promtail.ps1
+ * Start-Promtail.ps1
+ * Stop-Promtail.ps1
+
+1. In File Explorer, navigate to the extracted `promtail-windows-amd64.exe` folder created as part of [Make Artefacts Available][].
+1. Copy the `promtail-windows-amd64.exe` file into the folder that Promtail was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+1. In File Explorer, navigate to the extracted `Promtail.Install` folder created as part of [Make Artefacts Available][].
+1. Copy the contents of this location into the folder that Promtail was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+1. Open `promtail-local-config.yaml` in a text editor:
+
+ * Update the *filename* property under *positions* to be the value found in the [backed up][] version.
+ * Update the *url* property under *clients* to be the value found in the [backed up][] version.
+ * Save the new `promtail-local-config.yaml` file.
+
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where the Promtail files have been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Install Promtail by executing the following command:
+
+ ``` powershell
+ .\Install-Promtail.ps1
+ ```
+
+1. Start the Promtail service by executing the following command:
+
+ ``` powershell
+ .\Start-Promtail.ps1
+ ```
+
+1. Check that the Promtail service has installed and started correctly:
+ * Open Services.msc from the Start menu.
+ * Locate the *Promtail* service and confirm that it is *Running*.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.BackupOldFiles" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.Prerequisites" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/_index.md
new file mode 100644
index 000000000..83fd0b271
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading the default Grafana dashboards for your observability platform."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/try-it-out.md
new file mode 100644
index 000000000..503f53c7c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/try-it-out.md
@@ -0,0 +1,36 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrading the dashboards."
+weight: 3
+---
+
+# {{% param title %}}
+
+## Confirm New Dashboards Display Data
+
+{{% alert title="Note" %}}
+Any flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open a web browser and navigate to your installed {{% ctx %}} Gateway URL, e.g. `https://server.domain.com/gateway`, and log in when prompted.
+1. Open a flow that you are able to execute on an ad hoc basis.
+1. Start the flow.
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/upgrade-dashboards.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/upgrade-dashboards.md
new file mode 100644
index 000000000..37f7705d3
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/Grafana/upgrade-dashboards.md
@@ -0,0 +1,40 @@
+---
+title: "Upgrade Dashboards"
+linkTitle: "Upgrade Dashboards"
+description: "Information about upgrading your Grafana dashboards."
+weight: 1
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the default dashboards that are provided for your observability platform.
+
+## Download the Default Dashboards
+
+1. Download [Grafana.Dashboards.zip][] archive containing the {{% ctx %}} default dashboards.
+1. Extract the content of the downloaded archive to a suitable location.
+
+## Import New Dashboards
+
+1. Log in to your configured Grafana with a user that has the *Admin* role.
+1. Go to *Dashboards* via the menu on the left sidebar.
+1. Click the *New* button and select *Import* from the drop-down menu.
+1. Click the *Upload JSON file* button.
+1. Locate the `Flow Execution Requests.json` file [extracted][] from the downloaded `Grafana.Dashboards.zip`.
+1. Select the file and click *Open*.
+{{% alert title="Note" %}}
+You will receive warnings that *A dashboard or folder with the same name already exists* and *Dashboard named 'Flow Execution Requests' in folder 'Cortex' has the same UID*. These can be ignored.
+{{% / alert %}}
+
+1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
+1. Select your configured Loki data source from the dropdown menu.
+1. Click *Import (Overwrite)*.
+1. Repeat steps 2 - 9 for the `Platform Health.json` file.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[extracted]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Dashboards.Grafana.Download" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.3_0_0.GrafanaDashboardsZip" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Dashboards.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/_index.md
new file mode 100644
index 000000000..4078c1304
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/dashboards/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Dashboards"
+linkTitle: "Dashboards"
+description: "Information about upgrading the default dashboards provided for your observability platform."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/_index.md
@@ -0,0 +1,6 @@
+---
+title: "On-Premise"
+linkTitle: "On-Premise"
+description: "Information about upgrading an on-premise observability platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading an on-premise Grafana platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..d7f199784
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/prerequisites.md
@@ -0,0 +1,60 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Old Version
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Make a note of the version number under the login prompt.
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Make a note of values returned in the Overview tiles, or alternatively take a screenshot of the dashboard, to use later to verify the upgrade.
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Grafana 10.4.1][] Standalone Windows Binaries archive.
+ * [Grafana Loki 3.0.0][] archive.
+ * [Grafana Loki Install][] archive.
+ * [Promtail 3.0.0][] archive.
+ * [Promtail Install][] archive.
+
+1. Extract the downloaded `grafana-enterprise-10.4.1.windows-amd64` archive to a folder with the same name.
+1. Extract the downloaded `loki-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Grafana.Loki.Install` archive to a folder with the same name.
+1. Extract the downloaded `promtail-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Promtail.Install` archive to a folder with the same name.
+
+## Backup Old Files
+
+1. On the server that Grafana and Loki is installed on, create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location that Grafana was previously installed to, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana\conf`.
+1. Copy the `custom.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. Copy the `defaults.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. In File Explorer, navigate to the location that Loki is running from, e.g. `C:\Loki\`.
+1. Copy the `loki-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+1. On each Application Server that Promtail is installed on:
+
+ 1. Create a folder called `Observability Backups` in a known location.
+ 1. Open File Explorer and navigate to the location that Promtail is running from, e.g. `C:\Promtail`.
+ 1. Copy the `promtail-local-config.yaml` file and save it to the `Observability Backups` folder created at step 7.1.
+
+## Next Steps?
+
+1. [Upgrade Grafana][]
+
+[Grafana 10.4.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.10_4_1.Windows" >}}
+[Grafana Loki 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_0_0.GrafanaLokiInstallZip" >}}
+[Grafana Loki Install]: {{< url path="GitHub.Cortex.Observability.3_0_0.GrafanaLokiInstallZip" >}}
+[Promtail 3.0.0]: {{< url path="Grafana.SelfManaged.Downloads.Promtail.3_0_0.PromtailInstallZip" >}}
+[Promtail Install]: {{< url path="GitHub.Cortex.Observability.3_0_0.PromtailInstallZip" >}}
+[Upgrade Grafana]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..bb1eddffe
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/try-it-out.md
@@ -0,0 +1,54 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 5
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Promtail][] has been completed before taking these steps.
+
+## Confirm Grafana Upgrade
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`.
+1. Identify the version number under the login prompt.
+1. Confirm the version has updated to be 10.4.1.
+
+## Confirm Dashboards Load
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Confirm the data from the previous step is similar to the data captured when [verifying the old version][].
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+Any flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open a web browser and navigate to your installed {{% ctx %}} Gateway URL, e.g. `https://server.domain.com/gateway`, and log in when prompted.
+1. Open a flow that you are able to execute on an ad hoc basis.
+1. Start the flow.
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-grafana.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-grafana.md
new file mode 100644
index 000000000..cf0d01fd5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-grafana.md
@@ -0,0 +1,31 @@
+---
+title: "Upgrade Grafana"
+linkTitle: "Upgrade Grafana"
+description: "The steps to upgrade Grafana."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Grafana installation. Please ensure that the [Prerequisites] for upgrading Observability have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Grafana website.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and stop it by right-clicking on the service and selecting *Stop*.
+1. In File Explorer, navigate to the `grafana-enterprise-10.4.1.windows-amd64` folder created as part of [Make Artefacts Available][].
+1. Open the `grafana-v10.4.1` subfolder.
+1. Copy the contents of this folder into the Grafana install location, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana`, and click `Replace the files in the destination` when prompted.
+1. Copy the [backed up][] `custom.ini` and `defaults.ini` files into the Grafana install configuration location, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana\conf`, and click `Replace the files in the destination` when prompted.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and start it by right-clicking on the service and selecting *Start*.
+
+## Next Steps?
+
+1. [Upgrade Loki][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.Prerequisites" >}}
+[Upgrade Loki]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradeLoki" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-loki.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-loki.md
new file mode 100644
index 000000000..d1b97fb0e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-loki.md
@@ -0,0 +1,93 @@
+---
+title: "Upgrade Loki"
+linkTitle: "Upgrade Loki"
+description: "The steps to upgrade Loki."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Loki installation. Please ensure that the [Grafana Upgrade] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Loki service.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Loki is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Remove the current Loki installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Loki.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Loki service is confirmed.
+1. Open a File Explorer and navigate to the folder where Loki was running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Delete the following files from the directory:
+
+ * Install-Loki.ps1
+ * loki-local-config.yaml
+ * loki-windows-amd64.exe
+ * nssm.exe
+ * Remove-Loki.ps1
+ * Start-Loki.ps1
+ * Stop-Loki.ps1
+
+1. In File Explorer, navigate to the extracted `loki-windows-amd64.exe` folder created as part of [Make Artefacts Available][].
+1. Copy the `loki-windows-amd64.exe` file into the folder that Loki was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. In File Explorer, navigate to the extracted `Grafana.Loki.Install` folder created as part of [Make Artefacts Available][].
+1. Copy the contents of this location into the folder that Loki was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Open the new `loki-local-config.yaml` file in a text editor and compare against the [backed up][] version. If there are differences between the two files in the *schema_config* > *configs* section:
+
+ 1. In the new file, change the date next to `- from` to be today's date.
+ 1. Copy the old config section from the backup and add it immediately under *configs* and before the existing `- from ` line ensuring that formatting (including indentations) remain identical to that which is used in the new file.
+
+ The new *schema_config* should result in something similar to:
+
+ ```yaml
+ schema_config:
+ configs:
+ - from: 2020-10-24
+ store: boltdb-shipper
+ object_store: filesystem
+ schema: v11
+ index:
+ prefix: index_
+ period: 24h
+ - from: 2024-08-29
+ store: tsdb
+ object_store: filesystem
+ schema: v13
+ index:
+ prefix: index_
+ period: 24h
+ ```
+
+ 1. Save the new `loki-local-config.yaml` file.
+
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where the Loki files have been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Install Loki by executing the following command:
+
+ ``` powershell
+ .\Install-Loki.ps1
+ ```
+
+1. Start the Loki service by executing the following command:
+
+ ``` powershell
+ .\Start-Loki.ps1
+ ```
+
+1. Check that the Loki service has installed and started correctly:
+ * Open Services.msc from the Start menu.
+ * Locate the *Loki* service and confirm that it is *Running*.
+
+## Next Steps?
+
+1. [Upgrade Promtail][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Grafana Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradePromtail" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-promtail.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-promtail.md
new file mode 100644
index 000000000..077d5e123
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/2.2.0-to-3.0.0/on-premise/grafana/upgrade-promtail.md
@@ -0,0 +1,75 @@
+---
+title: "Upgrade Promtail"
+linkTitle: "Upgrade Promtail"
+description: "The steps to upgrade Promtail."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Promtail installation. Please ensure that the [Loki Upgrade][] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Promtail service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Promtail is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Remove the current Promtail installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Promtail.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Promtail service is confirmed.
+1. Open a File Explorer and navigate to the folder where Promtail was running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`
+1. Delete the following files from the directory:
+
+ * Install-Promtail.ps1
+ * nssm.exe
+ * Promtail-local-config.yaml
+ * Promtail-windows-amd64.exe
+ * Remove-Promtail.ps1
+ * Start-Promtail.ps1
+ * Stop-Promtail.ps1
+
+1. In File Explorer, navigate to the extracted `promtail-windows-amd64.exe` folder created as part of [Make Artefacts Available][].
+1. Copy the `promtail-windows-amd64.exe` file into the folder that Promtail was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+1. In File Explorer, navigate to the extracted `Promtail.Install` folder created as part of [Make Artefacts Available][].
+1. Copy the contents of this location into the folder that Promtail was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+1. Open the new `promtail-local-config.yaml` in a text editor:
+
+ * Update the *filename* property under *positions* to be the value found in the [backed up][] version.
+ * Update the *url* property under *clients* to be the value found in the [backed up][] version.
+ * Save the new `promtail-local-config.yaml` file.
+
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where the Promtail files have been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Install Promtail by executing the following command:
+
+ ``` powershell
+ .\Install-Promtail.ps1
+ ```
+
+1. Start the Promtail service by executing the following command:
+
+ ``` powershell
+ .\Start-Promtail.ps1
+ ```
+
+1. Check that the Promtail service has installed and started correctly:
+ * Open Services.msc from the Start menu.
+ * Locate the *Promtail* service and confirm that it is *Running*.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Loki Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.UpgradeLoki" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/_index.md
new file mode 100644
index 000000000..c2217ab79
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/_index.md
@@ -0,0 +1,6 @@
+---
+title: "3.0.0 to 4.0.0"
+linkTitle: "3.0.0 to 4.0.0"
+description: "Instructions to upgrade your observability platform for {{% ctx %}} from 3.0.0 to 4.0.0."
+weight: 990
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/_index.md
new file mode 100644
index 000000000..4eaa242d6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Cloud"
+linkTitle: "Cloud"
+description: "Information about upgrading a cloud-hosted observability platform for {{% ctx %}}."
+weight: 500
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/_index.md
new file mode 100644
index 000000000..1337f8126
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading a cloud-hosted Grafana platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/migrate-to-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/migrate-to-alloy.md
new file mode 100644
index 000000000..704ac550b
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/migrate-to-alloy.md
@@ -0,0 +1,58 @@
+---
+title: "Migrate to Grafana Alloy"
+linkTitle: "Migrate to Grafana Alloy"
+description: "The steps to Migrate Promtail to Grafana Alloy."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to migrate from a Promtail Installation to Grafana Alloy.
+
+## Perform Migration
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Promtail service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Promtail is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Remove the current Promtail installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Promtail.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Promtail service is confirmed.
+1. Open a File Explorer and navigate to the extracted alloy-installer-windows-amd64.exe folder created as part of [Make Artefacts Available][].
+1. Copy the alloy-installer-windows-amd64.exe into a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. In File Explorer, navigate to the extracted Grafana.Alloy.Install folder created as part of [Make Artefacts Available][].
+1. Copy the contents of the folder to the same location as the previously copied alloy-installer-windows-amd64.exe.
+1. In Powershell change the location to the folder that the artefacts have been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Install Grafana Alloy by executing the following command and passing in the correct path for the `promtail-local-config.yaml`:
+
+ ``` powershell
+ .\Migrate-Promtail-To-Alloy.ps1 -PromtailConfig "C:\ProgramData\Cortex\Observability\Promtail\promtail-local-config.yaml"
+ ```
+
+1. When prompted, enter the credentials that the Grafana Alloy Service should run as.
+1. When prompted to enter the bearer token, leave it blank and press Enter.
+1. Once the migration has completed, delete the now obsolete Promtail directory e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+
+## Configure Grafana Alloy
+
+1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
+1. Delete the line containing `bearer_token_file` in the `loki.write "default"` > `endpoint` section, which can be found at the end of the file.
+1. Save the file.
+1. Open `services.msc`.
+1. Locate the `Alloy` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.MakeArtefactsAvailable" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md
new file mode 100644
index 000000000..d9491a473
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/prerequisites.md
@@ -0,0 +1,40 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Grafana Alloy 1.10.2][] archive.
+ * [Grafana Alloy Install][] archive.
+
+1. Extract the downloaded `alloy-installer-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Grafana.Alloy.Install` archive to a folder with the same name.
+
+## Security Requirements
+
+### Service User
+
+Grafana Alloy requires a domain user that is not a member of the Local Administrators group on any of the Application Servers. This user must be given the `Log on as a service` right otherwise the service will not be able to run. This permission will be granted as part of the install if it is not already granted.
+
+## Backup Old Files
+
+On each Application Server that Promtail is installed on:
+
+1. Create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location where Promtail is running from, e.g. `C:\Promtail`.
+1. Copy the `promtail-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+
+## Next Steps?
+
+1. [Migrate Promtail to Grafana Alloy][Migrate to Alloy]
+
+[Grafana Alloy 1.10.2]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_10_2.Windows" >}}
+[Grafana Alloy Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaAlloyInstallZip" >}}
+[Migrate to Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.MigrateToAlloy" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/try-it-out.md
new file mode 100644
index 000000000..dd13896be
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/cloud/grafana/try-it-out.md
@@ -0,0 +1,51 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Migration to Grafana Alloy][Migrate To Alloy] has been completed before taking these steps.
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Migrate To Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.MigrateToAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.2_2_0to3_0_0.Cloud.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/_index.md
@@ -0,0 +1,6 @@
+---
+title: "On-Premise"
+linkTitle: "On-Premise"
+description: "Information about upgrading an on-premise observability platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading an on-premise Grafana platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/migrate-to-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/migrate-to-alloy.md
new file mode 100644
index 000000000..72194d935
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/migrate-to-alloy.md
@@ -0,0 +1,61 @@
+---
+title: "Migrate to Grafana Alloy"
+linkTitle: "Migrate to Grafana Alloy"
+description: "The steps to Migrate Promtail to Grafana Alloy."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to migrate from a Promtail Installation to Grafana Alloy. Please ensure that the [Loki Upgrade][] has been completed before starting this upgrade.
+
+## Modify Client URL for Grafana Loki
+
+1. Open the `promtail-local-config.yaml` configuration file, which is located in the folder alongside the `promtail-windows-amd64.exe` file e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+1. Locate the Grafana Loki `URL` in the `clients` section.
+1. Remove the `username:password@` from the URL
+
+ A correct URL should be changed from `https://username:password@hostaddress:2100/loki/api/v1/push` to `https://hostaddress:2100/loki/api/v1/push`.
+1. Save the file.
+
+## Perform Migration
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Promtail service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Promtail is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Promtail`.
+1. Remove the current Promtail installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Promtail.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Promtail service is confirmed.
+1. Open a File Explorer and navigate to the extracted alloy-installer-windows-amd64.exe folder created as part of [Make Artefacts Available][].
+1. Copy the alloy-installer-windows-amd64.exe into a suitable location, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. In File Explorer, navigate to the extracted Grafana.Alloy.Install folder created as part of [Make Artefacts Available][].
+1. Copy the contents of the folder to the same location as the previously copied alloy-installer-windows-amd64.exe.
+1. In Powershell change the location to the folder that the artefacts have been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Install Grafana Alloy by executing the following command and passing in the correct path for the `promtail-local-config.yaml`:
+
+ ``` powershell
+ .\Migrate-Promtail-To-Alloy.ps1 -PromtailConfig "C:\ProgramData\Cortex\Observability\Promtail\promtail-local-config.yaml"
+ ```
+
+1. When prompted, enter the credentials that the Grafana Alloy Service should run as.
+1. When prompted, enter the bearer token that was specified when [configuring authentication for the Reverse Proxy][Reverse Proxy Authentication]
+1. Once the migration has completed, delete the now obsolete Promtail directory e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Loki Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.UpgradeLoki" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Reverse Proxy Authentication]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.SetupAuthentication" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..f0e157e13
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/prerequisites.md
@@ -0,0 +1,77 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Old Version
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Make a note of the version number under the login prompt.
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Make a note of values returned in the Overview tiles, or alternatively take a screenshot of the dashboard, to use later to verify the upgrade.
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Grafana 12.1.1][] Standalone Windows Binaries (64 Bit) archive.
+ * [Grafana Alloy 1.10.2][] archive.
+ * [Grafana Alloy Install][] archive.
+ * [Grafana Loki 3.5.5][] archive.
+
+1. Extract the downloaded `grafana-enterprise_12.1.1_16903967602_windows_amd64` archive:
+ 1. Open a Windows Powershell (x64) window as administrator.
+ 1. Navigate Powershell to inside the folder containing the `grafana-enterprise_12.1.1_16903967602_windows_amd64.tar.gz` archive using the following command modifying the path as necessary:
+
+ ``` Powershell
+ cd "C:\Install"
+ ```
+
+ 1. Execute the following command and wait for it to complete:
+
+ ``` Powershell
+ tar -xvzf grafana-enterprise_12.1.1_16903967602_windows_amd64.tar.gz
+ ```
+
+1. Extract the downloaded `alloy-installer-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Grafana.Alloy.Install` archive to a folder with the same name.
+1. Extract the downloaded `loki-windows-amd64.exe` archive to a folder with the same name.
+
+## Security Requirements
+
+### Service User
+
+Grafana Alloy requires a domain user that is not a member of the Local Administrators group on any of the Application Servers. This user must be given the `Log on as a service` right otherwise the service will not be able to run. This permission will be granted as part of the install if it is not already granted.
+
+## Backup Old Files
+
+1. On the server that Grafana and Loki is installed on, create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location that Grafana was previously installed to, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana\conf`.
+1. Copy the `custom.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. Copy the `defaults.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. In File Explorer, navigate to the location that Loki is running from, e.g. `C:\ProgramData\Cortex\Observability\Loki\`.
+1. Copy the `loki-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+1. On each Application Server that Promtail is installed on:
+
+ 1. Create a folder called `Observability Backups` in a known location.
+ 1. Open File Explorer and navigate to the location that Promtail is running from, e.g. `C:\ProgramData\Cortex\Observability\Promtail`.
+ 1. Copy the `promtail-local-config.yaml` file and save it to the `Observability Backups` folder created at step 7.1.
+
+## Next Steps?
+
+1. [Upgrade Grafana][]
+
+[Grafana 12.1.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.12_1_1.Windows" >}}
+[Grafana Loki 3.5.5]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_5_5.GrafanaLokiInstallZip" >}}
+[Grafana Loki Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaLokiInstallZip" >}}
+[Grafana Alloy 1.10.2]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_10_2.Windows" >}}
+[Grafana Alloy Install]: {{< url path="GitHub.Cortex.Observability.4_0_0.GrafanaAlloyInstallZip" >}}
+[Upgrade Grafana]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..96fda2b0a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/try-it-out.md
@@ -0,0 +1,67 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 5
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Migration to Grafana Alloy][Migrate To Alloy] has been completed before taking these steps.
+
+## Confirm Grafana Upgrade
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`.
+1. Identify the version number under the login prompt.
+1. Confirm the version has updated to be 12.1.1.
+
+## Confirm Dashboards Load
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Confirm the data from the previous step is similar to the data captured when [verifying the old version][].
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Migrate To Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MigrateToAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-grafana.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-grafana.md
new file mode 100644
index 000000000..95e06f21a
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-grafana.md
@@ -0,0 +1,29 @@
+---
+title: "Upgrade Grafana"
+linkTitle: "Upgrade Grafana"
+description: "The steps to upgrade Grafana."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Grafana installation. Please ensure that the [Prerequisites] for upgrading Observability have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Grafana website.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and stop it by right-clicking on the service and selecting *Stop*.
+1. In File Explorer, navigate to the `grafana-12.1.1` folder created as part of [Make Artefacts Available][].
+1. Copy the contents of this folder into the Grafana install location, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana`, and click `Replace the files in the destination` when prompted.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and start it by right-clicking on the service and selecting *Start*.
+
+## Next Steps?
+
+1. [Upgrade Loki][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.Prerequisites" >}}
+[Upgrade Loki]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.UpgradeLoki" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-loki.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-loki.md
new file mode 100644
index 000000000..15acef44c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/3.0.0-to-4.0.0/on-premise/grafana/upgrade-loki.md
@@ -0,0 +1,126 @@
+---
+title: "Upgrade Loki"
+linkTitle: "Upgrade Loki"
+description: "The steps to upgrade Loki."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Loki installation. Please ensure that the [Grafana Upgrade] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Loki service.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Loki is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Remove the current Loki installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Loki.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Loki service is confirmed.
+1. Open a File Explorer and navigate to the folder where Loki was running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Delete the following file from the directory:
+
+ * loki-windows-amd64.exe
+
+1. In File Explorer, navigate to the extracted `loki-windows-amd64.exe` folder created as part of [Make Artefacts Available][].
+1. Copy the `loki-windows-amd64.exe` file into the folder that Loki was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where the Loki file has been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Install Loki by executing the following command:
+
+ ``` powershell
+ .\Install-Loki.ps1
+ ```
+
+1. Start the Loki service by executing the following command:
+
+ ``` powershell
+ .\Start-Loki.ps1
+ ```
+
+1. Check that the Loki service has installed and started correctly:
+ * Open Services.msc from the Start menu.
+ * Locate the *Loki* service and confirm that it is *Running*.
+
+## Make Reverse Proxy changes
+
+### Disable Basic Authentication
+
+1. Run IIS Manager.
+1. In the *Connection* pane, browse to *Sites*.
+1. Select the website for the Loki Reverse Proxy e.g. `Grafana Loki`.
+1. Double-click on the *Authentication* icon.
+1. Enable *Anonymous Authentication*.
+1. Disable *Basic Authentication*.
+
+### Configure URL Rewrite Rules
+
+#### Set-up Authentication
+
+1. Run IIS Manager.
+1. In the *Connection* pane, browse to *Sites*.
+1. Select the website for the Loki Reverse Proxy e.g. `Grafana Loki`.
+1. Double-click on the *URL Rewrite* icon.
+1. In the *Actions* pane, click *Add Rule(s)...*.
+1. Select *Blank rule* from the *Inbound Rules* section.
+1. Click *OK*.
+1. In the *Edit Inbound Rule* Dialog:
+ * Enter a *Name* for the rule, e.g. *Bearer Authentication*.
+ * Configure the *Match URL* section:
+ * *Requested URL* should be set to `Matches the Pattern`.
+ * *Using* should be set to `Regular Expressions`.
+ * *Pattern* should be set to `.*`.
+ * *Ignore case* should be checked.
+ * In the *Conditions* section:
+ * *Logical Grouping* should be set to `Match Any`.
+ * Click `Add...` to add a new condition.
+ * In the *Edit Condition* dialog:
+ * *Condition Input* should be set to `{HTTP_AUTHORIZATION}`.
+ * *Check if input string:* should be set to `Does Not Match the Pattern`.
+ * *Pattern* should be set to `^Bearer $` replacing <Bearer Token> with an appropriate value.
+
+ A valid Bearer Token can be generated by any token generator, e.g. [Token Generator][], and should be a minimum of 64 characters consisting of uppercase and lowercase letters as well as numbers but should not contain any symbols. This token value should be saved for use when [Migrating Promtail to Grafana Alloy][Migrate to Alloy].
+ * *Ignore case* should be unchecked.
+ * Click `OK`.
+ * In the *Action* section:
+ * *Action Type* should be set to `Custom Response`.
+ * *Action Properties* should be configured as follows:
+ * *Status code* should be set to `401`.
+ * *Reason* should be set to `Unauthorised`.
+ * *Error description* should be set to `Invalid Bearer Token`.
+1. In the *Actions* pane, click *Apply*.
+
+#### Ensure Correct Ordering of URL Rewrite Rules
+
+The URL Rewrite rules should be in the following order:
+
+1. Bearer Authentication
+2. ReverseProxyInboundRule
+
+If the order is incorrect:
+
+1. Select the *Bearer Authentication* rule.
+1. In the *Actions* pane, click *Move Up*.
+1. If prompted that inheritance will be affected, click *Yes*.
+
+### Restart the Website
+
+1. Run IIS Manager.
+1. In the *Connection* pane, browse to *Sites*.
+1. Select the website for the Loki Reverse Proxy e.g. `Grafana Loki`.
+1. In the *Manage Website* pane, click *Restart*.
+
+## Next Steps?
+
+1. [Migrate Promtail to Grafana Alloy][Migrate to Alloy]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Grafana Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Migrate to Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MigrateToAlloy" >}}
+[Token Generator]: {{< url path="IT-Tools.TokenGenerator" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/_index.md
new file mode 100644
index 000000000..c098e58af
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/_index.md
@@ -0,0 +1,6 @@
+---
+title: "4.0.0 to 4.1.0"
+linkTitle: "4.0.0 to 4.1.0"
+description: "Instructions to upgrade your observability platform for {{% ctx %}} from 4.0.0 to 4.1.0."
+weight: 980
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/_index.md
new file mode 100644
index 000000000..4eaa242d6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Cloud"
+linkTitle: "Cloud"
+description: "Information about upgrading a cloud-hosted observability platform for {{% ctx %}}."
+weight: 500
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/_index.md
new file mode 100644
index 000000000..1337f8126
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading a cloud-hosted Grafana platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/prerequisites.md
new file mode 100644
index 000000000..e49aff4e4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/prerequisites.md
@@ -0,0 +1,33 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Upgrade Required
+
+On each Application Server:
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the folder that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Open the `config.alloy` configuration file in a text editor.
+1. Search the file for `local.file_match "ExecutionService"`.
+1. If the search returns no results, proceed with the upgrade process, if results are returned then Observability has already been updated to 4.1.0 automatically as part of the [3.0.0 to 4.0.0][] upgrade and no further steps are required.
+
+## Backup Old Files
+
+1. On each Application Server that Grafana Alloy is installed on:
+
+ 1. Create a folder called `Observability Backups` in a known location.
+ 1. Open File Explorer and navigate to the location that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+ 1. Copy the `config.alloy` file and save it to the `Observability Backups` folder created at step 1.1.
+
+## Next Steps?
+
+1. [Upgrade Grafana Alloy][]
+
+[3.0.0 to 4.0.0]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.Cloud.Grafana.MainDoc" >}}
+[Upgrade Grafana Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.Cloud.Grafana.UpgradeAlloy" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/try-it-out.md
new file mode 100644
index 000000000..4fe381793
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/try-it-out.md
@@ -0,0 +1,50 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Grafana Alloy][Upgrade Alloy] has been completed before taking these steps.
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.Cloud.Grafana.UpgradeAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/upgrade-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/upgrade-alloy.md
new file mode 100644
index 000000000..82a89ad38
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/cloud/grafana/upgrade-alloy.md
@@ -0,0 +1,102 @@
+---
+title: "Upgrade Grafana Alloy"
+linkTitle: "Upgrade Grafana Alloy"
+description: "The steps to Upgrade Grafana Alloy."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade Grafana Alloy. Please ensure that the [Prerequisites][] have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Grafana Alloy service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the folder that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Open the `config.alloy` configuration file in a text editor.
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the file but before the `loki.write "default" {` section typically found on line 99.
+
+ ``` text
+ local.file_match "ExecutionService" {
+ path_targets = [{
+ __address__ = "localhost",
+ __path__ = "C:/ProgramData/Cortex/Execution Service/Logs/**/*.json",
+ job = "ExecutionService",
+ }]
+ }
+
+ loki.process "ExecutionService" {
+ forward_to = [loki.write.default.receiver]
+
+ stage.json {
+ expressions = {
+ level = "\"@l\"",
+ timestamp = "\"@t\"",
+ }
+ }
+
+ stage.timestamp {
+ source = "timestamp"
+ format = "RFC3339Nano"
+ }
+
+ stage.match {
+ selector = "{job=\"ExecutionService\"}|~ \"\\\"SourceContext\\\":.?\\\"Cortex[.]ServiceFabric[.]Service[.]Execution[.]ExecutionService\\\"\""
+
+ stage.json {
+ expressions = {
+ BlockName = "Event.Tags.Cortex.\"Block.Name\" || 'Unknown'",
+ BlockResult = "Event.Tags.Cortex.\"Block.Result.Status\" || 'Unknown'",
+ ExceptionCategory = "Event.Tags.Cortex.\"Exception.Category\" || 'N/A'",
+ ExceptionErrorCode = "Event.Tags.Cortex.\"Exception.ErrorCode\" || 'N/A'",
+ ExceptionType = "Event.Tags.Cortex.\"Exception.Type\" || 'N/A'",
+ FlowName = "Event.Tags.Cortex.\"Flow.Name\" || 'Unknown'",
+ Node = "Event.Platform.Node.Name || 'Unknown'",
+ PackageName = "Event.Tags.Cortex.\"Package.Name\" || 'Unknown'",
+ System = "Event.Tags.Cortex.\"System.Name\" || 'Unknown'",
+ Tenant = "Event.Tags.Cortex.\"Tenant.Name\" || 'Unknown'",
+ Type = "Event.LogType || 'Cortex'",
+ }
+ }
+
+ stage.labels {
+ values = {
+ BlockName = null,
+ BlockResult = null,
+ ExceptionCategory = null,
+ ExceptionErrorCode = null,
+ ExceptionType = null,
+ FlowName = null,
+ Node = null,
+ PackageName = null,
+ System = null,
+ Tenant = null,
+ Type = null,
+ }
+ }
+ }
+ }
+
+ loki.source.file "ExecutionService" {
+ targets = local.file_match.ExecutionService.targets
+ forward_to = [loki.process.ExecutionService.receiver]
+ }
+
+ ```
+1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
+1. Save the file.
+1. Restart the Grafana Alloy Service:
+ 1. Open `services.msc`.
+ 1. Locate the `Alloy` service.
+ 1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.Cloud.Grafana.Prerequisites" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.Cloud.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/_index.md
@@ -0,0 +1,6 @@
+---
+title: "On-Premise"
+linkTitle: "On-Premise"
+description: "Information about upgrading an on-premise observability platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading an on-premise Grafana platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..18011e476
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/prerequisites.md
@@ -0,0 +1,33 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Upgrade Required
+
+On each Application Server:
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the folder that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Open the `config.alloy` configuration file in a text editor.
+1. Search the file for `local.file_match "ExecutionService"`.
+1. If the search returns no results, proceed with the upgrade process, if results are returned then Observability has already been updated to 4.1.0 automatically as part of the [3.0.0 to 4.0.0][] upgrade and no further steps are required.
+
+## Backup Old Files
+
+1. On each Application Server that Grafana Alloy is installed on:
+
+ 1. Create a folder called `Observability Backups` in a known location.
+ 1. Open File Explorer and navigate to the location that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+ 1. Copy the `config.alloy` file and save it to the `Observability Backups` folder created at step 1.1.
+
+## Next Steps?
+
+1. [Upgrade Grafana Alloy][]
+
+[3.0.0 to 4.0.0]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MainDoc" >}}
+[Upgrade Grafana Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.OnPremise.Grafana.UpgradeAlloy" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..1807952ee
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/try-it-out.md
@@ -0,0 +1,50 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 5
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Grafana Alloy][Upgrade Alloy] has been completed before taking these steps.
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.OnPremise.Grafana.UpgradeAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/upgrade-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/upgrade-alloy.md
new file mode 100644
index 000000000..33082c6cc
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.0.0-to-4.1.0/on-premise/grafana/upgrade-alloy.md
@@ -0,0 +1,103 @@
+---
+title: "Upgrade Grafana Alloy"
+linkTitle: "Upgrade Grafana Alloy"
+description: "The steps to Upgrade Grafana Alloy."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade Grafana Alloy. Please ensure that the [Prerequisites][] have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Grafana Alloy service.
+{{% / alert %}}
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the folder that Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Open the `config.alloy` configuration file in a text editor.
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the file but before the `loki.write "default" {` section typically found on line 99.
+
+ ``` text
+ local.file_match "ExecutionService" {
+ path_targets = [{
+ __address__ = "localhost",
+ __path__ = "C:/ProgramData/Cortex/Execution Service/Logs/**/*.json",
+ job = "ExecutionService",
+ }]
+ }
+
+ loki.process "ExecutionService" {
+ forward_to = [loki.write.default.receiver]
+
+ stage.json {
+ expressions = {
+ level = "\"@l\"",
+ timestamp = "\"@t\"",
+ }
+ }
+
+ stage.timestamp {
+ source = "timestamp"
+ format = "RFC3339Nano"
+ }
+
+ stage.match {
+ selector = "{job=\"ExecutionService\"}|~ \"\\\"SourceContext\\\":.?\\\"Cortex[.]ServiceFabric[.]Service[.]Execution[.]ExecutionService\\\"\""
+
+ stage.json {
+ expressions = {
+ BlockName = "Event.Tags.Cortex.\"Block.Name\" || 'Unknown'",
+ BlockResult = "Event.Tags.Cortex.\"Block.Result.Status\" || 'Unknown'",
+ ExceptionCategory = "Event.Tags.Cortex.\"Exception.Category\" || 'N/A'",
+ ExceptionErrorCode = "Event.Tags.Cortex.\"Exception.ErrorCode\" || 'N/A'",
+ ExceptionType = "Event.Tags.Cortex.\"Exception.Type\" || 'N/A'",
+ FlowName = "Event.Tags.Cortex.\"Flow.Name\" || 'Unknown'",
+ Node = "Event.Platform.Node.Name || 'Unknown'",
+ PackageName = "Event.Tags.Cortex.\"Package.Name\" || 'Unknown'",
+ System = "Event.Tags.Cortex.\"System.Name\" || 'Unknown'",
+ Tenant = "Event.Tags.Cortex.\"Tenant.Name\" || 'Unknown'",
+ Type = "Event.LogType || 'Cortex'",
+ }
+ }
+
+ stage.labels {
+ values = {
+ BlockName = null,
+ BlockResult = null,
+ ExceptionCategory = null,
+ ExceptionErrorCode = null,
+ ExceptionType = null,
+ FlowName = null,
+ Node = null,
+ PackageName = null,
+ System = null,
+ Tenant = null,
+ Type = null,
+ }
+ }
+ }
+ }
+
+ loki.source.file "ExecutionService" {
+ targets = local.file_match.ExecutionService.targets
+ forward_to = [loki.process.ExecutionService.receiver]
+ }
+
+ ```
+1. Set the `__path__` in the `local.file_match "ExecutionService"` > `path_targets` section to the path of the `Logs` folder for the Execution Service, e.g. `"C:/ProgramData/Cortex/Execution Service/Logs/**/*.json"`.
+1. Save the file.
+1. Restart the Grafana Alloy Service:
+ 1. Open `services.msc`.
+ 1. Locate the `Alloy` service.
+ 1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[backed up]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.OnPremise.Grafana.BackupOldFiles" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.OnPremise.Grafana.Prerequisites" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_0_0to4_1_0.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/_index.md
new file mode 100644
index 000000000..1471107ce
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/_index.md
@@ -0,0 +1,10 @@
+---
+title: "4.1.0 to 4.2.1"
+linkTitle: "4.1.0 to 4.2.1"
+description: "Instructions to upgrade your observability platform for {{% ctx %}} from 4.1.0 to 4.2.1."
+weight: 970
+---
+
+{{% alert title="Note" %}}
+There is no upgrade to 4.2.1 required for cloud-hosted observability platforms.
+{{% / alert %}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/_index.md
@@ -0,0 +1,6 @@
+---
+title: "On-Premise"
+linkTitle: "On-Premise"
+description: "Information about upgrading an on-premise observability platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading an on-premise Grafana platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..40449a128
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/prerequisites.md
@@ -0,0 +1,31 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Upgrade Required
+
+On the server that Grafana Loki is installed on:
+
+1. Log in to the server.
+1. Open a File Explorer and navigate to the folder that Grafana Loki is running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Open the `loki-local-config.yaml` configuration file in a text editor.
+1. Search the file for `compactor:`.
+1. If the search returns no results, proceed with the upgrade process, if results are returned then Observability has already been updated to 4.2.1 automatically as part of the [3.0.0 to 4.0.0][] upgrade and no further steps are required.
+
+## Backup Old Files
+
+1. On the server that Grafana Loki is installed on, create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location that Grafana Loki is running from, e.g. `C:\ProgramData\Cortex\Observability\Loki\`.
+1. Copy the `loki-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+
+## Next Steps?
+
+1. [Upgrade Grafana Loki][]
+
+[3.0.0 to 4.0.0]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.3_0_0to4_0_0.OnPremise.Grafana.MainDoc" >}}
+[Upgrade Grafana Loki]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_1_0to4_2_1.OnPremise.Grafana.UpgradeLoki" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..b6519c2b6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/try-it-out.md
@@ -0,0 +1,61 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 5
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Grafana Loki][Upgrade Loki] has been completed before taking these steps.
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+## Confirm Retention Period is being Applied
+
+1. In a web browser, navigate to and log in to your configured Grafana.
+1. Open the *Flow Execution Requests* dashboard.
+1. Set the *Time Filter* to be a period greater than the retention period that has been set.
+1. Ensure that there is no data available for the time period that is greater than the retention period.
+
+ {{% alert title="Note" %}}
+Loki may take some time to remove logs older than the retention period, therefore, if there is still data available beyond the retention period, repeat the above steps at a later time.
+ {{% / alert %}}
+
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Upgrade Loki]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_1_0to4_2_1.OnPremise.Grafana.UpgradeLoki" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/upgrade-loki.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/upgrade-loki.md
new file mode 100644
index 000000000..de7436d89
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.1.0-to-4.2.1/on-premise/grafana/upgrade-loki.md
@@ -0,0 +1,47 @@
+---
+title: "Upgrade Grafana Loki"
+linkTitle: "Upgrade Grafana Loki"
+description: "The steps to Upgrade Grafana Loki."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade Grafana Loki. Please ensure that the [Prerequisites][] have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+On the server that Grafana Loki is installed on:
+
+1. Log in to the server.
+1. Open a File Explorer and navigate to the folder that Grafana Loki is running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Open the `loki-local-config.yaml` configuration file in a text editor.
+1. Copy the following code and paste it in to the `loki-local-config.yaml` file. It should be added immediately before the `schema_config:` section typically found on line 30.
+
+ ``` text
+ compactor:
+ retention_enabled: true
+ delete_request_store: filesystem
+ working_directory: /data/retention
+
+ ```
+
+1. Copy the following code and paste it in to the `loki-local-config.yaml` file. It should be added to the end of the `limits_config:` section typically found on line 55 after the addition of the code in the previous step.
+
+ ``` text
+ retention_period: 8760h
+ ```
+
+1. If a different retention period to the default of 12 months (8760 hours) is required, change the value ensuring that only the required retention is configured.
+1. Save the file.
+1. Restart the Grafana Loki Service:
+ 1. Open `services.msc`.
+ 1. Locate the `Loki` service.
+ 1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_1_0to4_2_1.OnPremise.Grafana.Prerequisites" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_1_0to4_2_1.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/_index.md
new file mode 100644
index 000000000..23289ecb1
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/_index.md
@@ -0,0 +1,6 @@
+---
+title: "4.2.1 to 5.0.0"
+linkTitle: "4.2.1 to 5.0.0"
+description: "Instructions to upgrade your observability platform for {{% ctx %}} from 4.2.1 to 5.0.0."
+weight: 960
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/_index.md
new file mode 100644
index 000000000..4eaa242d6
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Cloud"
+linkTitle: "Cloud"
+description: "Information about upgrading a cloud-hosted observability platform for {{% ctx %}}."
+weight: 500
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/_index.md
new file mode 100644
index 000000000..1337f8126
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading a cloud-hosted Grafana platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/prerequisites.md
new file mode 100644
index 000000000..335e8dd47
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/prerequisites.md
@@ -0,0 +1,34 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Grafana Alloy 1.15.1][] archive.
+ * [Grafana Dashboards][] archive.
+
+1. Extract the downloaded `alloy-installer-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Grafana.Dashboards` archive to a folder with the same name.
+
+## Backup Old Files
+
+On each Application Server that Grafana Alloy is installed on:
+
+1. Create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location where Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+1. Copy the `config.alloy` file and save it to the `Observability Backups` folder created at step 1.
+
+## Next Steps?
+
+1. [Upgrade Grafana Alloy][Upgrade Alloy]
+
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.UpgradeAlloy" >}}
+[Grafana Dashboards]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/try-it-out.md
new file mode 100644
index 000000000..d6e31c827
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/try-it-out.md
@@ -0,0 +1,62 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Grafana Alloy][Upgrade Alloy] has been completed before taking these steps.
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the folder name that the dashboards were imported to, if not already expanded.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the folder name that the dashboards were imported to, if not already expanded.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the folder name that the dashboards were imported to, if not already expanded.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.UpgradeAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-alloy.md
new file mode 100644
index 000000000..d6c05f568
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-alloy.md
@@ -0,0 +1,80 @@
+---
+title: "Upgrade Grafana Alloy"
+linkTitle: "Upgrade Grafana Alloy"
+description: "The steps to Upgrade Grafana Alloy."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade Grafana Alloy.
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Grafana Alloy service.
+{{% / alert %}}
+
+## Perform Upgrade
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the extracted alloy-installer-windows-amd64.exe folder created as part of [Make Artefacts Available][].
+1. Copy the `alloy-installer-windows-amd64.exe` into the location that Grafana Alloy was previously installed from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`, overwriting the existing file if prompted to do so.
+1. Execute the `alloy-installer-windows-amd64.exe` by double clicking on the file.
+1. Follow the install wizard accepting the defaults and wait for the installation to complete.
+1. Click `Close` to finish the installation.
+
+## Configure Grafana Alloy
+
+1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
+1. Locate the line containing `__path__` in the `loki.file_match "ApiGateway"` > `path_targets` section, which can be found near the beginning of the file.
+1. Change the `__path__` value so that the part containing the file name changes to `ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json`. Note there is a change to the `,` location.
+
+ The line should now look similar to `__path__ = "C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json",`
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `expressions` section but before the `}` typically found on line 139.
+
+ ``` text
+ FlowResult = "Event.Tags.Cortex.\"Execution.Result.Status\" || 'N/A'",
+ Method = "'Unknown'",
+ ```
+
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `values` section but before the `}` typically found on line 157 after the above change.
+
+ ``` text
+ FlowResult = null,
+ Method = null,
+ ```
+
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `loki.process "ExecutionService" {` section but before the `}` typically found on line 162 after the above change.
+
+ ``` text
+
+ stage.match {
+ selector = "{job=\"ExecutionService\"}|~ \"\\\"Method\\\":.?\\\"Cortex.FlowEngine.Execution.Engine.Run\\\"\""
+
+ stage.json {
+ expressions = {
+ Method = "'FlowExecution'",
+ }
+ }
+
+ stage.labels {
+ values = {
+ Method = null,
+ }
+ }
+ }
+ ```
+
+1. Save the file.
+
+### Restart the Service
+
+1. Open `services.msc`.
+1. Locate the `Alloy` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Upgrade Dashboards][]
+
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.MakeArtefactsAvailable" >}}
+[Upgrade Dashboards]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.UpgradeDashboards" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-dashboards.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-dashboards.md
new file mode 100644
index 000000000..5e3662a71
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/cloud/grafana/upgrade-dashboards.md
@@ -0,0 +1,52 @@
+---
+title: "Upgrade Dashboards"
+linkTitle: "Upgrade Dashboards"
+description: "Information about upgrading your Grafana dashboards."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the default dashboards that are provided for your observability platform.
+
+{{% alert title="Warning" color="warning" %}}
+A new *Flow Execution Details* Dashboard has been added to the default dashboards. This new dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
+## Import New Dashboard
+
+1. Log in to Grafana Cloud with a user that has the *Admin* role.
+1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+1. Click the Dashboards menu item.
+1. Click the *New* dropdown and select *Import*.
+1. Click on *Upload dashboard JSON file*.
+1. Locate the extracted `Flow Execution Details.json` file downloaded as part of [Make Artefacts Available][].
+1. Select the file and click *Open*.
+1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
+1. Select your configured Loki data source from the dropdown menu, e.g. *grafanacloud-cortex-logs*.
+1. Click *Import*.
+
+## Configure Data Sources
+
+It is necessary to update the Custom Filter inside the dashboards to use the correct data source.
+
+1. Log in to Grafana Cloud with a user that has the *Admin* role.
+1. To open a dashboard:
+ 1. Click the Menu icon {{< image src="/images/GrafanaMenuIcon.png" title="Menu icon" >}} to view the available options.
+ 1. Click the Dashboards menu item.
+ 1. Click the folder name that the dashboards were imported to.
+ 1. Click the *Flow Execution Details* dashboard to open it.
+1. Open the *Dashboard settings* menu via the cog icon in the top right-hand side of the dashboard.
+1. Click *Variables* from the top menu of the *Settings* page.
+1. Click *CustomFilter* in the *Variables* list.
+1. Select your Loki data source in the *Adhoc Options* > *Data source* drop-down menu, e.g. *grafanacloud-cortex-logs*.
+1. Click *Apply*.
+1. Click the dashboard name in the breadcrumb at the top left corner of the page to go back to the dashboard.
+1. Click the + icon next to the Custom Filter to confirm that a list of available filter options is visible. If Grafana Loki has not received any logs from Grafana Alloy there will be no options available for selection.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.MakeArtefactsAvailable" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.Cloud.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/_index.md
@@ -0,0 +1,6 @@
+---
+title: "On-Premise"
+linkTitle: "On-Premise"
+description: "Information about upgrading an on-premise observability platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Grafana"
+linkTitle: "Grafana"
+description: "Information about upgrading an on-premise Grafana platform for {{% ctx %}}."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/prerequisites.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..ec5d3653c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/prerequisites.md
@@ -0,0 +1,70 @@
+---
+title: "Prerequisites"
+linkTitle: "Prerequisites"
+description: "The prerequisites required before performing the observability upgrade."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Verify Old Version
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Make a note of the version number under the login prompt.
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Make a note of values returned in the Overview tiles, or alternatively take a screenshot of the dashboard, to use later to verify the upgrade.
+
+## Make Artefacts Available
+
+1. Download the required artefacts to a folder on your machine:
+
+ * [Grafana 13.0.1][] Standalone Windows Binaries (64 Bit) archive.
+ * [Grafana Alloy 1.15.1][] archive.
+ * [Grafana Loki 3.7.1][] archive.
+ * [Grafana Dashboards][] archive.
+
+1. Extract the downloaded `grafana-enterprise_13.0.1_24542347077_windows_amd64` archive:
+ 1. Open a Windows Powershell (x64) window as administrator.
+ 1. Navigate Powershell to inside the folder containing the `grafana-enterprise_13.0.1_24542347077_windows_amd64.tar.gz` archive using the following command modifying the path as necessary:
+
+ ``` Powershell
+ cd "C:\Install"
+ ```
+
+ 1. Execute the following command and wait for it to complete:
+
+ ``` Powershell
+ tar -xvzf grafana-enterprise_13.0.1_24542347077_windows_amd64.tar.gz
+ ```
+
+1. Extract the downloaded `alloy-installer-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `loki-windows-amd64.exe` archive to a folder with the same name.
+1. Extract the downloaded `Grafana.Dashboards` archive to a folder with the same name.
+
+## Backup Old Files
+
+1. On the server that Grafana and Loki is installed on, create a folder called `Observability Backups` in a known location.
+1. Open File Explorer and navigate to the location that Grafana was previously installed to, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana\conf`.
+1. Copy the `custom.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. Copy the `defaults.ini` file and save it to the `Observability Backups` folder created at step 1.
+1. In File Explorer, navigate to the location that Loki is running from, e.g. `C:\ProgramData\Cortex\Observability\Loki\`.
+1. Copy the `loki-local-config.yaml` file and save it to the `Observability Backups` folder created at step 1.
+1. On each Application Server that Grafana Alloy is installed on:
+
+ 1. Create a folder called `Observability Backups` in a known location.
+ 1. Open File Explorer and navigate to the location where Grafana Alloy is running from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`.
+ 1. Copy the `config.alloy` file and save it to the `Observability Backups` folder created at step 1.
+
+## Next Steps?
+
+1. [Upgrade Grafana][]
+
+[Grafana 13.0.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaWebApp.13_0_1.WindowsBinaries" >}}
+[Grafana Dashboards]: {{< url path="GitHub.Cortex.Observability.5_0_0.GrafanaDashboardsZip" >}}
+[Grafana Loki 3.7.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaLoki.3_7_1.GrafanaLokiInstallZip" >}}
+[Grafana Alloy 1.15.1]: {{< url path="Grafana.SelfManaged.Downloads.GrafanaAlloy.1_15_1.Windows" >}}
+[Upgrade Grafana]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/try-it-out.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..f6aef067f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/try-it-out.md
@@ -0,0 +1,76 @@
+---
+title: "Try it out"
+linkTitle: "Try it out"
+description: "Information about trying out the observability platform after upgrade."
+weight: 6
+---
+
+# {{% param title %}}
+
+This guide describes how to verify that the upgrade has been successful. Please ensure that [Upgrade Grafana Alloy][Upgrade Alloy] has been completed before taking these steps.
+
+## Confirm Grafana Upgrade
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`.
+1. Identify the version number under the login prompt.
+1. Confirm the version has updated to be 13.0.1.
+
+## Confirm Dashboards Load
+
+1. Navigate to your Grafana website e.g. `https://machinename.domain.com:3000`
+1. Login to Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Select the folder that hosts the Cortex Dashboards, e.g. *Cortex*
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. Change the time period to be *Last 90 days* and confirm data is present.
+1. Confirm the data from the previous step is similar to the data captured when [verifying the old version][].
+
+## Confirm New Data is Processed
+
+{{% alert title="Note" %}}
+This test uses the test flow published as part of testing the {{% ctx %}} installation. See {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.TryItOutPublishedFlowNew" title="Testing HA installation" >}} or {{< ahref path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.TryItOutPublishedFlowNew" title="Testing non-HA installation" >}}. An alternative flow can be used that exists on the system and can be executed.
+{{% / alert %}}
+
+1. Open an HTTP client, such as [Postman][]. Make a request with the following format:
+ | Property | Value |
+ |---------------|-------------------------------------------------------------------------------------|
+ | Action | POST |
+ | URL | For HA installation use: `https://{FQDN of Load Balancer Server}/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://load-balancer.domain.com/api/default/default/flows/NewFlow/executions?packageName=NewPackage`
For non-HA installation use: `https://{FQDN of server}:8722/api/default/default/flows/{Flow Name}/executions?packageName={Package Name}` e.g. `https://server.domain.com:8722/api/default/default/flows/NewFlow/executions?packageName=NewPackage`|
+ | Content Type | application/json |
+ | Body | {} |
+ | Authentication| Basic |
+ | Username | The value used for `ApiGatewayBasicAuthUsername` when installing Application Services. See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+ | Password | The value used for `ApiGatewayBasicAuthPassword` when installing Application Services (Unencrypted). See [HA Installation script configuration][] or [Non-HA Installation script configuration][] for the value specified.|
+
+ {{% alert title="Note" %}} If you used self-signed certificates when installing the Application Servers you may need to disable SSL certificate validation in your HTTP client. {{% /alert %}}
+
+1. Once the request has completed, in your web browser, navigate to and log in to your configured Grafana.
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Details* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+
+ {{% alert title="Note" %}}If Flow Logging has not been enabled then this dashboard will not display any data. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+ If other requests have been made then there may be more than one request visible on the dashboard.
+ {{% / alert %}}
+
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Flow Execution Requests* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+1. Open the *Dashboards* page via the menu on the left sidebar.
+1. Click the folder name that the dashboards were imported to.
+1. Click the *Platform Health* dashboard to open it.
+1. The request made at step 1 should be visible on the dashboard.
+{{% alert title="Note" %}}
+If other requests have been made then there may be more than one request visible on the dashboard.
+{{% / alert %}}
+
+[HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.ConfigureInstallationScriptNew" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeAlloy" >}}
+[Non-HA Installation script configuration]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.ConfigureInstallationScriptNew" >}}
+[Postman]: {{< url path="Postman.Downloads.MainDoc" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-alloy.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-alloy.md
new file mode 100644
index 000000000..047c7291e
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-alloy.md
@@ -0,0 +1,83 @@
+---
+title: "Upgrade Grafana Alloy"
+linkTitle: "Upgrade Grafana Alloy"
+description: "The steps to upgrade Grafana Alloy."
+weight: 4
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade Grafana Alloy. Please ensure that the [Loki Upgrade][] has been completed before starting this upgrade.
+
+{{% alert title="Note" %}}
+These steps will need to be performed on all application servers that host a Grafana Alloy service.
+{{% / alert %}}
+
+## Perform Upgrade
+
+1. Log in to the application server.
+1. Open a File Explorer and navigate to the extracted alloy-installer-windows-amd64.exe folder created as part of [Make Artefacts Available][].
+1. Copy the `alloy-installer-windows-amd64.exe` into the location that Grafana Alloy was previously installed from, e.g. `C:\ProgramData\Cortex\Observability\Grafana Alloy`, overwriting the existing file if prompted to do so.
+1. Execute the `alloy-installer-windows-amd64.exe` by double clicking on the file.
+1. Follow the install wizard accepting the defaults and wait for the installation to complete.
+1. Click `Close` to finish the installation.
+
+## Configure Grafana Alloy
+
+### Update Configuration
+
+1. Open the `config.alloy` configuration file, which is located in the folder alongside the `alloy-installer-windows-amd64.exe` file.
+1. Locate the line containing `__path__` in the `loki.file_match "ApiGateway"` > `path_targets` section, which can be found near the beginning of the file.
+1. Change the `__path__` value so that the part containing the file name changes to `ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json`. Note there is a change to the `,` location.
+
+ The line should now look similar to `__path__ = "C:/ProgramData/Cortex/API Gateway Service/Logs/**/ServiceFabricHttpEventLog-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{,_[0-9][0-9][0-9]}.json",`
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `expressions` section but before the `}` typically found on line 139.
+
+ ``` text
+ FlowResult = "Event.Tags.Cortex.\"Execution.Result.Status\" || 'N/A'",
+ Method = "'Unknown'",
+ ```
+
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `values` section but before the `}` typically found on line 157 after the above change.
+
+ ``` text
+ FlowResult = null,
+ Method = null,
+ ```
+
+1. Copy the following code and paste it in to the `config.alloy` file. It should be added to the end of the `loki.process "ExecutionService" {` section but before the `}` typically found on line 162 after the above change.
+
+ ``` text
+
+ stage.match {
+ selector = "{job=\"ExecutionService\"}|~ \"\\\"Method\\\":.?\\\"Cortex.FlowEngine.Execution.Engine.Run\\\"\""
+
+ stage.json {
+ expressions = {
+ Method = "'FlowExecution'",
+ }
+ }
+
+ stage.labels {
+ values = {
+ Method = null,
+ }
+ }
+ }
+ ```
+
+1. Save the file.
+
+### Restart the Service
+
+1. Open `services.msc`.
+1. Locate the `Alloy` service.
+1. Right click on the service name and select `Restart`. If the service is not already running, select `Start`.
+
+## Next Steps?
+
+1. [Upgrade Dashboards][]
+
+[Loki Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeLoki" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Upgrade Dashboards]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeDashboards" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-dashboards.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-dashboards.md
new file mode 100644
index 000000000..cd3302e00
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-dashboards.md
@@ -0,0 +1,51 @@
+---
+title: "Upgrade Dashboards"
+linkTitle: "Upgrade Dashboards"
+description: "Information about upgrading your Grafana dashboards."
+weight: 5
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the default dashboards that are provided for your observability platform.
+
+{{% alert title="Warning" color="warning" %}}
+A new *Flow Execution Details* Dashboard has been added to the default dashboards. This new dashboard will only work if `Flow Logging` is enabled on your platform. See {{< ahref path="Cortex.Faqs.ChangeLoggingLevels.FlowLogging.MainDoc" title="Change Flow Logging Level" >}} for instructions on how to do this.
+{{% / alert %}}
+
+## Import New Dashboard
+
+1. Log in to your configured Grafana with a user that has the *Admin* role.
+1. Go to *Dashboards* via the menu on the left sidebar.
+1. Click the *New* button and select *Import* from the drop-down menu.
+1. Click the *Upload JSON file* button.
+1. Locate the extracted `Flow Execution Details.json` file downloaded as part of [Make Artefacts Available][].
+1. Select the file and click *Open*.
+1. Select the folder in Grafana you wish the dashboard to be saved in, e.g. *Cortex*.
+1. Select your configured Loki data source from the dropdown menu.
+1. Click *Import*.
+
+## Configure Data Sources
+
+It is necessary to update the Custom Filter inside the new dashboard to use the correct data source.
+
+1. Log in to your configured Grafana with a user that has the *Admin* role.
+1. To open a dashboard:
+ 1. Go to *Dashboards* via the menu on the left sidebar.
+ 1. Click the folder name that the dashboards were imported to.
+ 1. Click the *Flow Execution Details* dashboard to open it.
+1. Open the *Dashboard settings* panel via the cog icon on the right-hand side of the dashboard.
+1. Open the *Settings Menu* by selecting the Settings button on the top right of the opened panel.
+1. Click *Variables* from the top menu of the *Settings* page.
+1. Click *CustomFilter* at the bottom of the *Variables* list.
+1. Select your configured Loki data source in the *Filter options* > *Data source* drop-down menu.
+1. Click *Save* at the top right of the window.
+1. Click the dashboard name in the breadcrumb at the top left corner of the page to go back to the dashboard.
+1. Click in the Custom Filter text box to confirm that a list of available filter options is visible.
+
+## Next Steps?
+
+1. [Try it out][]
+
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-grafana.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-grafana.md
new file mode 100644
index 000000000..15d810e8d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-grafana.md
@@ -0,0 +1,28 @@
+---
+title: "Upgrade Grafana"
+linkTitle: "Upgrade Grafana"
+description: "The steps to upgrade Grafana."
+weight: 2
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Grafana installation. Please ensure that the [Prerequisites] for upgrading Observability have been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Grafana website.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and stop it by right-clicking on the service and selecting *Stop*.
+1. In File Explorer, navigate to the `grafana-13.0.1` folder created as part of [Make Artefacts Available][].
+1. Copy the contents of this folder into the Grafana install location, typically `%SystemDrive%\Program Files\GrafanaLabs\grafana`, and click `Replace the files in the destination` when prompted.
+1. Open Services.msc from the Start menu.
+1. Locate the *Grafana* service and start it by right-clicking on the service and selecting *Start*.
+
+## Next Steps?
+
+1. [Upgrade Loki][]
+
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.Prerequisites" >}}
+[Upgrade Loki]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeLoki" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-loki.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-loki.md
new file mode 100644
index 000000000..86a0f392c
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/4.2.1-to-5.0.0/on-premise/grafana/upgrade-loki.md
@@ -0,0 +1,56 @@
+---
+title: "Upgrade Loki"
+linkTitle: "Upgrade Loki"
+description: "The steps to upgrade Loki."
+weight: 3
+---
+
+# {{% param title %}}
+
+This guide describes how to upgrade the Loki installation. Please ensure that the [Grafana Upgrade] has been completed before starting this upgrade.
+
+## Perform Upgrade
+
+1. Log in to the server hosting your Loki service.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where Loki is running from, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Remove the current Loki installation by executing the following command:
+
+ ``` powershell
+ .\Remove-Loki.ps1
+ ```
+
+1. Click *Yes* when prompted for confirmation that you wish to remove the service.
+1. Click *OK* when the successful removal of the Loki service is confirmed.
+1. Open a File Explorer and navigate to the folder where Loki was running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Delete the following file from the directory:
+
+ * loki-windows-amd64.exe
+
+1. In File Explorer, navigate to the extracted `loki-windows-amd64.exe` folder created as part of [Make Artefacts Available][].
+1. Copy the `loki-windows-amd64.exe` file into the folder that Loki was previously running from, e.g. `C:\ProgramData\Cortex\Observability\Loki`.
+1. Run Windows PowerShell as Administrator.
+1. Change the directory to the folder where the Loki file has been copied to, e.g. `cd C:\ProgramData\Cortex\Observability\Loki`.
+1. Install Loki by executing the following command:
+
+ ``` powershell
+ .\Install-Loki.ps1
+ ```
+
+1. Start the Loki service by executing the following command:
+
+ ``` powershell
+ .\Start-Loki.ps1
+ ```
+
+1. Check that the Loki service has installed and started correctly:
+ * Open Services.msc from the Start menu.
+ * Locate the *Loki* service and confirm that it is *Running*.
+
+## Next Steps?
+
+1. [Upgrade Grafana Alloy][Upgrade Alloy]
+
+[Grafana Upgrade]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeGrafana" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Upgrade Alloy]: {{< url path="Cortex.Guides.UpgradeGuides.UpgradeObservability.4_2_1to5_0_0.OnPremise.Grafana.UpgradeAlloy" >}}
diff --git a/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/_index.md b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/_index.md
new file mode 100644
index 000000000..7e5a6ec25
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/upgrade-guides/upgrade-observability/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Upgrade Observability"
+linkTitle: "Upgrade Observability"
+description: "Guides to upgrade your observability platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Guides/user-guides/_index.md b/content/en/docs/2026.3/Guides/user-guides/_index.md
new file mode 100644
index 000000000..1b1968cf4
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/_index.md
@@ -0,0 +1,6 @@
+---
+title: "User Guides"
+linkTitle: "User Guides"
+description: "This section includes user guides for the {{% ctx %}} platform."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/_index.md
new file mode 100644
index 000000000..ede6dfbf2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/_index.md
@@ -0,0 +1,6 @@
+---
+title: "User Interfaces"
+linkTitle: "User Interfaces"
+description: "This section includes user guides related to the {{% ctx %}} User Interfaces."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/cortex-interaction-portal/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/cortex-interaction-portal/_index.md
new file mode 100644
index 000000000..e4a03ca00
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/cortex-interaction-portal/_index.md
@@ -0,0 +1,10 @@
+---
+title: "Interaction Portal"
+linkTitle: "Interaction Portal"
+description: "A web application that provides Human-in-the-Loop capabilities to the {{% ctx %}} platform."
+weight: 400
+---
+
+* {{< filelink src="/pdf/CORTEX Interaction Portal - User Guide.pdf" name="CORTEX Interaction Portal User Guide" >}}
+* {{< filelink src="/pdf/CORTEX Interaction Portal - Developer Guide.pdf" name="CORTEX Interaction Portal Developer Guide" >}}
+* {{< filelink src="/pdf/CORTEX Interaction Portal - Merging Guide.pdf" name="CORTEX Interaction Portal Merging Guide" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authentication.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authentication.md
new file mode 100644
index 000000000..ba045dcec
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authentication.md
@@ -0,0 +1,101 @@
+---
+title: "Authentication"
+linkTitle: "Authentication"
+description: "Setup authentication providers used to control access to {{% ctx %}} Gateway."
+weight: 20
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Authentication page is used to setup one or more authentication providers used to control access to {{% ctx %}} Gateway.
+
+## Anatomy
+
+Authentication can be configured using [LDAP][] against a Microsoft Active Directory, and [OpenID Connect (OIDC)][OIDC] with one or more providers.
+
+### LDAP
+
+{{< figure src="/images/Authentication - LDAP.png" title="LDAP Authentication Configuration" >}}
+
+LDAP authentication defines the connection to a Microsoft Active Directory server to authorise Active Directory users with different roles and permissions within {{% ctx %}} Gateway.
+
+It requires connection details to the Active Directory server (URL or domain), port and protocol, plus the credentials of an Active Directory account (typically a service account) that can read the Active Directory.
+
+For additional security, and to avoid the clutter of irrelevant information, it is possible to filter the Active Directory information available for use in {{% ctx %}} Gateway to that defined by a set of [Base DNs (Distinguished Names)][DNs].
+
+{{% ctx %}} Roles and Flow Editor permissions can be assigned to groups set up in Active Directory.
+
+The fields available are:
+
+* `Server` – specifies either URL or IPv4 address of the Active Directory server, or the domain name for the Active Directory domain.
+* `Port` – specifies the port used to access Active Directory, typically either 389 for LDAP or 636 for LDAPS.
+* `Use SSL` – a checkbox to connect via the LDAPS protocol rather than LDAP.
+* `Username` – the username of an account with read permissions in Active Directory; typically a service account is used.
+* `Password` – the password associated with the username entered in the `Username` field.
+* `Base DNs` – the Active Directory objects that can be accessed by {{% ctx %}} Gateway. The identity of the objects is expressed using their Distinguished Names. More than one Distinguished Name can be set to refer to multiple objects within the Active Directory. If no Distinguished Names are set, the whole of the Active Directory is accessible.
+
+### OpenID Connect
+
+{{< figure src="/images/Authentication - OIDC.png" title="Open ID Connect Provider Configuration" >}}
+
+OpenID Connect provides connections to third-party authentication services to authenticate users in {{% ctx %}} Gateway, using Multi-Factor Authentication (MFA) if the provider supports it.
+
+The OpenID Connect tab currently only supports the Microsoft Entra provider but allows for one or more instances to be configured.
+
+{{% ctx %}} Roles and Flow Editor permissions can be assigned to groups set up in Microsoft Entra.
+
+The fields available are:
+
+* `Provider Type` – the OIDC provider type. Currently, only Microsoft is the OIDC provider supported.
+* `Identifier` – free-format, friendly unique name for this provider.
+* `Display Name` – the text displayed in the {{% ctx %}} Gateway sign-in button.
+* `Authority` – the URL to send authentication requests to.
+* `Tenant Identifier` – the Microsoft Entra Tenant ID for the organisation managing authentication.
+* `Client Identifier` – the unique identifier to identify the {{% ctx %}} Gateway application to the authentication provider.
+* `Client Secret` – the client secret that validates the {{% ctx %}} Gateway application with the authentication provider.
+
+## Actions
+
+### Configure LDAP Authentication
+
+LDAP Authentication can be configured by selecting the `LDAP` tab and entering the connection information. Once the details have been entered it is necessary to test the connection before being able to save them.
+
+See the [Configure LDAP Authentication][Configure LDAP Authentication tutorial] tutorial for a step-by-step guide.
+
+### Add New OpenID Connect Authentication Provider
+
+To configure {{% ctx %}} Gateway to use OpenID Connect Authentication, the application must be registered and configured with the provider. For assistance with configuring this see [FAQs][configure OIDC provider].
+
+An Open ID Connect provider can be added to the authentication providers by selecting the `OpenID Connect` tab, then selecting the `+ New Provider` option and entering the connection information. Once the details have been entered it is necessary to validate the connection before being able to save them.
+
+See the [Add New OpenID Connect Authentication Provider][Add New OpenID Connect Authentication Provider tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Currently, only Microsoft Entra OIDC is supported.
+* OpenID Connect only validates the format of the data entered in the OIDC form; it does not validate that a connection to the provider can be established.
+* OpenID Connect does not currently offer any filtering of the groups imported into {{% ctx %}} Gateway.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Configure LDAP Authentication][Configure LDAP Authentication tutorial]
+* [Add New OpenID Connect Authentication Provider][Add New OpenID Connect Authentication Provider tutorial]
+
+[OIDC]: {{< ref "#openid-connect" >}}
+[LDAP]: {{< ref "#ldap" >}}
+
+[Add New OpenID Connect Authentication Provider tutorial]: {{< url path="Cortex.Tutorials.Administration.Authentication.OpenID" >}}
+[Configure LDAP Authentication tutorial]: {{< url path="Cortex.Tutorials.Administration.Authentication.LDAP" >}}
+
+[configure OIDC provider]: {{< url path="Cortex.Faqs.ConfigureOidcAuthentication.MainDoc" >}}
+[DNs]: {{< url path="MSDocs.Windows.Ldap.DNs" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authorisation.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authorisation.md
new file mode 100644
index 000000000..8827b09a2
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/Authorisation.md
@@ -0,0 +1,63 @@
+---
+title: "Authorisation"
+linkTitle: "Authorisation"
+description: "Configure roles used to control access to functionality in {{% ctx %}} Gateway."
+weight: 30
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Authorisation page is used to assign roles within {{% ctx %}} Gateway based on the membership of Active Directory Security Groups ([LDAP Authentication][]) and Microsoft Entra Groups ([OIDC Authentication][]).
+
+## Anatomy
+
+{{< figure src="/images/Authorisation.png" title="Authorisation" >}}
+
+The Authorisation grid allows roles to be assigned to groups:
+
+* `Name` shows:
+ * For [LDAP Authentication][], the Active Directory domain, organisational units, containers and Security Groups in a hierarchical tree; these groups are limited to those defined by the Base DNs configured.
+ * For [OIDC Authentication][], the Provider's display name and groups in a hierarchical tree.
+
+* `Type` identifies the type of object for that row.
+* `Admin` and `Studio` are roles that can be assigned and contain checkboxes to indicate which object has access to which role.
+
+ * Admin – provides access to administrative functions within {{% ctx %}} Gateway, including the ability to set user roles and permissions, import and export flows, creation and management of packages, etc.
+ * Studio – provides access to set the permissions to view and/or edit any flow in the Flow Editor.
+
+ Both the `Admin` and `Studio` roles may be assigned to a single group or groups of groups, to provide access to both the administrative functions in {{% ctx %}} Gateway and flows in the Flow Editor.
+
+ Note: The `LiveView` and `Reporting` roles do not apply to {{% ctx %}}.
+
+## Actions
+
+### Assign {{% ctx %}} Roles to Security Groups
+
+If an individual Group object is checked ({{< image src="/images/Authorisation - Individual Object Checked.png" >}}), then its parent objects will also be implicitly set ({{< image src="/images/Authorisation - Parent Object Implicit.png" >}}). If a parent object is checked ({{< image src="/images/Authorisation - Parent Object Explicit.png" >}}), all its child objects will be implicitly set ({{< image src="/images/Authorisation - Child Object Implicit.png" >}}). Objects may be individually unset by clicking the checked checkbox.
+
+When all the role assignments have been completed, click the Save Changes button to commit the current role assignments.
+
+See the [Assign {{% ctx %}} Roles to Security Groups][Assign {{% ctx %}} Roles to Security Groups tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* The key shown at the bottom of the page to convey the role assignment state is incorrect.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Assign {{% ctx %}} Roles to Security Groups][Assign {{% ctx %}} Roles to Security Groups tutorial]
+
+[Assign {{% ctx %}} Roles to Security Groups tutorial]: {{< url path="Cortex.Tutorials.Administration.Authorisation.AssignRoles" >}}
+
+[LDAP Authentication]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Authentication.LdapAuth" >}}
+[OIDC Authentication]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Authentication.OidcAuth" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/_index.md
new file mode 100644
index 000000000..ad779c834
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Admin"
+linkTitle: "Admin"
+description: "This section includes user guides related to the Admin section in {{% ctx %}} Gateway."
+weight: 30
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/license-consumption.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/license-consumption.md
new file mode 100644
index 000000000..8d4c6a924
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/license-consumption.md
@@ -0,0 +1,63 @@
+---
+title: "License Consumption"
+linkTitle: "License Consumption"
+description: "View the license consumption in {{% ctx %}} Gateway."
+weight: 80
+---
+
+# {{% param title %}}
+
+## Summary
+
+The License Consumption page is used to view the license consumption for the current platform and the minimum license requirement to support the current usage.
+
+## Anatomy
+
+{{< figure src="/images/License Consumption.png" title="License Consumption" >}}
+
+## Actions
+
+### View License Consumption
+
+Every functional block connected to a Start Flow block adds one to the license consumption, except for the following blocks, which do not impact the license consumption:
+
+* [Start Flow][]
+* [End Flow][]
+* [Start Workspace][]
+* [End Workspace][]
+* [Wireless Receiver][]
+* [Wireless Sender][]
+* [Workspace][]
+* [Handle Flow Exception Workspace][]
+
+The License Consumption details are shown in a tabular format, where each flow’s license consumption is aggregated and shown as a total against its parent group. Groups may be expanded to show the license consumption of each individual flow.
+
+The `Breakdown` switch expands the table to additionally show the flow usage and the number of functional blocks used in each flow. In {{% ctx %}} all flows will have a count of 1 in the `Usage` column.
+
+See the [Check License Consumption][Check License Consumption tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Check License Consumption][Check License Consumption tutorial]
+
+[Check License Consumption tutorial]: {{< url path="Cortex.Tutorials.Administration.LicenseConsumption.CheckLicenseConsumption" >}}
+[End Flow]: {{< url path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" >}}
+[End Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.EndWorkspace.EndWorkspace.MainDoc" >}}
+[Handle Flow Exception Workspace]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Start Flow]: {{< url path="Cortex.Reference.Blocks.Flows.StartFlow.StartFlow.MainDoc" >}}
+[Start Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.StartWorkspace.StartWorkspace.MainDoc" >}}
+[Wireless Receiver]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessReceiver.WirelessReceiver.MainDoc" >}}
+[Wireless Sender]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessSender.WirelessSender.MainDoc" >}}
+[Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/_index.md
new file mode 100644
index 000000000..0e01d59ad
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Packages"
+linkTitle: "Packages"
+description: "Create and manage packages in {{% ctx %}} Gateway."
+weight: 100
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/overview.md
new file mode 100644
index 000000000..5ac921395
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/overview.md
@@ -0,0 +1,64 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Summary and anatomy of Package Management"
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Package Management page allows you to manage [{{% ctx %}} packages][What is a Package?], including creating and publishing them.
+
+| | |
+|------------------------------|-----------------------------------------------------------------|
+| **Roles Required:** | Admin |
+
+## Anatomy
+
+{{< figure src="/images/Package Management.png" title="Package Management" >}}
+
+The Package Management page displays a list of existing {{% ctx %}} Package definitions in the [Package Definitions Grid][], showing the most recently created version of each package; older versions can be viewed by expanding the package definition.
+
+Selecting a package version will display it in the [Package Version Editor][]; the Definition tab will be selected, displaying the flows it contains and buttons to:
+
+* [Export][] the selected package version to a {{% ctx %}} Package file.
+* [Create New Version][] of the package based on the selected package version.
+* [Publish][] or [Unpublish][] the package version to the {{% ctx %}} Execution Services.
+* [Set As Default Package][] enabling flows to be executed from all versions of this package without specifying the package name in the execution REST Request.
+* [Set As Default Version][] enabling flows to be executed from the package version without specifying the package version in the execution REST Request.
+
+The [Package Version Editor][] contains the following tabs:
+
+* [Definition][] - displays the flows contained in this package version.
+* [Authorisation][] - allows the selection of LDAP groups authorised to execute flows contained in this package version.
+* [Schedules][] – allows configuration of schedules to automatically execute flows contained in this package version at defined times or intervals.
+* [Triggers][] - allows configuration of SNMP triggers to automatically execute flows contained in this package version on receipt of SNMP traps.
+* [Running Executions][] - displays a list of running executions of flows in this package version and enables the user to abort them.
+
+## See Also
+
+### Related Concepts
+
+* [What is a Package?][]
+
+### Related Tutorials
+
+* [Package Management][]
+
+[Authorisation]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Authorisation" >}}
+[Create New Version]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.CreateNewVersion" >}}
+[Definition]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Definition" >}}
+[Export]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Export" >}}
+[Package Definitions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.MainDoc" >}}
+[Package Management]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.MainDoc" >}}
+[Package Version Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.MainDoc" >}}
+[Publish]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Publish" >}}
+[Running Executions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.RunningExecutions" >}}
+[Schedules]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Schedules" >}}
+[Set As Default Package]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.SetDefaultPackage" >}}
+[Set As Default Version]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.SetDefaultVersion" >}}
+[Triggers]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Triggers" >}}
+[Unpublish]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Unpublish" >}}
+[What is a Package?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Packages.WhatIsAPackage.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-definitions-grid.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-definitions-grid.md
new file mode 100644
index 000000000..fb6c19e48
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-definitions-grid.md
@@ -0,0 +1,74 @@
+---
+title: "Package Definitions Grid"
+linkTitle: "Package Definitions Grid"
+description: "Summary and anatomy of the Package Definitions Grid"
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Package Definitions Grid displays a list of existing [{{% ctx %}} Package][What is a Package?] definitions.
+
+## Anatomy
+
+{{< figure src="/images/Package Definitions Grid.png" title="Package Definitions Grid" >}}
+
+The Package Definitions Grid shows the most recently created version of each package; older versions can be viewed by expanding the package definition. Selecting a package version will display it's details in the [Package Version Editor][].
+
+The Package Definitions Grid also contains buttons to:
+
+* [Create a Package][]
+* [Import a Package][]
+
+## Actions
+
+### Create a Package
+
+A new package is created by clicking the `Add Package Definition` button, supplying a Package Name and selecting the flows to be included in the package.
+
+The Package Name must be unique and can only contain alphanumeric characters, hyphens and underscores. The flows added to the package definition are the Master Versions of the flows contained in the Master Repository (most recently committed flow version).
+
+If a selected flow has dependent flows, the dependent flow will be automatically selected for inclusion in the package; dependent flows cannot be manually deselected for inclusion; this ensures packages contain all required dependencies.
+
+The package may optionally [define LDAP groups][Authorisation] that can execute flows, [schedules][] to run flows at specific times, and [triggers][] to run flows on receipt of specific SNMP Traps.
+
+See the [Create a Package][Create a Package tutorial] tutorial for a step-by-step guide.
+
+### Import a Package
+
+A {{% ctx %}} Package file, with the extension of `.ctxpkg`, may be imported into any {{% ctx %}} Gateway by clicking the `Import` button and selecting the `.ctxpkg` file to import.
+
+If the imported package already exists in {{% ctx %}} Gateway, a new version of that package will be created; if the imported package does not exist, a new package will be created.
+
+All the flows contained in the package will be saved in the Master Repository of the destination {{% ctx %}} Gateway as the master versions of those flows; if the imported flows already existed, the imported flows would become the new master versions.
+
+See the [Import a Package][Import a Package tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Flow versions other than the master versions stored in the Master Repository cannot be included in a new package.
+
+## See Also
+
+### Related Concepts
+
+* [What is a Package?][]
+
+### Related Tutorials
+
+* [Create a Package][Create a Package tutorial]
+* [Import a Package][Import a Package tutorial]
+
+[Create a Package]: {{< ref "#create-a-package" >}}
+[Create a Package tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.CreatePackage" >}}
+[Authorisation]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Authorisation" >}}
+[Import a Package]: {{< ref "#import-a-package" >}}
+[Import a Package tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.ImportPackage" >}}
+[Package Version Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.MainDoc" >}}
+[schedules]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Schedules" >}}
+[triggers]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Triggers" >}}
+[What is a Package?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Packages.WhatIsAPackage.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-version-editor.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-version-editor.md
new file mode 100644
index 000000000..e4eca2a69
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/packages/package-version-editor.md
@@ -0,0 +1,275 @@
+---
+title: "Package Version Editor"
+linkTitle: "Package Version Editor"
+description: "Summary and anatomy of the Package Version Editor"
+weight: 30
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Package Version Editor displays details of the selected package version and allows management of it.
+
+## Anatomy
+
+{{< figure src="/images/Package Version Editor.png" title="Package Version Editor" >}}
+
+Selecting a package version in the [Package Definitions Grid][] will display it's details in the Package Version Editor; the [Definition][] tab will be selected, displaying the flows it contains and buttons to:
+
+* [Create New Version][] of the package based on the selected package version.
+* [Publish][] or [Unpublish][] the package version to the {{% ctx %}} Execution Services.
+* [Set As Default Package][] enabling flows to be executed from all versions of this package without specifying the package name in the execution REST Request.
+* [Set As Default Version][] enabling flows to be executed from the package version without specifying the package version in the execution REST Request.
+* [Export][] the selected package version to a {{% ctx %}} Package file.
+
+{{% alert title="Note" %}}
+Some buttons are not visible until the package version has been initially published.
+{{% /alert %}}
+
+The Package Version Editor contains the following tabs:
+
+* [Definition][] - displays the name, version and flows contained in this package version.
+* [Authorisation][] - allows the selection of LDAP groups authorised to execute flows contained in this package version.
+* [Schedules][] – allows configuration of schedules to automatically execute flows contained in this package version at defined times or intervals.
+* [Triggers][] - allows configuration of SNMP triggers to automatically execute flows contained in this package version on receipt of SNMP traps.
+* [Running Executions][] - displays a list of running executions of flows in this package version and enables the user to abort them.
+
+### Definition
+
+Displays the flows contained in this package version and the actions that can be performed on it.
+
+#### Create a New Package Version
+
+A new package version can be created from any existing package version. Creating a new version allows additional flows to be added and existing flows to be removed; in addition existing flows may be individually updated to their current Master Version contained in the Master Repository or kept at their original version.
+
+The created package version may optionally define [schedules][Schedules] to execute flows at specific times, [triggers][Triggers] to execute flows on receipt of SNMP traps, and the selection of LDAP Groups [authorised][Authorisation] to execute flows contained in this package version.
+
+The new package version does not retain any of the configured schedules or triggers set on the source version. This is a known limitation and should be addressed in a future release.
+
+See the [Create a New Package Version][Create a New Package Version tutorial] tutorial for a step-by-step guide.
+
+#### Publish a Package Version
+
+When a package version is published it is made available to the {{% ctx %}} Execution Services. The first execution of a flow on a node will cause the flow to be compiled, cached and executed on that node.
+
+Published {{% ctx %}} Package Versions may be explicitly set as the Default Version for that {{% ctx %}} Package, meaning that a REST Request to execute a flow from that published {{% ctx %}} Package Version does not have to specify the Package Version.
+
+See the [Publish a Package Version][Publish a Package Version tutorial] tutorial for a step-by-step guide.
+
+#### Set As Default Package
+
+The default package specifies which package will be used to execute flows if the execution REST Request omits the Package Name to specify the package to use. There is only one default package for each {{% ctx %}} platform.
+
+Any package that has a [published][Publish] package version can be set as the default package. If all the package versions associated with the default package are [unpublished][Unpublish], the default package remains unchanged.
+
+See the [Set the Default Package][Set the Default Package tutorial] tutorial for a step-by-step guide.
+
+#### Set As Default Version
+
+The default version specifies which package version will be used to execute flows if the execution REST Request omits the Package Version to specify the package version to use. Every package will have a default version set, either implicitly or explicitly.
+
+By default, the most recently [published][Publish] package version will be implicitly set as the default version. If the implicitly set default version of a package is [unpublished][Unpublish], the next most recently published version of that package will be implicitly set as the default version.
+
+Any published package version may be explicitly set as the default version. An explicitly set default version will remain the default version regardless of other package versions that are published or unpublished.
+
+If a package version that has been set as the default version is unpublished, no other published package version associated with that package will be implicitly set as the default version. In this instance, there will be no default package version available for that package.
+
+If an unpublished package version that was previously set as the default version is published again, it will automatically become the explicitly set default version.
+
+If all the versions of a package are unpublished and then a package version is republished, it will become implicitly set as the default version, even if it was explicitly set as the default version before unpublishing.
+
+See the [Set the Default Package Version][Set the Default Package Version tutorial] tutorial for a step-by-step guide.
+
+#### Unpublish a Package Version
+
+When a package version is unpublished, it is removed from the {{% ctx %}} Execution Services and flow executions cannot be started for any flows in that package; however, any currently [running executions][Running Executions] from that package version will continue to completion. When all instances of an executing flow in an unpublished package have completed, the cache of the compiled flow is discarded.
+
+See the [Unpublish a Package Version][Unpublish a Package Version tutorial] tutorial for a step-by-step guide.
+
+#### Export a Package Version
+
+Any package version can be exported to a file, which can be used for [importing][Import] the package to another {{% ctx %}} Gateway or for archiving purposes. The export file is automatically downloaded from the browser and has the file name of `.ctxpkg`.
+
+The exported file contains the definition of the package version, including the flows contained in the package. Any [schedules][Schedules], [triggers][Triggers] or [authorisation][Authorisation] set on the package version are not included in the exported file. This is a known limitation and should be addressed in a future release.
+
+See the [Export a Package Version][Export a Package Version tutorial] tutorial for a step-by-step guide.
+
+### Authorisation
+
+The Authorisation tab on a package version defines which LDAP groups can execute flows contained in that package version, using Token-based OAuth2 authorisation.
+
+The list of Active Directory objects displayed to define flow execution authorisation is retrieved from the Active Directory server configured in LDAP Connection for {{% ctx %}} Gateway and is filtered by the same base DNs. In a future release we may allow for a different LDAP connection to be used to define flow execution authorisation.
+
+See the [Set Authorisation on a Package Version][Set Authorisation on a Package Version tutorial] tutorial for a step-by-step guide.
+
+### Schedules
+
+A schedule allows flow executions to occur at defined times, passing values to the flow’s [input variables][Input Variables]. Multiple schedules can be configured; a schedule can execute a single flow and a flow can be executed by mutiple schedules.
+
+Each schedule definition consists of a `Name`, which is used to easily identify the schedule, and an optional `Description` to provide additional information. The defintion also specifies the `Flow` to be executed, the `Type` of schedule (currently only CRON is available) and the schedule, expressed as a `CRON Expression`, to initiate the flow execution. The CRON expression entered will also be displayed in a human readable format.
+
+Any data to be passed to the flow’s [input variables][Input Variables] is entered using [expression editors][Expression Editor].
+
+Creating a [new package version][Create New Version] will not inherit the schedule configuration from the source version. Similarly, exporting a package version will not include the schedule configuration in the {{% ctx %}} Package file. These are known limitations and should be addressed in a future release.
+
+See the [Create a Schedule on a Package Version][Create a Schedule on a Package Version tutorial] tutorial for a step-by-step guide.
+
+### Triggers
+
+A trigger allows flow executions to occur on receipt of an SNMP Trap, passing values to the flow’s [input variables][Input Variables], and if required, the SNMP Trap PDU can be stored in a selected input variable as an object. Multiple triggers can be configured; a trigger can execute a single flow, and a flow can be executed by multiple triggers.
+
+Each trigger definition consists of a `Name`, which is used to easily identify the trigger, and an optional `Description` to provide additional information. The definition also specifies the `Flow` to be executed as well as a set of conditions that, on receipt of a matching SNMP Trap, will execute the flow.
+
+The conditions must be set are:
+
+* The `Device Address` of the device sending the SNMP Trap.
+
+ This can be a single IPv4 address, a list of comma-separated IPv4 addresses, a range of IPv4 addresses, CIDR subnets, or the * symbol to represent any address.
+* The `Device Port` of the device sending the SNMP Trap.
+
+ This can be a single port, a list of comma-separated ports, a range of ports, or the * symbol to represent any port.
+* The `Trap OID`.
+
+ This can be a single OID, a list of comma-separated OIDs, a range of OIDs, or the * symbol to represent any OID.
+
+* The `SNMP Version`; either: *SNMPv1*, *SNMPv2c*, or *SNMPv3*.
+ * If *SNMPv1* is selected, a `Community` and `Agent Address` must be configured.
+ * `Community` can be any value, a list of comma-separated values, or the * symbol to represent any community.
+ * `Agent Address` matches with the device address contained in the SNMP PDU, and can be a single IPv4 address, a list of comma-separated IPv4 addresses, a range of IPv4 addresses, CIDR subnets, or the * symbol to represent any address.
+ * If *SNMPv2c* is selected, a `Community` must be configured.
+ * `Community` can be any value, a list of comma-separated values, or the * symbol to represent any community.
+ * If *SNMPv3* is selected, it is necessary to setup one or more authentication users from the `Configure SNMPv3 Users` hyperlink, above the list of existing SNMP Triggers.
+
+Any data to be passed to the flow’s [input variables][Input Variables] is entered using [expression editors][Expression Editor], except for the SNMP Trap PDU which, if required, is dynamically passed to a selected input variable, overwriting any static or default values configured for that variable.
+
+Data from the SNMP Trap PDU is stored in the {{% ctx %}} Trap Variable, specified in the `Trap Variable` dropdown; the data stored has a similar structure for all three SNMP versions.
+
+The SNMP Trap PDU contains data expressed as OIDs. These OIDs can be translated into a human readable text strings by adding MIB files to the relevant directory.
+
+The MIB files used are specified in the MibFilePaths list, and the MIB Modules that they contain will be shown in the MibModuleName parameter list.
+
+All OIDs in the Trap data that can be decoded by these MIBs will be translated into their human readable format, and any OIDs that are not found in the MIB Modules will remain as OIDs.
+
+{{< figure src="/images/SNMP Trap PDU.png" title="SNMP Trap PDU" >}}
+
+Creating a [new package version][Create New Version] will not inherit the trigger configuration from the source version. Similarly, exporting a package version will not include the trigger configuration in the {{% ctx %}} Package file. These are known limitations and should be addressed in a future release.
+
+See the [Create a Trigger on a Package Version][Create a Trigger on a Package Version tutorial] tutorial for a step-by-step guide.
+
+### Running Executions
+
+{{< figure src="/images/Package Version Editor - Running Executions.png" title="Running Executions Grid" >}}
+
+The Running Executions tab displays a list of currently running flow executions for the selected package version. Each row in the list is a distinct flow execution, and identifies:
+
+* `Flow Name` - the name of the flow being executed.
+* `Execution Id` - the unique execution ID for this flow.
+* `Parent Execution Id` - the Execution ID of the flow that initiated the execution of this flow. If this flow was not initiated by another flow the Parent Execution Id is blank.
+* `Root Execution Id` - the Execution ID of the initial flow to be executed. If this flow is the initially executed flow, its Execution Id will be also the Root Execution Id. If this flow execution was initiated by another flow, if will share the same Root Execution Id to that of the parent flow.
+* `Started At` - the date and time when this flow started executing.
+* `Duration` - the current duration of the flow in seconds; the Duration is updated at 10 second intervals.
+* `Executing On` - identifies the node executing this flow. It has the format of `. ()`, `` is the `CustomerName` specified at the time of installation to identify the platform, `` is the name of the host server, and `` is the IP address of the host server.
+* `Debugged By`– identifies the user that has attached to this flow to debug it in {{% ctx %}} Gateway. This will be blank if a user is not attached to the flow.
+
+#### Filter Running Executions
+
+Flows may be filtered by entering text into the search field of any column to form a partial text match with the displayed data.
+
+Note: The `Started At` column must be filtered using the date-time format of `yyyy-MM-ddThh:mm:ss`. A partial match of digits used in the `Started At` filter may be used.
+
+See the [View Running Executions][View Running Executions tutorial] tutorial for a step-by-step guide.
+
+#### Group, Sort and Aggregate Running Executions
+
+The {{< image src="/images/Package Version Editor - Filter Options.png" >}} icon to the right of each column name reveals a menu enabling the executing flows to be grouped, sorted, or have an aggregation function applied to the column’s data.
+
+See the [View Running Executions][View Running Executions tutorial] tutorial for a step-by-step guide.
+
+#### Debug Running Executions
+
+A running execution may be debugged by selecting the execution and clicking the {{< image src="/images/Package Version Editor - Attach to Execution.png" >}} icon; all dependent executions will automatically be attached to the same session, which will open in a new window.
+
+To stop debugging, detach the execution by clicking the {{< image src="/images/Package Version Editor - Detach from Execution.png" >}} icon; all dependent executions will be automatically detached. Any paused executions will immediately continue running. If any changes have been made to the executing flows whilst debugging, these changes will persist for these executions only.
+
+See the [Debug Running Executions][Debug Running Executions tutorial] tutorial for a step-by-step guide.
+
+#### Stop Running Executions
+
+Any running flow execution may be aborted by selecting the execution and clicking the {{< image src="/images/Package Version Editor - Stop Execution.png" >}} icon. The flow execution will be stopped immediately.
+
+Multiple executions may be stopped simultaneously by selecting the executions by holding down the Ctrl or Shift key and clicking the executions to select, then clicking the {{< image src="/images/Package Version Editor - Stop Execution.png" >}} icon.
+
+See the [Stop Running Executions][Stop Running Executions tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Only flow versions inherited from the source package version, or the Master Versions stored in the Master Repository, can be included in a new package version.
+* New package versions do not retain any of the configured schedules or triggers set on the source version.
+* Exported package versions do not retain any of the configured schedules, triggers or authorisation set on the package version being exported.
+* To set the default package, it is necessary to select a published package version; it is not possible to set the default package by selecting a version that is not published even if other versions of the same package are published.
+* Currently, a schedule cannot be edited; new schedules can be created, and existing schedules deleted.
+
+## See Also
+
+### Related Concepts
+
+* [What is a Package?][]
+
+### Related Tutorials
+
+* [Definition][Definition tutorials]
+ * [Create a New Package Version][Create a New Package Version tutorial]
+ * [Publish a Package Version][Publish a Package Version tutorial]
+ * [Set the Default Package][Set the Default Package tutorial]
+ * [Set the Default Package Version][Set the Default Package Version tutorial]
+ * [Unpublish a Package Version][Unpublish a Package Version tutorial]
+ * [Export a Package Version][Export a Package Version tutorial]
+* [Authorisation][Authorisation tutorials]
+ * [Set Authorisation on a Package Version][Set Authorisation on a Package Version tutorial]
+* [Schedules][Schedules tutorials]
+ * [Create a Schedule on a Package Version][Create a Schedule on a Package Version tutorial]
+* [Triggers][Triggers tutorials]
+ * [Create a Trigger on a Package Version][Create a Trigger on a Package Version tutorial]
+* [Running Executions][Running Executions tutorials]
+ * [View Running Executions][View Running Executions tutorial]
+ * [Debug Running Executions][Debug Running Executions tutorial]
+ * [Stop Running Executions][Stop Running Executions tutorial]
+
+[Authorisation]: {{< ref "#authorisation" >}}
+[Create New Version]: {{< ref "#create-a-new-package-version" >}}
+[Definition]: {{< ref "#definition" >}}
+[Export]: {{< ref "#export-a-package-version" >}}
+[Publish]: {{< ref "#publish-a-package-version" >}}
+[Running Executions]: {{< ref "#running-executions" >}}
+[Schedules]: {{< ref "#schedules" >}}
+[Set As Default Package]: {{< ref "#set-as-default-package" >}}
+[Set As Default Version]: {{< ref "#set-as-default-version" >}}
+[Triggers]: {{< ref "#triggers" >}}
+[Unpublish]: {{< ref "#unpublish-a-package-version" >}}
+
+[Authorisation tutorials]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.AuthorisationTutorials" >}}
+[Create a New Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.CreateNewPackageVersion" >}}
+[Create a Schedule on a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.Schedules" >}}
+[Create a Trigger on a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.Triggers" >}}
+[Debug Running Executions tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.DebugRunningExecutions" >}}
+[Definition tutorials]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.DefinitionTutorials" >}}
+[Export a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.ExportPackage" >}}
+[Publish a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.PublishPackage" >}}
+[Running Executions tutorials]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.RunningExecutionsTutorials" >}}
+[Schedules tutorials]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.SchedulesTutorials" >}}
+[Set Authorisation on a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.Authorisation" >}}
+[Set the Default Package tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.SetDefaultPackage" >}}
+[Set the Default Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.SetDefaultPackageVersion" >}}
+[Stop Running Executions tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.StopRunningExecutions" >}}
+[Triggers tutorials]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.TriggersTutorials" >}}
+[Unpublish a Package Version tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.UnpublishPackage" >}}
+[View Running Executions tutorial]: {{< url path="Cortex.Tutorials.Administration.PackageManagement.ViewRunningExecutions" >}}
+
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Import]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.Import" >}}
+[Input Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Package Definitions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.MainDoc" >}}
+[What is a Package?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Packages.WhatIsAPackage.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-authorisation.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-authorisation.md
new file mode 100644
index 000000000..64631ad27
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-authorisation.md
@@ -0,0 +1,101 @@
+---
+title: "Studio Authorisation"
+linkTitle: "Studio Authorisation"
+description: "Configure access to flows in {{% ctx %}} Gateway."
+weight: 50
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Studio Authorisation page is used to configure access to flows within {{% ctx %}} Gateway. Each flow can be set to have [`View`][View] or [`Edit`][Edit] permissions assigned to LDAP Groups that exist in the Active Directory server configured in LDAP Connection for {{% ctx %}} Gateway, or no access permissions at all.
+
+| | |
+|------------------------------|-----------------------------------------------------------------|
+| **Roles Required:** | Admin |
+
+## Anatomy
+
+{{< figure src="/images/Studio Authorisation.png" title="Studio Authorisation" >}}
+
+The LDAP Groups that may be granted access are limited to those assigned the `Studio` role in LDAP Authorisation.
+
+Permissions are set either explicitly or implicitly. Explicitly set permissions are assigned by the user performing an explicit action to set that item’s permissions, whereas implicitly set permissions are assigned automatically by the user explicitly setting the permissions on a parent group.
+
+Permissions are explicitly set by setting the checkbox in either the [View][] or [Edit][] columns of the appropriate LDAP Group for the flow or group to which the permissions are to be assigned. Permissions are explicitly removed by clearing the checkbox.
+
+If an item is explicitly set with [`Edit`][Edit] permissions, then that item will also be implicitly set with [`View`][View] permissions. Explicitly setting an item with [`View`][View] permissions does not implicitly set it with Edit permissions.
+
+## Actions
+
+### View
+
+If an LDAP group is given `View` permissions on a flow, the members of the LDAP group can:
+
+* View the flow
+* Debug the flow
+
+If an LDAP Group is given `View` permissions on a group, the members of that LDAP group can:
+
+* View all descendent groups and flows
+* Debug all descendent flows
+
+If a group has `View` permissions either explicitly set or implicitly set, then its child groups and flows will have their `View` permissions implicitly set.
+
+If a group has its `View` permissions removed, then all its child groups and flows will have their `View` permissions removed, regardless of whether they were set explicitly or implicitly.
+
+See the [Manage Flow Access][Manage Flow Access tutorial] tutorial for a step-by-step guide.
+
+### Edit
+
+If an LDAP group is given `Edit` permissions on a flow, the members of the LDAP group can:
+
+* View the flow
+* Debug the flow
+* Edit the flow
+* Move the flow
+* Rename the flow
+* Delete the flow
+* Commit changes to the flow
+* Get the master version of the flow
+
+If an LDAP Group is given `Edit` permissions on a group, the members of that LDAP group can:
+
+* Create new flows and groups within the group
+* View all descendent flows and groups
+* Debug all descendent flows
+* Edit all descendent flows
+* Move all descendent flows
+* Rename all descendent flows
+* Delete all descendent flows
+* Commit changes to all descendent flows
+* Get the master version of all descendent flows
+
+If a group has `Edit` permissions explicitly set, then its child groups and flows will be implicitly set with both `Edit` and [`View`][View] permissions.
+
+If a group has its `Edit` permissions removed, then all its child groups and flows will have their `Edit` permissions removed, regardless of whether they were set explicitly or implicitly.
+
+If a flow is explicitly set with `Edit` permissions, then any parent groups, which have not been explicitly set with [`View`][View] permissions, will be implicitly set with [`View`][View] permissions.
+
+See the [Manage Flow Access][Manage Flow Access tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* The state of whether a permission is granted explicitly or implicitly is not persisted between the page being closed and reopened.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Manage Flow Access][Manage Flow Access tutorial]
+
+[Edit]: {{< ref "#edit">}}
+[View]: {{< ref "#view">}}
+[Manage Flow Access tutorial]: {{< url path="Cortex.Tutorials.Administration.StudioAuthorisation.ManageFlowAccess" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-export.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-export.md
new file mode 100644
index 000000000..36b39b1dd
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-export.md
@@ -0,0 +1,51 @@
+---
+title: "Studio Export"
+linkTitle: "Studio Export"
+description: "Export flows from {{% ctx %}} Gateway."
+weight: 60
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Studio Export page allows exporting one or more flows into a Studio Package file, which may be used for archiving purposes, or [importing][Studio Import] flows into another {{% ctx %}}.
+
+| | |
+|------------------------------|-----------------------------------------------------------------|
+| **Roles Required:** | Admin |
+
+## Anatomy
+
+{{< figure src="/images/Studio Export.png" title="Studio Export" >}}
+
+## Actions
+
+### Export Flows
+
+Individual flows are selected by clicking the checkbox in the `Export?` column adjacent to the flow to be exported. If a group is selected, then all the flows contained in that group, and any sub-groups, will be implicitly set; any implicitly set may be individually deselected by clicking the checkbox adjacent to the flow.
+
+Clicking `Export` checks if selected flows have dependencies. If there are dependencies, an additional page will be shown to allow confirmation that these should be included in the export. By default these are selected but can be deselected. A Studio Package will then be created from the Master Versions in the Master Repository of the selected flows, including their group hierarchy. The package will then be downloaded to the host’s browser as a file named `export.studiopkg` or `export .studiopkg`, where `` represents an integer to avoid naming conflict with other Studio Package files contained in the same folder.
+
+It is not necessary to have View or Edit authorisation for the flows to be exported.
+
+See the [Export Individual Flows][Export Individual Flows tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* The name of the Studio Package file cannot currently be customised.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Export Individual Flows][Export Individual Flows tutorial]
+
+[Export Individual Flows tutorial]: {{< url path="Cortex.Tutorials.Administration.StudioExport.ExportIndividualFlows" >}}
+[Studio Import]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioImport.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-hierarchy.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-hierarchy.md
new file mode 100644
index 000000000..bd0feb06d
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-hierarchy.md
@@ -0,0 +1,49 @@
+---
+title: "Studio Hierarchy"
+linkTitle: "Studio Hierarchy"
+description: "Move flows in {{% ctx %}} Gateway."
+weight: 70
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Studio Hierarchy page is used to move one or more flows from one group to another.
+
+## Anatomy
+
+{{< figure src="/images/Studio Hierarchy.png" title="Studio Hierarchy" >}}
+
+Only flows with [`Edit`][Edit] permissions for the current user are displayed in the Studio Hierarchy grid.
+
+## Actions
+
+### Move Flows
+
+After selecting the flows that are to be moved, right-click on the group where the selected flows will be moved to, and select the `Move selected items to this Group` from the context menu. The display will be updated to show the resultant hierarchy, with the flows to be moved but not yet committed identified with an asterisk (*) in the `Results` column of the grid.
+
+If a group is selected, then only the flows contained in that group are moved to another group; not the group itself.
+
+Once all the necessary flows have been moved, the changes can be committed using the `Commit` button.
+
+See the [Manage Flow Hierarchy][Manage Flow Hierarchy tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Parent groups must also have [`Edit`][Edit] permissions, in addition to the flows, otherwise the group and flows contained within it will not be displayed.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Manage Flow Hierarchy][Manage Flow Hierarchy tutorial]
+
+[Edit]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.Edit" >}}
+[Manage Flow Hierarchy tutorial]: {{< url path="Cortex.Tutorials.Administration.StudioHierarchy.ManageFlowHierarchy" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-import.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-import.md
new file mode 100644
index 000000000..f3a80f7df
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/studio-import.md
@@ -0,0 +1,63 @@
+---
+title: "Studio Import"
+linkTitle: "Studio Import"
+description: "Import flows into {{% ctx %}} Gateway."
+weight: 40
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Studio Import page allows importing one or more flows, contained in a Studio Package.
+
+| | |
+|------------------------------|-----------------------------------------------------------------|
+| **Roles Required:** | Admin |
+
+## Anatomy
+
+{{< figure src="/images/Studio Import.png" title="Studio Import" >}}
+
+## Actions
+
+### Favoured Hierarchy
+
+By default, the import favours the `system hierarchy`, and shows how the imported flows will map into the existing hierarchy. If flows to be imported already exist, they will be imported to the same location in the hierarchy; otherwise, any missing groups in the flow hierarchy will be added.
+
+It is possible to favour the `package hierarchy`, and this shows the hierarchy contained in the Studio Package. If flows to be imported already exist, they will be moved to the location specified in the Studio Package, adding any missing groups as necessary; otherwise, the hierarchy specified in the Studio Package will be created when the flows are imported.
+
+### Edit Import Locations
+
+The `Edit import hierarchy` switch enables editing the locations where flows should be imported to. This is useful if the default import location in the [favoured hierarchy][] for one or more flows needs changing.
+
+It is not necessary to have View or Edit authorisation for any flows or groups to view the entire hierarchy.
+
+### Import
+
+Individual flows contained in the Studio Package may be individually selected to be imported; it is not necessary that all the flows contained in the Studio Package are imported.
+
+When the selected flows are imported, they become the Master Version of the flows in the Master Repository, replacing any existing Master Versions.
+
+After importing the flows, it is necessary to check they are correctly configured in Studio Authorisation.
+
+See the [Import Individual Flows][Import Individual Flows tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Import Individual Flows][Import Individual Flows tutorial]
+
+[favoured hierarchy]: {{< ref "#favoured-hierarchy">}}
+[Import Individual Flows tutorial]: {{< url path="Cortex.Tutorials.Administration.StudioImport.ImportIndividualFlows" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/version-control.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/version-control.md
new file mode 100644
index 000000000..a19e8abe5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/Admin/version-control.md
@@ -0,0 +1,51 @@
+---
+title: "Version Control"
+linkTitle: "Version Control"
+description: "View and manage differences between flows in the current user's repository and the Master Repository."
+weight: 90
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Version Control page displays the flow hierarchy for the current user, indicating whether the current user’s flows, stored in the user’s repository, are the same as or differ from the Master Versions, stored in the Master Repository.
+
+## Anatomy
+
+{{< figure src="/images/Version Control.png" title="Version Control" >}}
+
+Only flows with [`Edit`][Edit] permissions for the current user are displayed in the Version Control grid.
+
+## Actions
+
+### Get Master
+
+Any flows that have been committed to the Master Repository by another user are indicated by a downward pointing arrow {{< image src="/images/Version Control - Master Updated.png" >}}. These newer Master Versions may be pulled into the user’s repository by selecting them and clicking the `Get Master` button; if `Get Master` is selected for a flow that also has user uncommitted changes, these changes will be lost and the flow will be overwritten with the Master Version from the Master Repository.
+
+See the [Use Version Control][Use Version Control tutorial] tutorial for a step-by-step guide.
+
+### Commit Changes
+
+Any flows in the user’s repository that have uncommitted changes are indicated by an upward pointing arrow {{< image src="/images/Version Control - Uncommitted Changes.png" >}}. These flows may be committed to the Master Repository by selecting them and clicking the `Commit Changes` button; if any flows selected to be committed have a new Master Version committed by another user a dialog will be displayed prompting conflicts to be resolved by taking either the version to be committed (`Take your version`) or `Take master version` resulting in a `Get Master` being performed.
+
+See the [Use Version Control][Use Version Control tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Parent groups must also have [`Edit`][Edit] permissions, in addition to the flows, otherwise the group and flows contained within it will not be displayed.
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Use Version Control][Use Version Control tutorial]
+
+[Edit]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.Edit" >}}
+[Use Version Control tutorial]: {{< url path="Cortex.Tutorials.Administration.VersionControl.UseVersionControl" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/_index.md
new file mode 100644
index 000000000..ddbdb0b51
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Gateway"
+linkTitle: "Gateway"
+description: "The centralised web-based portal for developing, operating and administering automation solutions that run on the {{% ctx %}} platform."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/_index.md
new file mode 100644
index 000000000..bfdddcf37
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Dev"
+linkTitle: "Dev"
+description: "This section includes user guides related to the Development section in {{% ctx %}} Gateway."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/_index.md
new file mode 100644
index 000000000..6eafef367
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Flow Editor"
+linkTitle: "Flow Editor"
+description: "View, edit and debug flows in {{% ctx %}} Gateway."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/_index.md
new file mode 100644
index 000000000..f8332e13f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Bottom Panel"
+linkTitle: "Bottom Panel"
+description: "View executions, identify issues preventing the flow from being debugged, and create and manage variables."
+weight: 50
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/executions-grid.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/executions-grid.md
new file mode 100644
index 000000000..abfec3a1f
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/executions-grid.md
@@ -0,0 +1,120 @@
+---
+title: "Executions Grid"
+linkTitle: "Executions Grid"
+description: "View executions being debugged."
+weight: 20
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Executions Grid displays information about all the [flows][What is a Flow?] that are currently being debugged by the developer.
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Executions Grid.png" title="Executions Grid" >}}
+
+The Executions Grid is automatically displayed when in `Debug` mode and a flow is `Running` or `Paused`; however, it may be manually opened, or closed any time by clicking the Open/Close handle or resized by dragging the handle up or down.
+
+Flows that are `Running` or `Paused` are shown with a green background; flows that have raised an [exception][What is an Exception?] are shown with a red background.
+
+## Actions
+
+### Select an Execution
+
+An [execution][What is an Execution?] may be selected by clicking on its row and can be controlled by action icons at the top right of the Executions Grid. Multiple executions can be selected using `Ctrl + Click` or `Shift + Click`. Selected executions are indicated with a darker background and the actions available are dependent on the state of the selected executions; greyed-out action icons are not applicable to the selected executions’ state.
+
+See the [Selecting an Execution][Selecting an Execution tutorial] tutorial for a step-by-step guide.
+
+### Continue the Execution
+
+Clicking the {{< image src="/images/Flow Editor - Continue Execution.png" >}} icon causes the selected executions to continue until the flow ends, a breakpoint is reached, or [`Break on exception`][Execution Options] is enabled and an exception has occurred causing the flow to pause. This action is only available for paused executions.
+
+See the [Continue and Stop the Execution][Continue and Stop the Execution tutorial] tutorial for a step-by-step guide.
+
+### Pause the Execution
+
+Clicking the {{< image src="/images/Flow Editor - Pause Execution.png" >}} icon pauses the selected executions. This action is only available for running executions.
+
+### Step the Execution
+
+Clicking the {{< image src="/images/Flow Editor - Step Execution.png" >}} icon causes the selected executions to execute the next [block][What is a Block?] and pause again. This action is only available for paused executions.
+
+See the [Step the Execution][Step the Execution tutorial] tutorial for a step-by-step guide.
+
+### Stop the Execution
+
+Clicking the {{< image src="/images/Flow Editor - Stop Execution.png" >}} icon stops the selected executions, and after a few seconds, removes them from Executions Grid. This action is available for all executions, regardless of their state.
+
+See the [Continue and Stop the Execution][Continue and Stop the Execution tutorial] tutorial for a step-by-step guide.
+
+### Go To
+
+Clicking the {{< image src="/images/Flow Editor - Go To.png" >}} icon causes the Flow Editor to open the [workspace][What is a Workspace?] which the selected execution is executing and focus on the location of the execution. It is typically used to locate the selected execution when the execution is not automatically tracked. This action is available for all executions, regardless of their state.
+
+See the [Stop Tracking and Go To][Stop Tracking and Go To tutorial] tutorial for a step-by-step guide.
+
+### Start Tracking
+
+Clicking the {{< image src="/images/Flow Editor - Start Tracking.png" >}} icon causes the Flow Editor to follow the selected execution, opening any necessary workspaces. This action is available for any execution not being tracked.
+
+Note: When an execution is started, if no other executions are being tracked, it will be automatically tracked if [`Show execution on workspace`][Execution Options] is enabled.
+
+See the [Start Tracking][Start Tracking tutorial] tutorial for a step-by-step guide.
+
+### Stop Tracking
+
+Clicking the {{< image src="/images/Flow Editor - Stop Tracking.png" >}} icon causes the tracking of the execution to stop, and the Flow Editor will not follow the selected execution. This action is available for any execution being tracked.
+
+See the [Stop Tracking and Go To][Stop Tracking and Go To tutorial] tutorial for a step-by-step guide.
+
+### Show Initial Flow First / Show Initial Flow Last
+
+Clicking the {{< image src="/images/Flow Editor - Show First.png" >}} (Show Initial Flow First) or {{< image src="/images/Flow Editor - Show Last.png" >}} (Show Initial Flow Last) icon changes the order of the hierarchy of parent and child flow executions, placing the parent execution uppermost and its children below, or the child execution uppermost and it's parent below. When {{< image src="/images/Flow Editor - Show First.png" >}} is clicked the icon changes to {{< image src="/images/Flow Editor - Show Last.png" >}} and vice versa. This action applies to all executions in the Executions Grid.
+
+See the [Show Initial Flow First or Last][Show Initial Flow First or Last tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Exceptions][]
+* [Executions][]
+* [Flows][]
+* [Workspaces][]
+
+### Related Tutorials
+
+* [Selecting an Execution][Selecting an Execution tutorial]
+* [Continue and Stop the Execution][Continue and Stop the Execution tutorial]
+* [Step the Execution][Step the Execution tutorial]
+* [Stop Tracking and Go To][Stop Tracking and Go To tutorial]
+* [Start Tracking][Start Tracking tutorial]
+* [Show Initial Flow First or Last][Show Initial Flow First or Last tutorial]
+
+[Continue and Stop the Execution tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.ContinueStopExecution" >}}
+[Selecting an Execution tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.SelectExecution" >}}
+[Show Initial Flow First or Last tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.ShowFirstLast" >}}
+[Step the Execution tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.StepExecution" >}}
+[Stop Tracking and Go To tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.StopTrackingGoTo" >}}
+[Start Tracking tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.StartTracking" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Execution Options]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.ExecutionOptions" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/messages-grid.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/messages-grid.md
new file mode 100644
index 000000000..173515a30
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/messages-grid.md
@@ -0,0 +1,58 @@
+---
+title: "Messages Grid"
+linkTitle: "Messages Grid"
+description: "Identify issues preventing a flow from being debugged."
+weight: 30
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Messages Grid lists any [issues][What is a Message?] preventing a [flow][What is a Flow?] from being debugged.
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Messages Grid.png" title="Messages Grid" >}}
+
+The Messages Grid is automatically displayed if there are any issues when attempting to debug a flow; however, it may be manually opened, or closed any time by clicking the Open/Close handle or resized by dragging the handle up or down.
+
+Each message identifies the location of the issue, a summary of the issue, and a detailed explanation.
+
+## Actions
+
+### Navigate to Issue
+
+If the issue in the flow is related to a misconfigured block [property][What is a Block Property?], double-clicking on the message will automatically navigate to, and select, the [block][What is a Block?] with the issue, open the [Property Editor][] and select the property causing the issue.
+
+See the [Messages Grid][Messages Grid tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Issues with misconfigured input variables in the [Settings Editor][] cannot be navigated to.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Flows][]
+* [Messages][]
+
+### Related Tutorials
+
+* [Messages Grid][Messages Grid tutorial]
+
+[Messages Grid tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.MessagesGrid" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[Property Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.PropertyEditor" >}}
+[Settings Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.SettingsEditor" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Message?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/overview.md
new file mode 100644
index 000000000..1590693ab
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/overview.md
@@ -0,0 +1,49 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Summary and anatomy of the Bottom Panel."
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Bottom Panel displays the current [executions][What is an Execution?] being debugged, any [issues][What is a Message?] preventing the [flow][What is a Flow?] from being debugged and also allows the management of [variables][What is a Variable?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Bottom Panel.png" title="Bottom Panel" >}}
+
+The 3 tabs that form the Bottom Panel are:
+
+* Executions (default) - displays the [Executions Grid][] listing current executions being debugged by the developer.
+* Messages - displays the [Messages Grid][] listing issues preventing the flow from being debugged.
+* Variables - displays the [Variables Grid][] enabling the management of variables.
+
+## See Also
+
+### Related Concepts
+
+* [Executions][]
+* [Flows][]
+* [Messages][]
+* [Variables][]
+
+### Related Tutorials
+
+* [Bottom Panel][Bottom Panel tutorial]
+
+[Bottom Panel tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.MainDoc" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Executions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Message?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/variables-grid.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/variables-grid.md
new file mode 100644
index 000000000..ba69fd777
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/bottom-panel/variables-grid.md
@@ -0,0 +1,175 @@
+---
+title: "Variables Grid"
+linkTitle: "Variables Grid"
+description: "Create and manage variables."
+weight: 40
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Variable Grid enables [variables][What is a Variable?] to be created and modified.
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Variables Grid.png" title="Variables Grid" >}}
+
+The Variables Grid may be manually opened, or closed any time by clicking the Open/Close handle or resized by dragging the handle up or down.
+
+Each variable is represented by a single row and the properties are represented by the different columns. The properties of a variable are:
+
+* `Description` – This is an optional free-format text property to aid understanding of the purpose of variable.
+* `Name` – This must be unique within its [scope][Variable Scopes] and is case insensitive. It cannot contain space characters, but it can contain hyphens and underscores.
+* `Type` – This is always set to *Variable*.
+* `Set Default Value?` – This is used to initialise the variable with a value when the variable is created, i.e., when it comes into scope. It can be set to either true (initialise) and is used in connection `Default Value` or false (do not initialise).
+* `Default Value` – The value to initialise the variable with when it is created, defined using an [Expression Editor][], and is used in connection with `Set Default Value?`.
+* `Is Input Variable?` – This is used to allow the variable to accept an input from an external REST Request, e.g., from a 3rd party system. It can be set to either true or false; the default value is false. For the variable to be used as an [Input Variable][Flow Input Variable], it must have its `Scope` set to the top-Level [workspace][What is a Workspace?], i.e. flow level.
+* `Is Output Variable?` – This allows the variable to pass back its value, when the [execution][What is an Execution?] terminates, to the calling system via the REST Response. It can be set to either true or false; the default value is false. For the variable to be used as an Output Variable, it must have its `Scope` set to the top-Level workspace, i.e. flow level.
+* `Scope` – This property defines the scope of a variable, i.e., the workspace, or workspaces, where the variable is [accessible][]. Variables operate on the principle of inherited scope, where variables defined in a workspace are accessible from any of its nested workspaces.
+
+Variables in different scopes may be named identically, but identically named variables cannot be defined in the same workspace. When referring to identically named variables within a block’s [properties][What is a Block Property?], the variable with the most local scope will be used, e.g., a variable defined in the current workspace will be used rather than one with an identical name in a parent workspace.
+
+A variable may be selected by clicking on its row. Multiple variables can be selected using `Ctrl + Click` or `Shift + Click`. Selected variables are indicated with bold text.
+
+## Actions
+
+### Create a Variable
+
+Clicking the {{< image src="/images/Flow Editor - Add Variables.png" >}} icon will create a new variable. The variable will be created with the scope of the currently selected workspace.
+
+See the [Create, Rename and Delete a Variable][Create, Rename and Delete a Variable tutorial] tutorial for a step-by-step guide.
+
+### Modify a Variable
+
+#### Rename a Variable
+
+Double-click the variable’s `Name` field to enable its editing; rename the variable and click outside the field to complete the renaming process. It is entered as free-format text, however, when it is saved, it will automatically be prepended by `($)` to denote that this is a variable. If the `Name` is entered prepended by a `($)`, the system will not duplicate the prefix.
+
+Renaming a variable will update any use of that variable in the flow to use the new name. If a variable is renamed to a name that already exists the renamed variable and the existing variable will be highlighted in red text.
+
+See the [Create, Rename and Delete a Variable][Create, Rename and Delete a Variable tutorial] tutorial for a step-by-step guide.
+
+#### Assigning a Default Value to a Variable
+
+Double-click the `Set Default Value?` field of the required variable to reveal a checkbox; click on the checkbox to enable the default value.
+Then, double-click on the `Default Value` field to open an [Expression Editor][] in which to specify the default value.
+
+See the [Assign a Default Value to a Variable][Assign a Default Value to a Variable tutorial] tutorial for a step-by-step guide.
+
+#### Defining an Input or Output Variable
+
+The scope of an input or output variable must be set to the top-Level workspace, i.e. flow level, for it to accept an input value or return an output value. Double-click on the `Is Input Variable?` or `Is Output Variable?` fields, as appropriate, to reveal a checkbox. Click on the checkbox to tick it to make the selected variable an input or output variable.
+
+A single variable can be both an input variable and an output variable.
+
+See the [Define an Input or Output Variable][Define an Input or Output Variable tutorial] tutorial for a step-by-step guide.
+
+#### Modifying the Scope of a Variable
+
+Double-click on the `Scope` field of the variable to open a dropdown menu. Select the scope from the dropdown.
+
+To change the scope for multiple variables, they can be changed individually, or alternatively, select all variables to be changed, [cut][] them, open the workspace that they should be moved to and then [paste][] them.
+
+See the [Modify the Scope of a Variable][Modify the Scope of a Variable tutorial] tutorial for a step-by-step guide.
+
+### Copy Variables
+
+Right-click anywhere on a variable and select `Copy` from the context menu to copy the variable. To copy multiple variables select all the variables to be copied before right-clicking.
+
+### Cut Variables
+
+Right-click anywhere on a variable and select `Cut` from the context menu to cut the variable. To cut multiple variables select all the variables to be cut before right-clicking.
+
+### Paste Variables
+
+Right-click anywhere in the variable grid and select `Paste` from the context menu to paste the cut or copied variable(s). The pasted variable(s) will be added to the currently selected workspace and if a variable already exists on that workspace with the same name it will append `-Copy` to the name.
+
+### Delete Variables
+
+Right-click anywhere on a variable and select `Delete` from the context menu to delete the variable. Alternatively, select the variable to be deleted and use the `delete` key to delete the variable. To delete multiple variables select all the variables to be deleted before right-clicking or using the `delete` key.
+
+See the [Create, Rename and Delete a Variable][Create, Rename and Delete a Variable tutorial] tutorial for a step-by-step guide.
+
+### Sort Variables
+
+The variables displayed may be ordered by any of the columns.
+
+To sort by a singles column's values, click the column header, each click will cycle through the sort options in the following order:
+
+* Ascending
+* Descending
+* Remove Sort
+
+To sort by multiple columns, click the {{< image src="/images/Flow Editor - Sort Variables.png" >}} icon next to each column name to be sorted by and select `Sort Ascending` or `Sort Descending` option. The sort should be applied to each column in the order to be sorted by. To remove a column from the multi-column sort, click the {{< image src="/images/Flow Editor - Sort Variables.png" >}} icon next to the name of the column to be removed and select `Remove Sort`.
+
+If there is a multi-column sort in place, clicking on a column header will replace the sort with a single column sort cycling to the next option as listed above.
+
+### Filter Variables
+
+The displayed variables may be filtered, based on the values contained in any property of the variables, by typing into the box below each property column name.
+
+The filtering on `Scope` allows for the following options:
+
+* `All` – All variables in the flow, regardless of their scope, are displayed
+* `Flow` – Only variables defined at the top-level workspace, i.e. flow variables, are displayed
+* `Defined (Selected Workspace)` – Only variables defined in the selected workspace are displayed; inherited scope variables are not displayed.
+* `Available (Selected Workspace)` – Variables defined in the selected workspace and inherited scope variables are displayed. This is the default setting.
+
+### Show or Hide Filters
+
+The filters themselves can be hidden by clicking the {{< image src="/images/Flow Editor - Hide Filters.png" >}} icon; note, although the filters may be hidden, their filtering actions still apply.
+
+When filters are hidden, the icon will change to {{< image src="/images/Flow Editor - Show Filters.png" >}}. Clicking this will make the filters visible again.
+
+### Enable or Disable Filtering
+
+The filtering of displayed variables can be disabled by clicking the {{< image src="/images/Flow Editor - Disable Filtering.png" >}} icon.
+
+When filtering is disabled, the icon will change to {{< image src="/images/Flow Editor - Enable Filtering.png" >}} and all variables will be displayed. Clicking this will enable filtering and any existing filters will be re-applied.
+
+## Remarks
+
+### Known Limitations
+
+* The scope of a variable is referenced to the Description property of the flow or workspace, not the name of the workspace.
+* It is possible to mark a non-global variable as `Is Input Variable?` or `Is Output Variable?`. However, the variable will not accept an input value nor return an output value.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Executions][]
+* [Flows][]
+* [Variables][]
+* [Workspaces][]
+
+### Related Tutorials
+
+* [Create, Rename and Delete a Variable][Create, Rename and Delete a Variable tutorial]
+* [Assign a Default Value to a Variable][Assign a Default Value to a Variable tutorial]
+* [Define an Input or Output Variable][Define an Input or Output Variable tutorial]
+* [Modify the Scope of a Variable][Modify the Scope of a Variable tutorial]
+
+[Assign a Default Value to a Variable tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.AssignDefaultVariableValue" >}}
+[Create, Rename and Delete a Variable tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.CreateRenameDeleteVariable" >}}
+[Define an Input or Output Variable tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.DefineInputOutputVariable" >}}
+[Modify the Scope of a Variable tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.BottomPanel.ModifyVariableScope" >}}
+
+[cut]: {{< ref "#cut-variables" >}}
+[paste]: {{< ref "#paste-variables" >}}
+[accessible]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.Accessible" >}}
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Flow Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/left-panel.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/left-panel.md
new file mode 100644
index 000000000..e67fd9011
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/left-panel.md
@@ -0,0 +1,78 @@
+---
+title: "Left Panel"
+linkTitle: "Left Panel"
+description: "Browse, search and use available blocks."
+weight: 20
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Left Panel shows the Palettes containing [blocks][What is a Block?] that can be used to construct a [flow][What is a Flow?] and is automatically opened when working in Edit or Debug Edit modes.
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Left Panel.png" title="Left Panel" >}}
+
+The Palettes group blocks with similar themes, and many of the blocks in a palette look similar but perform slightly different functions; the actual function that a block performs is shown in text, next to the block icon.
+
+## Actions
+
+### Open/Close the Panel
+
+The Left Panel can be manually opened or closed at any time using the open/close handles. It can also be resized by dragging the handle left or right.
+
+### Collapse/Expand Palette Groups
+
+To collapse or expand all palette groups, click the relevant {{< image src="/images/Flow Editor - Collapse All.png" >}} or {{< image src="/images/Flow Editor - Expand All.png" >}} icon at the top of the Left Panel. Each palette group may be collapsed or expanded independently by clicking on the {{< image src="/images/Flow Editor - Collapse Palette.png" >}} or {{< image src="/images/Flow Editor - Expand Palette.png" >}} icon to the right of the group name.
+
+### View Blocks
+
+To view the blocks contained in the Palettes, click on the {{< image src="/images/Flow Editor - Expand Palette.png" >}} icon to the right of the palette group to expand the group and show the blocks it contains, or alternatively, click the {{< image src="/images/Flow Editor - Expand All.png" >}} icon at the top of the Left Panel to expand all the palette groups.
+
+See the [View Blocks in the Palette][View Blocks in the Palette tutorial] tutorial for a step-by-step guide.
+
+### Search for a Block
+
+To search for a block by name, start typing into the search box. All the blocks that contain the search characters will be displayed; the more characters entered, the more refined the search will be, displaying fewer block options. The search is a fuzzy search, which means that even misspelt block names should identify the intended matching blocks.
+
+See the [Searching the Palette for a Block][Searching the Palette for a Block tutorial] tutorial for a step-by-step guide.
+
+### Place a Block on a Workspace
+
+To place a block from the palette onto a [workspace][What is a Workspace?], left-click on the block in the palette and drag it onto the Workspace.
+
+See the [Placing a Block from the Palette onto a Workspace][Placing a Block from the Palette onto a Workspace tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* If the developer has [`View`][View] permissions, it is still possible to drag a block from the Palettes onto a Workspace. Once placed on the Workspace, it is not possible to delete the block unless [`Edit`][Edit] permissions are assigned to the developer, or the browser is refreshed.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Flows][]
+* [Workspaces][]
+
+### Related Tutorials
+
+* [View Blocks in the Palette][View Blocks in the Palette tutorial]
+* [Searching the Palette for a Block][Searching the Palette for a Block tutorial]
+* [Placing a Block from the Palette onto a Workspace][Placing a Block from the Palette onto a Workspace tutorial]
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Edit]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.Edit" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Placing a Block from the Palette onto a Workspace tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.LeftPanel.PlaceBlocks" >}}
+[Searching the Palette for a Block tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.LeftPanel.SearchBlocks" >}}
+[View Blocks in the Palette tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.LeftPanel.ViewBlocks" >}}
+[View]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.View" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.Workspaces" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/main-panel.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/main-panel.md
new file mode 100644
index 000000000..140048bef
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/main-panel.md
@@ -0,0 +1,308 @@
+---
+title: "Main Panel"
+linkTitle: "Main Panel"
+description: "View, edit and debug flows."
+weight: 30
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Main Panel is used when viewing, editing and debugging [flows][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Main Panel.png" title="Main Panel" >}}
+
+At the top of the Main Panel is the [Main Toolbar][], which displays a number of icons that perform actions on the selected flow, and the current editor mode. Below are the currently selected flow’s opened [workspaces][] and any associated [blocks][What is a Block?].
+
+### Main Toolbar
+
+To the left of the Main Toolbar, there are several icons that perform different actions on the currently selected flow. The icons displayed and their actions depend on the current editor mode.
+
+To the right of the Main Toolbar the current editor mode is displayed, and can have the following values:
+
+* View – the user only has [`View`][View] permissions on the flow and cannot edit it.
+* Edit – the user has [`Edit`][Edit] permissions and can add or delete blocks from the flow’s workspaces and change the block’s [properties][What is a Block Property?].
+* Debug - the flow is being debugged in the Flow Editor.
+* Debug Edit – edits may be made to the flow that is being debugged and paused without losing any values that have been assigned to the [variables][What is a Variable?].
+
+### Workspaces
+
+A [workspace][What is a Workspace?] is an object that contains a canvas, onto which blocks, drawn from the Palettes may be placed and connected to define the logic of a flow. Every flow has a top-level workspace, from where the flow [execution][What is an Execution?] will start; additional workspace blocks may be added from the Palettes to direct the flow execution to execute the logic contained in that workspace.
+
+The canvas of the flow’s top-level workspace is always present in the Main Panel, along with any of the flow’s additional workspaces that have been opened. The canvas will automatically increase in size as blocks are added or moved as necessary. If the workspace becomes too large to be viewed in its entirety in the Main Panel, scroll bars will be automatically added.
+
+To the bottom left of each workspace are a set of 4 overlaid zoom controls:
+
+* {{< image src="/images/Flow Editor - Shrink Wrap.png" >}} Shrink Wrap to reduce the size of the workspace canvas and remove unnecessary white space.
+* {{< image src="/images/Flow Editor - Reset Zoom.png" >}} Reset Zoom to undo any zoom in or zoom out actions that has been performed.
+* {{< image src="/images/Flow Editor - Zoom In.png" >}} Zoom In
+* {{< image src="/images/Flow Editor - Zoom Out.png" >}} Zoom Out
+
+#### Workspace Toolbar
+
+At the top of each workspace, a workspace Toolbar displays the workspace name and a {{< image src="/images/Flow Editor - Close Flow.png" >}} icon to close that workspace.
+
+When a new workspace is created, it is initially given the default name of `Untitled Workspace`. This should be changed to a meaningful name, which will be displayed in the [breadcrumb trail][] in the [Navigation Bar][].
+
+#### Context Menus
+
+Context menus exist for workspaces and blocks on workspaces.
+
+##### Workspaces
+
+The workspace context menu allows for the pasting of objects copied to the {{% ctx %}} clipboard and creation of notes on the workspace, dependent on the Editor mode selected.
+
+##### Blocks on Workspaces
+
+The block context menu allows for the copying, cutting, deletion, setting and removing of breakpoints and the setting of the next block to execute, dependent on the Editor mode selected.
+
+## Actions
+
+### Main Toolbar
+
+#### Undo
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Undo.png" >}} icon allows the developer to undo changes made to the flow. The undo action can also be achieved by pressing `Ctrl+Z` on the keyboard.
+
+See the [Undo and Redo Changes][Undo and Redo Changes tutorial] tutorial for a step-by-step guide.
+
+#### Redo
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Redo.png" >}} icon allows the developer to redo changes undone by the Undo command. The redo action can also be achieved by pressing `Ctrl+Y` on the keyboard.
+
+See the [Undo and Redo Changes][Undo and Redo Changes tutorial] tutorial for a step-by-step guide.
+
+#### Start an Execution
+
+Available in Editor Modes: `View`, `Edit`, `Debug`
+
+The {{< image src="/images/Flow Editor - Start Execution.png" >}} icon saves any changes made to the flow to the developer’s local repository, changes the editor mode to `Debug`, and starts [debugging][Executions in Development] the flow.
+
+See the [Start an Execution][Start an Execution tutorial] tutorial for a step-by-step guide.
+
+#### Execution Options
+
+Available in Editor Modes: `View`, `Edit`, `Debug`
+
+The {{< image src="/images/Flow Editor - Execution Options.png" >}} dropdown enables the developer to change the options that are used when debugging the flow in the Flow Editor. One, multiple or no options can be selected:
+
+* `Show execution on workspace` - Displays an icon on the workspace, identifying the position of the flow being debugged, enabling the flow developer to track the execution progress.
+* `Break on exception` - causes the flow execution to be paused if an [exception][What is an Exception?] occurs.
+
+See the [Start an Execution][Start an Execution tutorial] tutorial for a step-by-step guide.
+
+#### Edit Flow
+
+Available in Editor Modes: `Debug` (if user has [`Edit`][Edit] permissions)
+
+The {{< image src="/images/Flow Editor - Edit Flow.png" >}} icon causes a flow that is being debugged to pause and then changes the editor mode to `Debug Edit`.
+
+See the [Edit Flow and Continue Debugging][Edit Flow and Continue Debugging tutorial] tutorial for a step-by-step guide.
+
+#### Continue Debugging
+
+Available in Editor Modes: `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Continue Debugging.png" >}} icon saves any changes made to the flow to the developer’s local repository and changes the editor mode to `Debug`.
+
+See the [Edit Flow and Continue Debugging][Edit Flow and Continue Debugging tutorial] tutorial for a step-by-step guide.
+
+#### Remove all Breakpoints
+
+Available in Editor Modes: `View`, `Edit`, `Debug`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Remove Breakpoints.png" >}} icon removes all the breakpoints set on the currently selected flow.
+
+See the [Remove All Breakpoints][Remove All Breakpoints tutorial] tutorial for a step-by-step guide.
+
+#### Save
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Save.png" >}} icon saves any changes made to the flow to the developer’s local repository.
+
+See the [Save and Commit Flow][Save and Commit Flow tutorial] tutorial for a step-by-step guide.
+
+#### Commit Flow
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Commit.png" >}} icon saves any changes to the developer's local repository and commits a copy of the flow, without any breakpoints, to the Master Repository. This makes this version of the flow the Master Version, which can be accessed by others with relevant permissions. An asterisk (*) next to the icon indicates that the locally saved version of the flow has not been committed.
+
+See the [Save and Commit Flow][Save and Commit Flow tutorial] tutorial for a step-by-step guide.
+
+#### Get the Master Version of this Flow
+
+Available in Editor Modes: `View`, `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Get Master.png" >}} icon retrieves the Master Version of the flow from the Master Repository and saves it to the developer's local repository, overwriting the version currently being viewed or edited. An asterisk (*) next to the icon indicates that someone else has made changes to the Master version, which differs from the local version of the flow.
+
+See the [Get Master Version of Flow][Get Master Version of Flow tutorial] tutorial for a step-by-step guide.
+
+#### Compare Flow with Master Version
+
+Available in Editor Modes: `View`, `Edit`, `Debug`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Compare with Master.png" >}} icon saves the flow to the developer’s local repository and opens a new browser window that displays the local version of the flow alongside the Master Version of the flow in the Master Repository, highlighting any differences.
+
+See the [Compare Flow with Master Version][Compare Flow with Master Version tutorial] tutorial for a step-by-step guide.
+
+#### Delete
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+The {{< image src="/images/Flow Editor - Delete Flow.png" >}} icon deletes the currently displayed flow.
+
+See the [Delete Flow][Delete Flow tutorial] tutorial for a step-by-step guide.
+
+### Workspace Context Menu
+
+#### Add Note
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+Selecting this option will create a Note object on the workspace at the cursor’s location. This allows for the addition of text on the workspace to enhance the understanding of the flow.
+
+See the [Add Notes to Workspaces][Add Notes to Workspaces tutorial] tutorial for a step-by-step guide.
+
+#### Paste
+
+Available in Editor Modes: `Edit`, `Debug Edit` (if an object has been copied or cut to the {{% ctx %}} clipboard)
+
+Selecting this option, or pressing `Ctrl+V` on the keyboard, will paste a copy of the clipboard on to the workspace at the cursor’s location.
+
+See the [Cut, Copy, Paste and Delete Objects][Cut, Copy, Paste and Delete Objects tutorial] tutorial for a step-by-step guide.
+
+### Block Context Menu
+
+#### Copy
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+Selecting this option, or pressing `Ctrl+C` on the keyboard, will copy the selected blocks and their configurations, plus any connections between the selected blocks, to the {{% ctx %}} clipboard. This allows a copy of the selected blocks and connections to be pasted on any workspace of any flow open in the Flow Editor.
+
+See the [Cut, Copy, Paste and Delete Objects][Cut, Copy, Paste and Delete Objects tutorial] tutorial for a step-by-step guide.
+
+#### Cut
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+Selecting this option, or pressing `Ctrl+X` on the keyboard, will copy the selected blocks and their configurations, plus any connections between the selected blocks, to the {{% ctx %}} clipboard and remove them from the workspace. This allows the selected blocks and connections to be moved to any workspace of any flow open in the Flow Editor.
+
+See the [Cut, Copy, Paste and Delete Objects][Cut, Copy, Paste and Delete Objects tutorial] tutorial for a step-by-step guide.
+
+#### Delete
+
+Available in Editor Modes: `Edit`, `Debug Edit`
+
+Selecting this option, or pressing `Delete` on the keyboard, will delete the selected blocks and any connections between the selected blocks.
+
+See the [Cut, Copy, Paste and Delete Objects][Cut, Copy, Paste and Delete Objects tutorial] tutorial for a step-by-step guide.
+
+#### Add Breakpoint
+
+Available in Editor Modes: `Edit`, `Debug`, `Debug Edit` (if the block does not already have a breakpoint set)
+
+Selecting this option will set a breakpoint above the block.
+
+Note: If multiple blocks have been selected, the `Add Breakpoint` action will only apply to the current block.
+
+See the [Add and Remove Breakpoints][Add and Remove Breakpoints tutorial] tutorial for a step-by-step guide.
+
+#### Remove Breakpoint
+
+Available in Editor Modes: `Edit`, `Debug`, `Debug Edit` (if the block has a breakpoint set)
+
+Selecting this option will cause a breakpoint to be removed.
+
+Note: If multiple blocks have been selected, the `Remove Breakpoint` action will only apply to the current block.
+
+See the [Add and Remove Breakpoints][Add and Remove Breakpoints tutorial] tutorial for a step-by-step guide.
+
+#### Set Next Block to Execute
+
+Available in Editor Modes: `Debug`, `Debug Edit` (if the execution is paused)
+
+Selecting this option will cause the execution token, or the selected execution if there are multiple simultaneous executions, to be moved above the current block.
+
+Note: If multiple blocks have been selected, the `Set Next Block to Execute` action will only apply to the current block. If multiple executions have been selected this option is not available.
+
+See the [Set Next Block to Execute][Set Next Block to Execute tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* It is not possible to set breakpoints on multiple blocks simultaneously.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Exceptions][]
+* [Executions][]
+* [Flows][]
+* [Variables][]
+* [Workspaces][Workspace Fundamentals]
+
+### Related Tutorials
+
+* [Main Toolbar][Main Toolbar Actions tutorials]
+ * [Undo and Redo Changes][Undo and Redo Changes tutorial]
+ * [Start an Execution][Start an Execution tutorial]
+ * [Edit Flow and Continue Debugging][Edit Flow and Continue Debugging tutorial]
+ * [Remove All Breakpoints][Remove All Breakpoints tutorial]
+ * [Save and Commit Flow][Save and Commit Flow tutorial]
+ * [Get Master Version of Flow][Get Master Version of Flow tutorial]
+ * [Compare Flow with Master Version][Compare Flow with Master Version tutorial]
+ * [Delete Flow][Delete Flow tutorial]
+* [Context Menus][Context Menu tutorials]
+ * [Cut, Copy, Paste and Delete Objects][Cut, Copy, Paste and Delete Objects tutorial]
+ * [Add and Remove Breakpoints][Add and Remove Breakpoints tutorial]
+ * [Set Next Block to Execute][Set Next Block to Execute tutorial]
+ * [Add Notes to Workspaces][Add Notes to Workspaces tutorial]
+
+[Main Toolbar]: {{< ref "#main-toolbar" >}}
+[workspaces]: {{< ref "#workspaces" >}}
+
+[Add Notes to Workspaces tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.AddNotes" >}}
+[Add and Remove Breakpoints tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.AddRemoveBreakpoints" >}}
+[Compare Flow with Master Version tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.CompareMaster" >}}
+[Context Menu tutorials]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.ContextMenus" >}}
+[Cut, Copy, Paste and Delete Objects tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.CutCopyPasteDelete" >}}
+[Delete Flow tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.DeleteFlow" >}}
+[Edit Flow and Continue Debugging tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.EditFlow" >}}
+[Get Master Version of Flow tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.GetMaster" >}}
+[Main Toolbar Actions tutorials]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.MainToolbar" >}}
+[Remove All Breakpoints tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.RemoveBreakpoints" >}}
+[Save and Commit Flow tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.SaveCommit" >}}
+[Set Next Block to Execute tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.SetNextBlock" >}}
+[Start an Execution tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.StartExecution" >}}
+[Undo and Redo Changes tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainPanel.UndoRedo" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[breadcrumb trail]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.NavigationBar.BreadcrumbTrail" >}}
+[Edit]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.Edit" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Executions in Development]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Navigation Bar]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.NavigationBar.MainDoc" >}}
+[View]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.View" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[Workspace Fundamentals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/navigation-bar.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/navigation-bar.md
new file mode 100644
index 000000000..abf453f11
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/navigation-bar.md
@@ -0,0 +1,150 @@
+---
+title: "Navigation Bar"
+linkTitle: "Navigation Bar"
+description: "Navigate between open flows and workspaces."
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Navigation Bar is at the top of the page and provides information about the currently selected [workspace][What is a Workspace?], navigation between simultaneously opened [flows][What is a Flow?], and access to online help.
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Navigation Bar.png" title="Navigation Bar" >}}
+
+The Navigation bar consists of 6 elements:
+
+* [Recently Used Workspaces][]
+* [Breadcrumb Trail][]
+* [User Principle Name][]
+* [Help][]
+* [Navigation][]
+* [Close Flow][]
+
+### Recently Used Workspaces
+
+Recently Used Workspaces displays the user's last 10 opened workspaces in a drop down menu to allow quick navigation to any of these workspaces.
+
+### Breadcrumb Trail
+
+The Breadcrumb Trail shows the hierarchy of all the open workspaces of the flow being viewed. At the left is the flow itself; an asterisk (*) after the flow name indicates that there are unsaved changes. Then follows a list of the open hierarchical workspace names, with the most deeply nested workspace at the right. The currently selected workspace is identified by its name being highlighted by a darker background.
+
+{{% alert title="Note" %}}The breadcrumb trail only shows the names of the workspaces, as set on the workspace menu bar, not the workspace description as set in the workspace Description property.{{% /alert %}}
+
+### User Principle Name
+
+The User Principle Name identifies the current user logged in to Gateway.
+
+### Help
+
+The help icon opens the Product Portal, online documentation for {{% ctx %}}.
+
+### Navigation
+
+The Navigation sections consists of 2 navigation methods:
+
+* [Quick Navigation][].
+* [Sequential Navigation][].
+
+#### Quick Navigation
+
+Quick Navigation allows navigation between all open flows from a vertical, scrollable list.
+
+#### Sequential Navigation
+
+Sequential Navigation allows navigation to the previous or next open flow.
+
+### Close Flow
+
+Closes the Flow Editor for the current flow.
+
+## Actions
+
+### Using Recently Used Workspaces
+
+Clicking on the {{< image src="/images/Flow Editor - Recently Used Workspaces.png" >}} icon will display a list of the last 10 opened workspaces for the current user. Clicking on one of the list items will display that workspace in the [Main Panel][] opening it if it is not already open.
+
+### Using the Breadcrumb Trail
+
+Clicking on any part of the Breadcrumb Trail will change the focus of the [Main Panel][] to the workspace selected.
+
+After each workspace name there is a drop down menu that displays all workspaces available for the workspace that the dropdown was initiated for.
+
+### Open Help
+
+Clicking on the {{< image src="/images/Flow Editor - Help.png" >}} icon, will open the Product Portal in a new browser tab automatically selecting the section relevant to the {{% ctx %}} version being used.
+
+See the [Accessing Help][Accessing Help tutorial] tutorial for a step-by-step guide.
+
+### Quick Navigation between Open Flows
+
+Clicking on the {{< image src="/images/Flow Editor - Quick Navigation.png" >}} icon will replace the [Right Panel][] with a ‘filmstrip’ depicting a pictorial representation of all open flows in a vertical, scrollable list.
+
+To navigate to an alternative open flow, click on the flow image in the filmstrip; the open flow will then be visible in the [Main Panel][].
+
+Clicking on the Quick Navigation icon when the filmstrip is visible will close the Quick Navigation feature. The Quick Navigation feature will also be closed if a [block][What is a Block?] on the flow being viewed is selected, causing the block's [properties][What is a Block Property?] to be displayed in the [Right Panel][].
+
+See the [Quick Navigation Between Open Flows][Quick Navigation Between Open Flows tutorial] tutorial for a step-by-step guide.
+
+### Sequential Navigation between Open Flows
+
+Clicking on the {{< image src="/images/Flow Editor - Previous Flow.png" >}} (Previous Flow) or {{< image src="/images/Flow Editor - Next Flow.png" >}} (Next Flow) icons allows sequential navigation between open flows.
+
+If the first opened flow is being viewed, then the Previous Flow icon will be greyed out and unavailable. Similarly, if the last opened flow is being viewed, then the Next Flow icon will be greyed out and unavailable. If only one flow is open then both icons will be greyed out and unavailable.
+
+See the [Sequential Navigation Between Open Flows][Sequential Navigation Between Open Flows tutorial] tutorial for a step-by-step guide.
+
+### Close Flow
+
+Clicking on the {{< image src="/images/Flow Editor - Close Flow.png" >}} icon will attempt to close the currently selected open flow. If there are unsaved changes to the flow, a pop-up dialog will appear, inviting you to save your changes before closing the flow.
+
+See the [Close Flow][Close Flow tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Flows][]
+* [Workspaces][Workspaces]
+
+### Related Tutorials
+
+* [Accessing Help][Accessing Help tutorial]
+* [Quick Navigation Between Open Flows][Quick Navigation Between Open Flows tutorial]
+* [Sequential Navigation Between Open Flows][Sequential Navigation Between Open Flows tutorial]
+* [Close Flow][Close Flow tutorial]
+
+[Recently Used Workspaces]: {{< ref "#recently-used-workspaces" >}}
+[Breadcrumb Trail]: {{< ref "#breadcrumb-trail" >}}
+[Close Flow]: {{< ref "#close-flow" >}}
+[Help]: {{< ref "#help" >}}
+[Navigation]: {{< ref "#navigation" >}}
+[Quick Navigation]: {{< ref "#quick-navigation" >}}
+[Sequential Navigation]: {{< ref "#sequential-navigation" >}}
+[User Principle Name]: {{< ref "#user-principle-name" >}}
+
+[Accessing Help tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.NavigationBar.AccessHelp" >}}
+[Quick Navigation Between Open Flows tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.NavigationBar.QuickNavigation" >}}
+[Sequential Navigation Between Open Flows tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.NavigationBar.SequentialNavigation" >}}
+[Close Flow tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.NavigationBar.CloseFlow" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Main Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.MainDoc" >}}
+[Navigation Bar tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.NavigationBar.MainDoc" >}}
+[Right Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/overview.md
new file mode 100644
index 000000000..5f8c87e44
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/overview.md
@@ -0,0 +1,113 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Summary and anatomy of the Flow Editor."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Flow Editor page allows you to view, edit and debug [flows][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor.png" title="Flow Editor" >}}
+
+The Flow Editor page shows the [Navigation Bar][NavBar] at the top and the [Main Panel][Main] towards the centre of the page; to the left, right and bottom of the [Main Panel][Main], additional panels are automatically displayed, dependent on the activity currently being undertaken or the panel tab selected.
+
+Each of the [Left][], [Right][] and [Bottom][] panels may be manually opened or closed, expanded or shrunk, independently as required.
+
+### Navigation Bar
+
+The [Navigation Bar][] is always visible at the top of the page and provides information about the currently selected [workspace][What is a Workspace?], navigation between simultaneously opened flows, and access to online help.
+
+### Left Panel
+
+The [Left Panel][] shows the Palettes of available [blocks][What is a Block?], which are used during flow development. It is automatically opened during Edit mode.
+
+### Main Panel
+
+The [Main Panel][] is always visible and consists of:
+
+* The [Main Toolbar][].
+* One or more [Workspaces][] associated with the currently selected flow.
+
+### Right Panel
+
+The [Right Panel][] consists of 2 or 3 tabs depending on the mode selected:
+
+* In `View`, `Edit` or `Debug Edit` mode, the following tabs are available:
+
+ * Properties (default) - displays the [Property Editor][] showing the [properties][What is a Block Property?] of the currently selected block.
+ * Settings - displays the [Settings Editor][] to set the values of the [input variables][Flow Input Variable] used when debugging the flow.
+
+* In `Debug` mode, the following tabs are available:
+
+ * Variables (default) - displays the [Variables Viewer][] showing the values of the [variables][What is a Variable?] when debugging the flow.
+ * Exceptions - displays the [Exceptions Viewer][] showing details of any [exceptions][What is an Exception?] when debugging the flow.
+ * Settings - displays the [Settings Editor][] to set the values of the [input variables][Flow Input Variable] used when debugging the flow.
+
+### Bottom Panel
+
+The [Bottom Panel][] consists of 3 tabs:
+
+* Executions (default) - displays the [Executions Grid][] listing current [executions][What is an Execution?] being debugged by the user.
+* Messages - displays the [Messages Grid][] listing [issues][What is a Message?] preventing the flow from being debugged.
+* Variables - displays the [Variables Grid][] enabling the management of [variables][What is a Variable?].
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Exceptions][]
+* [Executions][]
+* [Flows][]
+* [Messages][]
+* [Variables][]
+* [Workspaces][Workspace Fundamentals]
+
+### Related Tutorials
+
+* [Flow Editor][Flow Editor tutorial]
+
+[Flow Editor tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.MainDoc" >}}
+
+[Left]: {{< ref "#left-panel" >}}
+[Main]: {{< ref "#main-panel" >}}
+[Navbar]: {{< ref "#navigation-bar" >}}
+[Right]: {{< ref "#right-panel" >}}
+[Bottom]: {{< ref "#bottom-panel" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Bottom Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Executions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.MainDoc" >}}
+[Flow Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Left Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.LeftPanel.MainDoc" >}}
+[Main Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.MainDoc" >}}
+[Main Toolbar]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.MainToolbar" >}}
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
+[Navigation Bar]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.NavigationBar.MainDoc" >}}
+[Property Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.PropertyEditor" >}}
+[Right Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.MainDoc" >}}
+[Settings Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.SettingsEditor" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[Variables Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesViewer" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Message?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.Workspaces" >}}
+[Workspace Fundamentals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/_index.md
new file mode 100644
index 000000000..2c1d713ab
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Right Panel"
+linkTitle: "Right Panel"
+description: "Set the values of block properties and input variables, and view execution information when debugging flows."
+weight: 40
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/_index.md
new file mode 100644
index 000000000..9decb2194
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Execution Viewer"
+linkTitle: "Execution Viewer"
+description: "View execution information when debugging a flow."
+weight: 30
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/exceptions-viewer.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/exceptions-viewer.md
new file mode 100644
index 000000000..757b64244
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/exceptions-viewer.md
@@ -0,0 +1,63 @@
+---
+title: "Exceptions Viewer"
+linkTitle: "Exceptions Viewer"
+description: "View details of any exceptions that occur when debugging a flow."
+weight: 40
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Exceptions Viewer shows details of any [exceptions][What is an Exception?] when debugging the [flow][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Exceptions Viewer.png" title="Exceptions Viewer" >}}
+
+In addition to a detailed description of the exception, the exception may include an Inner Exception, which details a previous exception that led to this exception being raised. Some exceptions may contain multiple, nested Inner Exceptions.
+
+The exact format of the Exception Object depends on the exception raised. All Exception Objects have:
+
+* Exception Type – The type of the exception.
+* Message – The description of the exception.
+* HelpLink - A hyperlink to further information relating to the exception.
+
+## Actions
+
+### View Exception
+
+Select the Exception tab on the Right Panel to view all the exceptions raised while debugging the flow. If the [execution][What is an Execution?] is stopped, all the exception messages will be discarded.
+
+See the [Exceptions Viewer][Exceptions Viewer tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* The text displayed in the Exceptions Viewer cannot be copied to the clipboard.
+
+## See Also
+
+### Related Concepts
+
+* [Exceptions][]
+* [Executions][]
+* [Flows][]
+
+### Related Tutorials
+
+* [Exceptions Viewer][Exceptions Viewer tutorial]
+
+[Variables Viewer]: {{< ref "#variables-viewer" >}}
+[Variables Details Viewer]: {{< ref "#variables-details-viewer" >}}
+
+[Right Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Exceptions Viewer tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.ExceptionsViewer" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/overview.md
new file mode 100644
index 000000000..ef8c65b58
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/overview.md
@@ -0,0 +1,44 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Summary and anatomy of the Execution Viewer."
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Execution Viewer consists of two tabs to allow viewing [variable][What is a Variable?] values and details of any [exceptions][What is an Exception?] when debugging a [flow][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Execution Viewer.png" title="Execution Viewer" >}}
+
+The two tabs of the Execution Viewer are always available in the right panel when debugging a flow and are:
+
+ * Variables (default) - displays the [Variables Viewer][] showing the values of the [variables][What is a Variable?] when debugging the flow.
+ * Exceptions - displays the [Exceptions Viewer][] showing details of any exceptions when debugging the flow.
+
+## See Also
+
+### Related Concepts
+
+* [Exceptions][]
+* [Flows][]
+* [Variables][]
+
+### Related Tutorials
+
+* [Execution Viewer][Execution Viewer tutorial]
+
+[Execution Viewer tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.ExecutionViewer" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesViewer" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/variables-viewer.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/variables-viewer.md
new file mode 100644
index 000000000..566ce6aa5
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/execution-viewer/variables-viewer.md
@@ -0,0 +1,85 @@
+---
+title: "Variables Viewer"
+linkTitle: "Variables Viewer"
+description: "View the values of variables when debugging a flow."
+weight: 30
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Variables Viewer displays the values of the [variables][What is a Variable?] when debugging a [flow][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Variables Viewer.png" title="Variables Viewer" >}}
+
+The Variables Viewer consists of two sections:
+
+* [Variables List][] - displaying the variables in [scope][Variable Scopes] for the flow [execution][What is an Execution?] that is being debugged.
+* [Variable Details Viewer][] - displaying the name, type and full value of the variable selected in the Variables List.
+
+### Variables List
+
+The Variables List, at the top of the Variables Viewer, shows the current values of variables containing basic data types, and the type and structure of collection and complex data type values.
+
+In addition to developer defined variables, {{% ctx %}} [built-in variables][Execution Context] will also be displayed.
+
+### Variable Details Viewer
+
+The Variable Details Viewer, at the bottom of the Variables Viewer, shows the name and data type of the variable selected in the [Variables List][] as well as it's value, in JSON format. Any collection or complex data types will be expanded to display their contents.
+
+It is important to note that the Variables Viewer can only display a [JSON][] representation of the variable's value.
+
+## Actions
+
+### View Variables in Variables List
+
+To view the variables that have been assigned a value, including a NULL value, that are currently in scope, select the execution in the [Executions Grid][] and click on the Variables tab.
+
+Variables that have not been assigned a value or are out of [scope][Variable Scopes] will not be displayed.
+
+See the [Variables Viewer][Variables Viewer tutorial] tutorial for a step-by-step guide.
+
+### View the Detail of a Variable
+
+Click on a variable in the Variables List to view the variable's name, it's data type, and value displayed in JSON format. The detail of collection and complex data types will only be expanded in JSON format in the Variable Details Viewer if the execution is paused.
+
+See the [Variables Viewer][Variables Viewer tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Variables with a [Dictionary][Dictionary Tkey] data type where TKey is not the [String][] data type will have their keys displayed as the [ToString()][ToString] value for the data type.
+
+## See Also
+
+### Related Concepts
+
+* [Executions][]
+* [Flows][]
+* [Variables][]
+
+### Related Tutorials
+
+* [Variables Viewer][Variables Viewer tutorial]
+
+[Variables List]: {{< ref "#variables-list" >}}
+[Variable Details Viewer]: {{< ref "#variable-details-viewer" >}}
+
+[Dictionary TKey]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[Execution Context]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.ExecutionContext" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Executions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[JSON]: {{< url path="Cortex.Reference.Glossary.F-J.Json" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[ToString]: {{< url path="MSDocs.DotNet.Api.System.Object.ToString" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Viewer tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.VariablesViewer" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is an Execution?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/overview.md
new file mode 100644
index 000000000..eac61a820
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/overview.md
@@ -0,0 +1,59 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Summary and anatomy of the Right Panel."
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Right Panel consists of multiple tabs to allow viewing and editing of [block properties][What is a Block Property?], as well as viewing [variable][What is a Variable?] values, details of any [exceptions][What is an Exception?], and setting [input variables][Flow Input Variable] used when debugging a [flow][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Right Panel.png" title="Right Panel" >}}
+
+* In `View`, `Edit` or `Debug Edit` mode, the following tabs are available:
+
+ * Properties (default) - displays the [Property Editor][] showing the properties of the currently selected [block][What is a Block?].
+ * Settings - displays the [Settings Editor][] to set the values of the input variables used when debugging the flow.
+
+* In `Debug` mode, the following tabs are available:
+
+ * Variables (default) - displays the [Variables Viewer][] showing the values of the [variables][What is a Variable?] when debugging the flow.
+ * Exceptions - displays the [Exceptions Viewer][] showing details of any exceptions when debugging the flow.
+ * Settings - displays the [Settings Editor][] to set the values of the input variables used when debugging the flow.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Exceptions][]
+* [Executions][]
+* [Flows][]
+* [Variables][]
+
+### Related Tutorials
+
+* [Right Panel][Right Panel tutorial]
+
+[Right Panel tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Flow Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Property Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.PropertyEditor" >}}
+[Settings Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.SettingsEditor" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesViewer" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is an Exception?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/property-editor.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/property-editor.md
new file mode 100644
index 000000000..e26404f54
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/property-editor.md
@@ -0,0 +1,154 @@
+---
+title: "Property Editor"
+linkTitle: "Property Editor"
+description: "View and edit the properties of a selected block."
+weight: 20
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Property Editor allows viewing and editing of the [properties][What is a Block Property?] for the currently selected [block][What is a Block?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Property Editor.png" title="Property Editor" >}}
+
+The Property Editor is automatically opened when a block on the [workspace][What is a Workspace?] is selected; however, it may be manually opened, or closed, any time by clicking the Open/Close handle or resized by dragging the handle left or right.
+
+Every block has one or more properties, which can be one of the following types:
+
+* [Free format literal text][literaltext]
+* [Input][]
+* [Output][]
+* [InputOutput][]
+
+Each property type, apart from the free format literal text, uses one or more [property editors][]. If a property can be configured by using more than one editor type, clicking on the editor symbol will cycle though the alternative editor types; if only one editor type is available the editor symbol will be greyed out.
+
+To the right of the property name, the ellipsis enables the developer to change the data type that this input property accepts.
+
+### Property Types
+
+#### Free Format Literal Text
+
+The free format literal text property is used for the description of the block.
+
+#### Input
+
+[Input properties][] supply a value to be used by a block and use either:
+
+* The Expression Editor {{< image src="/images/Flow Editor - Expression Editor.png" >}}
+* The Variable Editor {{< image src="/images/Flow Editor - Variable Editor.png" >}}
+* The Literal Editor {{< image src="/images/Flow Editor - Literal Editor.png" >}}
+
+#### Output
+
+[Output properties][] store a value generated by a block and use either:
+
+* The Expression Editor {{< image src="/images/Flow Editor - Expression Editor.png" >}}
+* The Variable Editor {{< image src="/images/Flow Editor - Variable Editor.png" >}}
+
+#### InputOutput
+
+[InputOutput properties][] supply a value to be used by a block and then store a value generated by the block to the same variable and only use the Variable Editor {{< image src="/images/Flow Editor - Variable Editor.png" >}}.
+
+### Show Advanced Properties
+
+Many objects have [advanced properties][], which do not need to be configured for normal use and are normally hidden to avoid clutter. The {{< image src="/images/Flow Editor - Show Advanced Properties.png" >}} icon displays them and then changes to {{< image src="/images/Flow Editor - Hide Advanced Properties.png" >}} to hide them.
+
+### Add Variables
+
+The {{< image src="/images/Flow Editor - Add Variables.png" >}} icon enables the bulk creation of any undeclared [variables][What is a Variable?] referenced in any of the block’s properties Variable Editor. This provides for an easy way to declare new variables used by the block without having to individually create them in the [Variables Grid][].
+
+### Help
+
+The {{< image src="/images/Flow Editor - Help.png" >}} icon opens a new browser tab displaying the relevant help documentation in the Product Portal.
+
+## Actions
+
+### Display Property Type and Data Type
+
+To display the Property Type and expected Data Type, hover the cursor over the Property name.
+
+See the [Property Editor][Property Editor tutorial] tutorial for a step-by-step guide.
+
+### Change Property Editor
+
+Click on the icon to the left of the Property name to cycle through the available Property Editors for that property. They will cycle in the following order:
+
+* The Variable Editor {{< image src="/images/Flow Editor - Variable Editor.png" >}}
+* The Expression Editor {{< image src="/images/Flow Editor - Expression Editor.png" >}}
+* The Literal Editor {{< image src="/images/Flow Editor - Literal Editor.png" >}}
+
+{{% alert title="Note" %}}Not all properties allow use of all three Property Editors.{{% /alert %}}
+
+See the [Property Editor][Property Editor tutorial] tutorial for a step-by-step guide.
+
+### Change Property Data Type
+
+Click the {{< image src="/images/Flow Editor - Change Data Type.png" >}} icon to the right of the property name to change the input property data type; the property name will change to display an editable field containing the current data type set for this property. Edit or delete the existing data type to reveal a drop-down menu of all possible data types allowable for this property; select the desired data type.
+
+{{% alert title="Note" %}}Not all input properties allow their data types to be changed.{{% /alert %}}
+
+### Show/Hide Advanced Properties
+
+Click the {{< image src="/images/Flow Editor - Show Advanced Properties.png" >}} icon on the Property Editor’s title bar to show the selected block's advanced properties.
+
+When advanced properties are visible, click the {{< image src="/images/Flow Editor - Hide Advanced Properties.png" >}} icon to hide them.
+
+See the [Property Editor][Property Editor tutorial] tutorial for a step-by-step guide.
+
+### Add Variables
+
+Click the {{< image src="/images/Flow Editor - Add Variables.png" >}} icon on the Property Editor’s title bar to automatically create all uncreated variables that have been referenced in the any of the block's properties that are using the Variable Editor.
+
+This action will also open the Variables Grid in the [Bottom Panel][].
+
+See the [Property Editor][Property Editor tutorial] tutorial for a step-by-step guide.
+
+### Help
+
+Click the {{< image src="/images/Flow Editor - Help.png" >}} icon on the Property Editor’s title bar to open the Product Portal in a new browser tab. The new tab will display information that is relevant to this block.
+
+See the [Property Editor][Property Editor tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* The Expression Editor does not support the creation of undeclared variables using the Add Variables feature.
+* Although it is possible to attempt to change the input data type for the Expression and Variable Editors, the data type of the C# expression entered into the Expression Editor or the Variable specified in the Variable Editor will define the actual data type.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][]
+* [Variables][]
+* [Workspaces][]
+
+### Related Tutorials
+
+* [Property Editor][Property Editor tutorial]
+
+[literaltext]: {{< ref "#free-format-literal-text" >}}
+[input]: {{< ref "#input" >}}
+[inputoutput]: {{< ref "#inputoutput" >}}
+[output]: {{< ref "#output" >}}
+
+[advanced properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Bottom Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MainDoc" >}}
+[Input properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[property editors]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.MainDoc" >}}
+[Property Editor tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.PropertyEditor" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/settings-editor.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/settings-editor.md
new file mode 100644
index 000000000..af3381616
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flow-editor/right-panel/settings-editor.md
@@ -0,0 +1,70 @@
+---
+title: "Settings Editor"
+linkTitle: "Settings Editor"
+description: "Set the values of input variables used when debugging a flow."
+weight: 40
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Settings Editor enables the developer to set the values of the [input variables][Flow Input Variable] used when debugging a [flow][What is a Flow?].
+
+## Anatomy
+
+{{< figure src="/images/Flow Editor - Settings Editor.png" title="Settings Editor" >}}
+
+Every input variable has a corresponding [Expression Editor][], each of which MUST be set, otherwise an [error][Messages Grid] will be raised when a flow is attempted to be debugged.
+
+If an input variable has been assigned a default value, the value configured in the Settings Editor will overwrite the value. If an input variable's default value is to be used, the default value must be copied into the relevant Expression Editor. Null and typed null values (e.g. `null` and `(Structure)null`) are permitted.
+
+When any of the `Name`, `Is Input Variable?` or `Scope` properties are changed for a variable in the [Variables Grid][], the Settings Editor will show a warning message to update the input variables.
+
+## Actions
+
+### Make a variable an Input Variable
+
+To make a variable an input variable, open the [Variables Grid][] by selecting on the Variables tab. Double-click on the `Is Input Variable?` property of the variable that is to be made an input variable, and tick the checkbox that appears in the field.
+
+See the [Settings Editor][Settings Editor tutorial] tutorial for a step-by-step guide.
+
+### Update Input Variables in Settings Editor
+
+When a new input variable is [defined][], or an existing input variable is renamed, deleted, has it's `Is Input Variable?` changed to false or has it's [scope][Variable Scopes] changed, it is necessary to update the Input Variables in the Settings Editor. To do this, click on the `Update Inputs` button on the Settings Editor.
+
+See the [Settings Editor][Settings Editor tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* A value must be entered for each input variable even if that variable has a default value assigned.
+
+## See Also
+
+### Related Concepts
+
+* [Flows][]
+* [Messages][]
+* [Variables][]
+
+### Related Tutorials
+
+* [Settings Editor][Settings Editor tutorial]
+
+[defined]: {{< ref "#make-a-variable-an-input-variable" >}}
+[Variables Viewer]: {{< ref "#variables-viewer" >}}
+[Variables Details Viewer]: {{< ref "#variables-details-viewer" >}}
+
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Flow Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
+[Settings Editor tutorial]: {{< url path="Cortex.Tutorials.Development.FlowEditor.RightPanel.SettingsEditor" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flows-explorer.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flows-explorer.md
new file mode 100644
index 000000000..5bf17e072
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/dev/flows-explorer.md
@@ -0,0 +1,163 @@
+---
+title: "Flows Explorer"
+linkTitle: "Flows Explorer"
+description: "Browse, search and create flows and groups in {{% ctx %}} Gateway."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Flows Explorer allows developers to browse and search the hierarchical structure of [flows][What is a Flow?] and extend the hierarchy by creating new groups and flows.
+
+## Anatomy
+
+{{< figure src="/images/Flows Explorer.png" title="Flows Explorer" >}}
+
+Flows are stored in a hierarchical structure to enable the logical grouping of related flows. The hierarchical structure is created using groups. A group is a container that can hold flows or child groups.
+
+There can be multiple top-level or root groups. Top-level groups can only be created by users that have the `Admin` role. Lower-level groups and flows may be created by users that have the `Dev` role, and the appropriate [`Edit`][Edit Permissions] permissions set in [Studio Authorisation][].
+
+Groups that have `Edit` permissions set for users will display a {{< image src="/images/Flows Explorer - Create New.png" >}} icon in the group’s title bar, allowing those users to create flows and groups in this group; any flows or groups created in this way will inherit the same [`View`][View Permissions] & `Edit` permissions as the group from which they were created by default.
+
+## Actions
+
+### Create a Group
+
+To create a new group:
+
+* [Browse][] to the group in the hierarchy where the new group is to be created.
+* Click the {{< image src="/images/Flows Explorer - Create New.png" >}} icon on the group’s title bar and select `Group` from the dropdown menu.
+* On the *Create a new Group* dialog:
+
+ * Enter a `Name` for the new group. A valid name cannot start or end with a full stop, or contain any of the following characters \ / ? * : | " < > &. The name does not have to be unique in the platform but must be unique at the level it is being created at.
+ * The `Description` is optional but can be any literal text.
+ * The `Permission Groups`, by default, are inherited from the parent group. The inherited `View`/`Edit` permissions may be altered by clicking on the {{< image src="/images/Flows Explorer - Expand Permissions.png" >}} icon, to the right of the label, to reveal the inherited permissions. Tick, or untick, the appropriate `View`/`Edit` permissions for the LDAP Groups listed.
+
+* Click OK to create the new group.
+
+See the [Create a Group][Create a Group tutorial] tutorial for a step-by-step guide.
+
+### Create a Process
+
+To create a new Process:
+
+* [Browse][] to the group in the hierarchy where the new Process is to be created.
+* Click the {{< image src="/images/Flows Explorer - Create New.png" >}} icon on the group’s title bar and select `Process` from the dropdown menu.
+* On the *Create a new Process* dialog:
+
+ * Enter a `Name` for the new Process. A valid name can only contain alphabetic, numeric and hyphen characters, whitespace is not allowed. The name must be unique in the platform.
+ * The `Description` is optional but can be any literal text.
+ * Select the appropriate `Template` for the Process:
+
+ * `Blank` - This template will create an empty Process, which can then be developed as required.
+
+ See the [Create a Process from a blank template][Create Process Blank tutorial] tutorial for a step-by-step guide.
+ * `BPMN XML` -This template will provide a text box, into which the XML definition of a Process in BPMN may be inserted. The Process can then be extended manually if required.
+
+ See the [Create a Process using a BPMN XML template][Create Process BPMN tutorial] tutorial for a step-by-step guide.
+ * `Natural Language` - This template will provide a text box, into which the developer can describe the Process to be automated in a natural language. Using the power of AI, a Process will be automatically created, which can then be extended manually if required.
+
+ See the [Create a Process using a Natural Language Template][Create Process Natural tutorial] tutorial for a step-by-step guide.
+
+ * The `Permission Groups`, by default, are inherited from the parent group. The inherited `View`/`Edit` permissions may be altered by clicking on the {{< image src="/images/Flows Explorer - Expand Permissions.png" >}} icon, to the right of the label, to reveal the inherited permissions. Tick, or untick, the appropriate `View`/`Edit` permissions for the LDAP Groups listed.
+
+* Click OK to create the new Process.
+
+### Create an Activity
+
+To create a new Activity:
+
+* [Browse][] to the group in the hierarchy where the new Activity is to be created.
+* Click the {{< image src="/images/Flows Explorer - Create New.png" >}} icon on the group’s title bar and select `Activity` from the dropdown menu.
+* On the *Create a new Activity* dialog:
+
+ * Enter a `Name` for the new Activity. A valid name can only contain alphabetic, numeric and hyphen characters, whitespace is not allowed. The name must be unique in the platform.
+ * The `Description` is optional but can be any literal text.
+ * The `Permission Groups`, by default, are inherited from the parent group. The inherited `View`/`Edit` permissions may be altered by clicking on the {{< image src="/images/Flows Explorer - Expand Permissions.png" >}} icon, to the right of the label, to reveal the inherited permissions. Tick, or untick, the appropriate `View`/`Edit` permissions for the LDAP Groups listed.
+
+* Click OK to create the new Activity.
+
+See the [Create an Activity][Create an Activity tutorial] tutorial for a step-by-step guide.
+
+### Browse
+
+To browse the hierarchy of flows and groups:
+
+* Click on the `Dev` charm on the left of Gateway to open the Flows Explorer and display the top-level groups.
+* Click on a Group, indicated by the {{< image src="/images/Flows Explorer - Group Icon.png" >}} icon before its name, to navigate into that group and display its contents; the parent groups will be displayed as leaves to the right of the Flows Explorer.
+* Click on a Process or Activity name to open the flow in the [Main Panel][] of the [Flow Editor][].
+
+To navigate back up the hierarchy, click on a group leaf to the right of the Flows Explorer to navigate directly to that group.
+
+See the [Browsing the Flows Explorer][Browsing the Flows Explorer tutorial] tutorial for a step-by-step guide.
+
+### Search
+
+To search the hierarchy, start typing into the search box. All the flow names that contain the search characters will be displayed; the more characters entered, the more refined the search will be, displaying fewer flows. The search is a fuzzy search, which means that even misspelt flow names should identify the intended matching flows. The scope of the search is restricted to the current group and all it's descendant groups.
+
+See the [Searching the Flows Explorer][Searching the Flows Explorer tutorial] tutorial for a step-by-step guide.
+
+### Rename a Flow
+
+Both Processes and Activities may be renamed; it is not possible to rename groups.
+
+To rename a Process or Activity:
+
+* Right-click on the name and select `Rename` from the context menu.
+
+ {{% alert title="Note" %}}You must have `Edit` permissions on the Process or Activity to access the `Rename` menu option.{{% /alert %}}
+
+* On the *Rename Flow* dialog:
+
+ * Enter a new `Name` for the flow. A valid name can only contain alphabetic, numeric and hyphen characters, whitespace is not allowed. The name must be unique in the platform.
+ * Click `OK` to change the name of the flow.
+
+See the [Rename a Flow][Rename a Flow tutorial] tutorial for a step-by-step guide.
+
+## Remarks
+
+### Known Limitations
+
+* Groups cannot be renamed
+* When performing a search in Flows Explorer, only the matching flows are displayed without any indication of the flow’s location.
+* A search in the Flows Explorer only searches the current group or child groups for matching flows. To search the entire hierarchy, the search must be undertaken at the top-level of the Flows Explorer.
+* The data entered into the Description field when creating a new group or flow is not surfaced anywhere in the platform.
+* When creating a new item, only the existing permissions may be changed. It is not possible to add additional permissions.
+
+## See Also
+
+### Related Concepts
+
+* [Flows][]
+
+### Related Tutorials
+
+* [Create a Group][Create a Group tutorial]
+* [Create a Process from a blank template][Create Process Blank tutorial]
+* [Create a Process using a BPMN XML template][Create Process BPMN tutorial]
+* [Create a Process using a Natural Language Template][Create Process Natural tutorial]
+* [Create an Activity][Create an Activity tutorial]
+* [Browsing the Flows Explorer][Browsing the Flows Explorer tutorial]
+* [Searching the Flows Explorer][Searching the Flows Explorer tutorial]
+* [Rename a Flow][Rename a Flow tutorial]
+
+[Browsing the Flows Explorer tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.Browse" >}}
+[Create a Group tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.CreateGroup" >}}
+[Create Process Blank tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.CreateProcessBlank" >}}
+[Create Process Natural tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.CreateProcessNatural" >}}
+[Create Process BPMN tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.CreateProcessBpmnXml" >}}
+[Create an Activity tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.CreateActivity" >}}
+[Rename a Flow tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.Rename" >}}
+[Searching the Flows Explorer tutorial]: {{< url path="Cortex.Tutorials.Development.FlowsExplorer.Search" >}}
+
+[Browse]: {{< ref "#browse">}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Edit Permissions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.Edit" >}}
+[Flow Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainDoc" >}}
+[Main Panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.MainDoc" >}}
+[Studio Authorisation]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.MainDoc" >}}
+[View Permissions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.StudioAuthorisation.View" >}}
+[What is a Flow?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/_index.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/_index.md
new file mode 100644
index 000000000..db7181883
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Ops"
+linkTitle: "Ops"
+description: "This section includes user guides related to the Operations section in {{% ctx %}} Gateway."
+weight: 20
+---
diff --git a/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/overview.md b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/overview.md
new file mode 100644
index 000000000..544eb8ad7
--- /dev/null
+++ b/content/en/docs/2026.3/Guides/user-guides/user-interfaces/gateway/ops/overview.md
@@ -0,0 +1,140 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "The current platform status and flow execution statistics."
+weight: 10
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Operations Overview shows a synopsis of the current platform status, and a graphical display of the flow execution statistics.
+
+## Anatomy
+
+{{< figure src="/images/Operations Overview.png" title="Operations Overview" >}}
+
+### Current Status
+
+#### License Consumption
+
+This tile displays the current License Consumption. The {{< image src="/images/GoTo.png" >}} icon navigates to the License Consumption feature, to provide visibility of the license consumption by group and by flow.
+
+#### Cluster Health
+
+This tile displays the current Cluster Health. The {{< image src="/images/GoTo.png" >}} icon opens a new browser tab and navigates to the [Service Fabric Explorer][], which allows [inspection and management][Check Cluster Health] of the cluster.
+
+{{% alert title="Note" %}}
+To view Service Fabric Explorer, the Service Fabric client certificate must be {{< ahref path="Cortex.Faqs.ImportClientCertificate.MainDoc" title="imported" >}} on the machine from which you are browsing.
+{{% /alert %}}
+
+#### Running Executions
+
+This tile displays the current number of [Running Executions][], including any child executions. The {{< image src="/images/GoTo.png" >}} icon navigates to the [Package Management][Package Management] feature, to provide a breakdown of running executions by package version and flow.
+
+### Filters
+
+#### Package Names
+
+This filter displays the packages that have executions during the [Time Period][] selected. One or more packages can be selected, the default is `All`.
+
+If a Package Name is selected that does not contain a previously selected Package Version, then all Package Versions for the selected Package Name will be automatically selected.
+
+#### Package Versions
+
+This filter displays the package versions that have executions during the [Time Period][] selected. One or more package versions can be selected, the default is `All`. This filter will only include package versions for the packages selected in the [Package Names][] filter.
+
+If a Package Version is selected that does not contain a previously selected flow, then all flows for the selected Package Version will be automatically selected.
+
+#### Flows
+
+This filter displays the flows that have executions during the [Time Period][] selected. One or more flows can be selected, the default is `All`. This filter will only include flows for the package versions and packages selected in the [Package Versions][] and [Package Names][] filters.
+
+{{% alert title="Note" %}}
+When any of the above filters are changed, a `Refresh Data` button will appear that must be clicked to apply the filters.
+{{% /alert %}}
+
+#### Time Period
+
+This filter displays a set of pre-defined periods to filter the data by:
+
+| Time Period | Start of Period | End of Period | Interval |
+|---------------------|------------------------------|-----------------------|----------|
+| Today (so far) | Today at 00:00:00 | Now | 1 hour |
+| Yesterday | Yesterday at 00:00:00 | Yesterday at 23:59:59 | 1 hour |
+| This week (so far) | Monday at 00:00:00 | Now | 1 hour |
+| Last day | Now - 24 hours | Now | 1 hour |
+| Last 2 days | Now - 48 hours | Now | 1 hour |
+| Last 3 days | Now - 72 hours | Now | 1 hour |
+| Last 5 days | Now - 120 hours | Now | 1 hour |
+| Last 7 days | Now - 168 hours | Now | 1 hour |
+| This month (so far) | 1st day of month at 00:00:00 | Now | 1 day |
+| Last month | Now - 1 month | Now | 1 day |
+| Last 3 months | Now - 3 months | Now | 1 day |
+| Last 6 months | Now - 6 months | Now | 1 day |
+| Last 12 months | Now - 12 months | Now | 1 day |
+
+#### Refresh
+
+This button, located next to the [Time Period][] filter, refreshes the filters and then the data displayed.
+
+### Flows
+
+#### Success Rate
+
+Success Rate represents the percentage of flow executions that completed successfully.
+
+The value displayed is the average success rate for the selected time period, rounded down to the nearest whole percentage point.
+
+The graph displays the trend of flow execution success rate during the selected time period.
+
+#### Completed
+
+Completed represents the number of flow executions that completed successfully or errored.
+
+The value displayed is the total number of flow executions that completed during the selected time period.
+
+The graph displays the trend of completed flow executions during the selected time period.
+
+#### Errored
+
+Errored represents the number of flow executions that errored; this includes executions that have been stopped in the [Running Executions] tab of the [Package Management][] feature.
+
+The value displayed is the total number of flow executions that errored during the selected time period.
+
+The graph displays the trend of errored flow executions during the selected time period.
+
+#### Duration
+
+Duration represents the time taken in seconds for flow executions to have completed successfully or errored.
+
+The value displayed is the average flow execution duration during the selected time period.
+
+The graph displays the trend of average flow execution duration during the selected time period.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Tutorials
+
+* [Using the Operations Overview][Using the Operations Overview tutorial]
+
+[Package Names]: {{< ref "#package-names" >}}
+[Package Versions]: {{< ref "#package-versions" >}}
+[Time Period]: {{< ref "#time-period" >}}
+
+[Check Cluster Health]: {{< url path="Cortex.Faqs.CheckClusterHealth.MainDoc">}}
+[Package Management]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.Overview.MainDoc" >}}
+[Running Executions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.RunningExecutions" >}}
+[Service Fabric Explorer]: {{< url path="Cortex.Reference.Glossary.P-T.ServiceFabricExplorer" >}}
+[Using the Operations Overview tutorial]: {{< url path="Cortex.Tutorials.Operations.Overview.UseOperationsOverview" >}}
diff --git a/content/en/docs/2026.3/Overview/_index.md b/content/en/docs/2026.3/Overview/_index.md
new file mode 100644
index 000000000..dc2f8f95f
--- /dev/null
+++ b/content/en/docs/2026.3/Overview/_index.md
@@ -0,0 +1,87 @@
+---
+title: "Overview"
+linkTitle: "Overview"
+description: "Find out what the {{% ctx %}} platform is, what it can do, and how you can get started?"
+weight: 2
+---
+
+## What is {{% ctx %}}?
+
+### Low-code automation
+
+{{% ctx %}} is a **[low-code][Gateway]**, **automation and orchestration platform**, that enables organisations to graphically **capture** and **automate** anything from simple **tasks**, to interactive **workflows**, to complex IT and business **processes** that span the entire organisation.
+
+### Enterprise-grade
+
+Evolved from process and control engineering for mission-critical environments, {{% ctx %}} provides **enterprise-grade** functionality to cover the **full automation lifecycle**; enabling **rapid delivery** of automation **[on-premise][]** or in the **cloud**, from inception to production, **without** the need for **software development experience**.
+
+### Built for everyone
+
+{{% ctx %}} is being **built for everyone**, not just software developers, with the goal of **removing barriers** to entry and putting your people at the heart of your automation.
+
+### Comprehensive functionality
+
+With a **[comprehensive set of functionality][Blocks]** and interfaces with **3rd party systems** available **out-of-the-box**, it's **[quick and easy to get started][Getting Started]** on your automation journey.
+
+## What can it do?
+
+### Deliver quickly
+
+Using {{% ctx %}}, global organisations have been able to **increase** their **capacity, velocity, quality, efficiency, agility** and **transform** their business and IT **operations in months**.
+
+### For diverse sets of use cases
+
+{{% ctx %}} has been deployed for a diverse set of **[use cases][]**, including:
+
+* Lights out **monitoring** and **management** of fixed-line telephony networks
+* Data center **provisioning**
+* **Patching** of servers
+* IT service **diagnostics**
+* **Swivel chair** operations
+* Employee **onboarding** and offboarding
+* Animal welfare **compliance checks**
+
+### Resulting in successful outcomes
+
+{{% ctx %}} has resulted in many successful **outcomes**, including:
+
+* Increased **revenue**
+* Increased **profit**
+* **Redeployment** of skilled employees
+* Reduction in **MTTR**
+* Reduction in **average handling time**
+
+### Accelerate your digital transformation
+
+Wherever you are on your automation journey and whatever you are trying to achieve, small or large, simple or complex, {{% ctx %}} can help **accelerate a successful transformation of your operations**.
+
+## How do I get started?
+
+|||
+|-----------|-------------|
+|**[Getting Started][Getting Started]**|Install {{% ctx %}} and start your automation journey today.|
+|**[Guides][]**|Learn how to use the various components that make up the {{% ctx %}} platform.|
+|**[Tutorials][]**|Explore all of the tutorials for the {{% ctx %}} platform.|
+|**[Reference][]**|Browse through the reference documentation, including details about APIs, blocks, data types, exceptions.|
+|**[FAQs][]**|Find the answers to your questions.|
+|**[Videos][]**|View a range of videos about the {{% ctx %}} platform, automation, strategies and methodologies, as well as industry specific content.|
+|**[Engage With Us][Engage With Us]**|Let us help you to get started by reaching out to us. |
+
+[FAQs]: {{< url path="Cortex.Faqs.MainDoc" >}}
+
+[Getting Started]: {{< url path="Cortex.GettingStarted.MainDoc" >}}
+[on-premise]: {{< url path="Cortex.GettingStarted.OnPremise.MainDoc" >}}
+
+[Guides]: {{< url path="Cortex.Guides.MainDoc" >}}
+[Gateway]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.MainDoc" >}}
+
+[Tutorials]: {{< url path="Cortex.Tutorials.MainDoc" >}}
+
+[Reference]: {{< url path="Cortex.Reference.MainDoc" >}}
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[Engage With Us]: {{< url path="Cortex.Website.EngageWithUs.MainDoc" >}}
+
+[use cases]: {{< url path="Cortex.Website.UseCases.MainDoc" >}}
+
+[Videos]: {{< url path="Cortex.YouTube.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/_index.md b/content/en/docs/2026.3/Reference/APIs/_index.md
new file mode 100644
index 000000000..18e702570
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/_index.md
@@ -0,0 +1,7 @@
+---
+title: "APIs"
+linkTitle: "APIs"
+description: "This section includes all reference documentation for APIs."
+weight: 10
+outOfSupport: true
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-gateway/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-gateway/_index.md
new file mode 100644
index 000000000..d9bbeaffa
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-gateway/_index.md
@@ -0,0 +1,8 @@
+---
+title: "CORTEX Gateway"
+linkTitle: "CORTEX Gateway"
+description: "This section includes all reference documentation for the APIs exposed by {{% ctx %}} Gateway."
+weight: 1
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/_index.md
new file mode 100644
index 000000000..43e353e18
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/_index.md
@@ -0,0 +1,6 @@
+---
+title: "CORTEX Applications"
+linkTitle: "CORTEX Applications"
+description: "This section includes all reference documentation for the APIs exposed by the {{% ctx %}} platform."
+weight: 300
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/_index.md
new file mode 100644
index 000000000..35082aa64
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Core Application"
+linkTitle: "Core Application"
+description: "This section includes all reference documentation for the APIs exposed by the Core Application."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/_index.md
new file mode 100644
index 000000000..e144554b5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Services"
+linkTitle: "Services"
+description: "This section includes all reference documentation for the APIs exposed by the Core Application Services."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/api-gateway-service/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/api-gateway-service/_index.md
new file mode 100644
index 000000000..c41056aee
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/api-gateway-service/_index.md
@@ -0,0 +1,8 @@
+---
+title: "API Gateway Service"
+linkTitle: "API Gateway Service"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by the API Gateway Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/licence-management-service/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/licence-management-service/_index.md
new file mode 100644
index 000000000..d83ca2a97
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/licence-management-service/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Licence Management Service"
+linkTitle: "Licence Management Service"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by the Licence Management Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/package-management-service/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/package-management-service/_index.md
new file mode 100644
index 000000000..0e21b7ced
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/package-management-service/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Package Management Service"
+linkTitle: "Package Management Service"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by the Package Management Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/provisioning-service/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/provisioning-service/_index.md
new file mode 100644
index 000000000..3d4300820
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/core-application/services/provisioning-service/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Provisioning Service"
+linkTitle: "Provisioning Service"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by the Provisioning Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/_index.md
new file mode 100644
index 000000000..9e97eb21a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Execution Application"
+linkTitle: "Execution Application"
+description: "This section includes all reference documentation for the APIs exposed by the Execution Application."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/_index.md
new file mode 100644
index 000000000..058daec0c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Services"
+linkTitle: "Services"
+description: "This section includes all reference documentation for the APIs exposed by the Execution Application Services."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/execution-service/_index.md b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/execution-service/_index.md
new file mode 100644
index 000000000..b25716e02
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/APIs/cortex-innovation/execution-application/services/execution-service/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Execution Service"
+linkTitle: "Execution Service"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by the Execution Service."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/_index.md
new file mode 100644
index 000000000..00ec618d3
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Dictionaries"
+linkTitle: "Dictionaries"
+description: "Blocks related to working with Dictionaries."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/_index.md
new file mode 100644
index 000000000..b2b2a09a8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Add Item(s)"
+linkTitle: "Add Item(s)"
+description: "Add an item or multiple items to a dictionary."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/add-item-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/add-item-with-key-block-3.md
new file mode 100644
index 000000000..698f90fda
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/add-item/add-item-with-key-block-3.md
@@ -0,0 +1,172 @@
+---
+title: "Add Item With Key"
+linkTitle: "Add Item With Key"
+description: "Adds an item to a Dictionary with the specified key."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_AddItem_AddItemWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds an [Item][Item Property] to a [Dictionary][Dictionary Property] with the specified [Key][Key Property].
+
+## Examples
+
+### Add an Item to an empty Dictionary
+
+This example will add `1` to `{}` with a key of `"Key1"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Item][Item Property] | `($)Item`, with value `1` | `($)Item` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `1` to `{}` with a key of `"Key1"` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 1}
+```
+
+***
+
+### Add an Item to a Dictionary
+
+This example will add `2` to `{"Key1" : 1}` with a key of `"Key2"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key2"` | `($)Key` is a variable of type [String][] |
+| [Item][Item Property] | `($)Item`, with value `2` | `($)Item` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `2` to `{"Key1" : 1}` with a key of `"Key2"` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 1, "Key2" : 2}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] where the [Item][Item Property] is added with the specified [Key][Key Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] to add the [Item][Item Property] with.
+
+Keys cannot be `null` and must be unique within a dictionary, as they are used to lookup the item they correspond to.
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Item
+
+The [Item][Item Property] to be added to the [Dictionary][Dictionary Property] with the specified [Key][Key Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Item][Item Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [KeyPresentException][] | Thrown when an item with the specified [Key][Key Property] is already present. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[KeyPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeyPresentException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/_index.md
new file mode 100644
index 000000000..18d91f743
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Contains Item(s)"
+linkTitle: "Contains Item(s)"
+description: "Check if an item or multiple items are contained in a dictionary."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-and-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-and-value-block-3.md
new file mode 100644
index 000000000..03feaaaa9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-and-value-block-3.md
@@ -0,0 +1,192 @@
+---
+title: "Contains Item With Key And Value"
+linkTitle: "Contains Item With Key And Value"
+description: "Checks if a Dictionary contains at least one item with the specified key and matching the specified value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_ContainsItem_ContainsItemWithKeyAndValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Dictionary][Dictionary Property] contains at least one item with the specified [Key][Key Property] and matching the specified [Value][Value Property].
+
+## Examples
+
+### Dictionary contains item with Key and Value
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with the key `"Key1"` and value `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains one item with the key `Key1` and value `1`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Dictionary does not contain item with Key and Value
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with the key `"Key1"` and value `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value`, with value `10` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains one item with the key `"Key1"`, but its value is not `10`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to check whether it contains at least one item with the specified [Key][Key Property] and matching [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] to check for matching items.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Value
+
+The [Value][Value Property] to check for matching items.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Item
+
+The result of the contains item check.
+
+If [Dictionary][Dictionary Property] contains at least one item with the specified [Key][Key Property] and matching [Value][Value Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItem` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Contains Item][ContainsItem Property] property is set to `false`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[Value Property]: {{< ref "#value" >}}
+[ContainsItem Property]: {{< ref "#contains-item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-block-3.md
new file mode 100644
index 000000000..bb89338fe
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-block-3.md
@@ -0,0 +1,167 @@
+---
+title: "Contains Item With Key"
+linkTitle: "Contains Item With Key"
+description: "Checks if a Dictionary contains at least one item with the specified key."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_ContainsItem_ContainsItemWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Dictionary][Dictionary Property] contains at least one item with the specified [Key][Key Property].
+
+## Examples
+
+### Dictionary contains item with Key
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with the key `"Key1"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains one item with the key `Key1`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Dictionary does not contain item with Key
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with the key `"Key10"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key10"` | `($)Key` is a variable of type [String][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` does not contain any items with the key `"Key10"`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to check whether it contains at least one item with the specified [Key][Key Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] to check for matching items.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Item
+
+The result of the contains item check.
+
+If [Dictionary][Dictionary Property] contains at least one item with the specified [Key][Key Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItem` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Contains Item][ContainsItem Property] property is set to `false`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[ContainsItem Property]: {{< ref "#contains-item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-value-block-3.md
new file mode 100644
index 000000000..b10ad335f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-item-with-value-block-3.md
@@ -0,0 +1,169 @@
+---
+title: "Contains Item With Value"
+linkTitle: "Contains Item With Value"
+description: "Checks if a Dictionary contains at least one item matching the specified value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_ContainsItem_ContainsItemWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Dictionary][Dictionary Property] contains at least one item matching [Value][Value Property].
+
+## Examples
+
+### Dictionary contains item with Value
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains the value `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains two items with the value `1`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Dictionary does not contain item with Value
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains the value `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `10` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` does not contain any items with the value `10`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to check whether it contains at least one item matching the specified [Value][Value Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] to check for matching items.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Item
+
+The result of the contains item check.
+
+If [Dictionary][Dictionary Property] contains at least one item matching the specified [Value][Value Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItem` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Contains Item][ContainsItem Property] property is set to `false`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+[ContainsItem Property]: {{< ref "#contains-item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-keys-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-keys-block-3.md
new file mode 100644
index 000000000..28239d5a6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-keys-block-3.md
@@ -0,0 +1,174 @@
+---
+title: "Contains Items With Keys"
+linkTitle: "Contains Items With Keys"
+description: "Checks if a Dictionary contains at least one item with each of the specified keys."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_ContainsItem_ContainsItemsWithKeysBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Dictionary][Dictionary Property] contains at least one item with each of the specified [Keys][Keys Property].
+
+## Examples
+
+### Dictionary contains items with Keys
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with each of the keys in `["Key1", "Key2", "Key3"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Keys][Keys Property] | `($)Keys`, with value `["Key1", "Key2", "Key3"]` | `($)Keys` is a variable of type [IEnumerable][]<[String][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item matching each of the values in `["Key1", "Key2", "Key3"]`; it contains one item with the key `"Key1"`, one item with the key `"Key2"` and one item with the key `"Key3"`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Dictionary does not contain items with Keys
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item with each of the keys in `["Key1", "Key2", "Key3", "Key10"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Keys][Keys Property] | `($)Keys`, with value `["Key1", "Key2", "Key3", "Key10"]` | `($)Keys` is a variable of type [IEnumerable][]<[String][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` does not contain at least one item matching each of the values in `["Key1", "Key2", "Key3"]`; it contains one item with the key `"Key1"`, one item with the key `"Key2"` and one item with the key `"Key3"`, but no items with the key `"Key10"`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to check whether it contains at least one item with each of the specified [Keys][Keys Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Keys
+
+The [Keys][Keys Property] to check for matching items.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TKey][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Items
+
+The result of the contains items check.
+
+If [Dictionary][Dictionary Property] contains at least one item with each of the specified [Keys][Keys Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItems` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentNullException][] | Thrown when any key in [Keys][Keys Property] is `null`|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Keys][Keys Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Empty Keys
+
+If [Keys][Keys Property] is empty (i.e. `[]`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Keys Property]: {{< ref "#keys" >}}
+[ContainsItems Property]: {{< ref "#contains-items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[ArgumentNullException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentNullException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-values-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-values-block-3.md
new file mode 100644
index 000000000..f15ec6f13
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/contains-item/contains-items-with-values-block-3.md
@@ -0,0 +1,170 @@
+---
+title: "Contains Items With Values"
+linkTitle: "Contains Items With Values"
+description: "Checks if a Dictionary contains at least one item matching each of the specified values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_ContainsItem_ContainsItemsWithValuesBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Dictionary][Dictionary Property] contains at least one item matching each of the specified [Values][Values Property].
+
+## Examples
+
+### Dictionary contains items with Values
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item matching each of the values in `[1, 2, 3]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item matching each of the values in `[1, 2, 3]`; it contains two items with the value `1`, two items with the value `2` and two items with the value `3`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Dictionary does not contain items with Values
+
+This example will check whether `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` contains at least one item matching each of the values in `[1, 2, 3, 10]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3, 10]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` does not contain at least one item matching each of the values in `[1, 2, 3, 10]`; it contains two items with the value `1`, two items with the value `2` and two items with the value `3`, but no items with the value `10`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to check whether it contains at least one item matching each of the specified [Values][Values Property].
+
+Items are considered matching if they have a value matching one of the specified [Values][Values Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Values
+
+The [Values][Values Property] to check for matching items.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Items
+
+The result of the contains items check.
+
+If [Dictionary][Dictionary Property] contains at least one item matching each of the specified [Values][Values Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItems` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Values][Values Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Values Property]: {{< ref "#values" >}}
+[ContainsItems Property]: {{< ref "#contains-items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/_index.md
new file mode 100644
index 000000000..ec65cd646
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Count(s) of Items"
+linkTitle: "Get Count(s) of Items"
+description: "Get the count(s) of items in a dictionary."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-all-items-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-all-items-block-3.md
new file mode 100644
index 000000000..ea5be2e69
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-all-items-block-3.md
@@ -0,0 +1,116 @@
+---
+title: "Get Count Of All Items"
+linkTitle: "Get Count Of All Items"
+description: "Gets the count of all items in a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetCount_GetCountOfAllItemsBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Count][Count Property] of all items in a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Get Count of all items in a Dictionary
+
+This example will get the count of all items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Count][Count Property] | `($)Count`, with no value | `($)Count` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+Getting the count of all items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Count` being updated to the following:
+
+```json
+6
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get the [Count][Count Property] of all items for.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Count
+
+The [Count][Count Property] of all items in [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Count][Count Property] property is set to `0`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-items-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-items-with-value-block-3.md
new file mode 100644
index 000000000..149466793
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-count-of-items-with-value-block-3.md
@@ -0,0 +1,146 @@
+---
+title: "Get Count Of Items With Value"
+linkTitle: "Get Count Of Items With Value"
+description: "Gets the count of items in a Dictionary with the specified value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetCount_GetCountOfItemsWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Count][Count Property] of items in a [Dictionary][Dictionary Property] with the specified [Value][Value Property].
+
+## Examples
+
+### Get Count of items in a Dictionary with a Value
+
+This example will get the count of items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` with the value `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Count][Count Property] | `($)Count`, with no value | `($)Count` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+Getting the count of items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` with the value `1` results in the variable `($)Count` being updated to the following:
+
+```json
+2
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get the [Count][Count Property] of items with the specified [Value][Value Property] for.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] items must match to be included in the [Count][Count Property].
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Count
+
+The [Count][Count Property] of items in [Dictionary][Dictionary Property] with the specified [Value][Value Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`), the variable specified in the [Count][Count Property] property is set to `0`.
+
+### No items matching Value
+
+If [Dictionary][Dictionary Property] does not contain items matching the specified [Value][Value Property], the variable specified in the [Count][Count Property] property is set to `0`.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-counts-of-items-with-values-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-counts-of-items-with-values-block-3.md
new file mode 100644
index 000000000..a95a114ef
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-count/get-counts-of-items-with-values-block-3.md
@@ -0,0 +1,151 @@
+---
+title: "Get Counts Of Items With Values"
+linkTitle: "Get Counts Of Items With Values"
+description: "Gets the counts of items in a Dictionary matching each of the specified values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetCount_GetCountsOfItemsWithValuesBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Counts][Counts Property] of items in a [Dictionary][Dictionary Property] matching each of the specified [Values][Values Property].
+
+## Examples
+
+### Get Counts of items in a Dictionary matching each of the Values
+
+This example will get the counts of items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` matching each of the values `[1, 2, 3]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Counts][Counts Property] | `($)Counts`, with no value | `($)Counts` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+Getting the counts of items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` matching each of the values `[1, 2, 3]` results in the variable `($)Counts` being updated to the following:
+
+```json
+[2, 2, 2]
+```
+
+The counts of items matching each value are added to `($)Counts` at the same [index][Indexes] the value is in `($)Values`. In this example, there are two items matching the first value `1`, two items matching the second value `2` and two items matching the third value `3`, resulting in `($)Counts` being set to `[2, 2, 2]`.
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get the [Counts][Counts Property] of items matching each of the specified [Values][Values Property] for.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Values
+
+The [Values][Values Property] items must match to be included in the [Counts][Counts Property].
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Counts
+
+The [Counts][Counts Property] of items in [Dictionary][Dictionary Property] matching each of the specified [Values][Values Property].
+
+For each value in [Values][Values Property], [Counts][Counts Property] will have a corresponding item whose value is the count of items in [Dictionary][Dictionary Property] matching the value.
+
+I.e. The count of items matching the first value in [Values][Values Property] will be saved as the first item in [Counts][Counts Property]; the count of items matching the second value in [Values][Values Property] will be saved as the second item in [Counts][Counts Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[Int32][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Counts` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Values][Values Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`), the variable specified in the [Counts][Counts Property] property is set to empty (i.e. `[]`).
+
+### No items matching a specified value in Values
+
+If [Dictionary][Dictionary Property] does not contain items matching one of the specified [Values][Values Property], `0` is written to the corresponding item in [Counts][Counts Property] for that value.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Values Property]: {{< ref "#values" >}}
+[Counts Property]: {{< ref "#counts" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/_index.md
new file mode 100644
index 000000000..9a60abac1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Item(s)"
+linkTitle: "Get Item(s)"
+description: "Get an item or multiple items from a dictionary."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-all-items-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-all-items-block-3.md
new file mode 100644
index 000000000..694e4c54b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-all-items-block-3.md
@@ -0,0 +1,116 @@
+---
+title: "Get All Items"
+linkTitle: "Get All Items"
+description: "Gets all items from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetItem_GetAllItemsBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Get all [Items][Items Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Get all items from a Dictionary
+
+This example will get all items in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[Int32][]> |
+
+#### Result
+
+Getting all items from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Items` being updated to the following:
+
+```json
+[1, 2, 3, 3, 2, 1]
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get all [Items][Items Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Items
+
+The [Items][Items Property] in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) the variable specified in the [Items][Items Property] property is set to an empty [IList][]<[TItem][]> (i.e. `[]`).
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-item-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-item-with-key-block-3.md
new file mode 100644
index 000000000..ca6314730
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-item-with-key-block-3.md
@@ -0,0 +1,202 @@
+---
+title: "Get Item With Key"
+linkTitle: "Get Item With Key"
+description: "Gets the specified occurrence of an item with the given key from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetItem_GetItemWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the specified [Occurrence][Occurrence Property] of an [Item][Item Property] with the given [Key][Key Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Get the first Occurrence of an Item with a Key from a Dictionary
+
+This example will attempt to get the first occurrence of an item with the key `"Key1"` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [Int32][]) |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means get the first occurrence; `2` means second etc.
+
+Attempting to get the first occurrence of an item with the key `"Key1"` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Item` being updated to the following:
+
+```json
+1
+```
+
+***
+
+### Get the last Occurrence of an Item with a Key from a Dictionary
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to get an occurrence of item with that key.
+
+This example will illustrate this, by attempting to get the last occurrence of an item with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [Int32][]) |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1` means get the last occurrence; `-2` means second last etc.
+
+Attempting to get the last occurrence of an item with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}` results in the variable `($)Item` being updated to the following:
+
+```json
+10
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get the specified [Occurrence][Occurrence Property] of [Item][Item Property] with the given [Key][Key Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the [Item][Item Property] to get must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching [Item][Item Property] to get from the [Dictionary][Dictionary Property].
+
+Items are considered matching if they have the specified [Key][Key Property].
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Item
+
+The specified [Occurrence][Occurrence Property] of [Item][Item Property] with the given [Key][Key Property] from [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Item` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [KeyNotPresentException][] | Thrown when the [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [OccurrenceNotPresentException][] | Thrown when the specified [Occurrence][Occurrence Property] of [Item][Item Property] with the given [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Occurrences
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[KeyNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeyNotPresentException.MainDoc" >}}
+[OccurrenceNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Collections.OccurrenceNotPresentException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-items-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-items-with-key-block-3.md
new file mode 100644
index 000000000..e72a62b5c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-item/get-items-with-key-block-3.md
@@ -0,0 +1,145 @@
+---
+title: "Get Items With Key"
+linkTitle: "Get Items With Key"
+description: "Gets all items with the given key from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetItem_GetItemsWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets all [Items][Items Property] with the given [Key][Key Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Get all Items with a Key from a Dictionary
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to get all items with that key.
+
+This example will illustrate this, by attempting to get all items with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[Int32][]> |
+
+#### Result
+
+Attempting to get all items with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}` results in the variable `($)Items` being updated to the following:
+
+```json
+[1, 10]
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get all [Items][Items Property] with the given [Key][Key Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the [Items][Items Property] to get must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Items
+
+All [Items][Items Property] with the given [Key][Key Property] in [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [KeyNotPresentException][] | Thrown when the [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[KeyNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeyNotPresentException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/_index.md
new file mode 100644
index 000000000..d0504c442
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Key(s)"
+linkTitle: "Get Key(s)"
+description: "Get a key or multiple keys from a dictionary."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/get-all-keys-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/get-all-keys-block-3.md
new file mode 100644
index 000000000..3486432e2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/get-key/get-all-keys-block-3.md
@@ -0,0 +1,116 @@
+---
+title: "Get All Keys"
+linkTitle: "Get All Keys"
+description: "Gets all keys from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_GetKey_GetAllKeysBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Get all [Keys][Keys Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Get all keys from a Dictionary
+
+This example will get all keys in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Keys][Keys Property] | `($)Keys`, with no value | `($)Keys` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Getting all keys from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Keys` being updated to the following:
+
+```json
+["Key1", "Key2", "Key3", "Key4", "Key5", "Key6"]
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to get all [Keys][Keys Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Keys
+
+The [Keys][Keys Property] in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TKey][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Keys` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) the variable specified in the [Keys][Keys Property] property is set to an empty [IList][]<[TKey][]> (i.e. `[]`).
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Keys Property]: {{< ref "#keys" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/_index.md
new file mode 100644
index 000000000..a516b96dd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Remove Item(s)"
+linkTitle: "Remove Item(s)"
+description: "Remove an item or multiple items from a dictionary."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-all-items-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-all-items-block-3.md
new file mode 100644
index 000000000..cbcf93b83
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-all-items-block-3.md
@@ -0,0 +1,121 @@
+---
+title: "Remove All Items"
+linkTitle: "Remove All Items"
+description: "Removes all items from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveAllItemsBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove all items from an empty Dictionary
+
+This example will attempt to remove all items from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+
+#### Result
+
+Attempting to remove all items from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove all items from a Dictionary
+
+This example will remove all items from `{"Key1" : 1, "Key2" : 2}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+
+#### Result
+
+Removing all items from `{"Key1" : 1, "Key2" : 2}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] where all items are removed from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-key-block-3.md
new file mode 100644
index 000000000..5fc75bc2f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-key-block-3.md
@@ -0,0 +1,216 @@
+---
+title: "Remove Item With Key"
+linkTitle: "Remove Item With Key"
+description: "Removes the specified occurrence of an item with the given key from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Occurrence][Occurrence Property] of an item with the given [Key][Key Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove the first Occurrence of an item with a Key from an empty Dictionary
+
+This example will attempt to remove the first occurrence of an item with the key `"Key1"` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove the first occurrence of an item with the key `"Key1"` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove the first Occurrence of an item with a Key from a Dictionary
+
+This example will attempt to remove the first occurrence of an item with the key `"Key1"` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means remove the first occurrence; `2` means second etc.
+
+Attempting to remove the first occurrence of an item with the key `"Key1"` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}
+```
+
+***
+
+### Remove the last Occurrence of an item with a Key from a Dictionary
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to remove any occurrence of item with that key.
+
+This example will illustrate this, by attempting to remove the last occurrence of an item with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1` means remove the last occurrence; `-2` means second last etc.
+
+Attempting to remove the last occurrence of an item with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```csharp
+{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove the specified [Occurrence][Occurrence Property] of item with the given [Key][Key Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the item to remove must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to remove from the [Dictionary][Dictionary Property].
+
+Items are considered matching if they have the specified [Key][Key Property].
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Occurrences
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### No items with given Key, or Occurrence is not present
+
+If [Dictionary][Dictionary Property] does not contain items with the given [Key][Key Property] or the specified [Occurrence][Occurrence Property] is not present, there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-value-block-3.md
new file mode 100644
index 000000000..aa9ff35fb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-item-with-value-block-3.md
@@ -0,0 +1,213 @@
+---
+title: "Remove Item With Value"
+linkTitle: "Remove Item With Value"
+description: "Removes the specified occurrence of an item matching a value from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Occurrence][Occurrence Property] of an item matching a [Value][Value Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove the first Occurrence of an item matching a Value from an empty Dictionary
+
+This example will attempt to remove the first occurrence of an item matching the value `1` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove the first occurrence of an item matching the value `1` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove the first Occurrence of an item matching a Value from a Dictionary
+
+This example will attempt to remove the first occurrence of an item matching the value `1` from `{"Key1" : 1, "Key2" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means remove the first occurrence; `2` means second etc.
+
+Attempting to remove the first occurrence of an item matching the value `1` from `{"Key1" : 1, "Key2" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key2" : 1}
+```
+
+***
+
+### Remove the last Occurrence of an item matching a Value from a Dictionary
+
+This example will attempt to remove the last occurrence of an item matching the value `1` from `{"Key1" : 1, "Key2" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means remove the last occurrence; `-2` means second last etc.
+
+Attempting to remove the last occurrence of an item matching the value `1` from `{"Key1" : 1, "Key2" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 1}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove the specified [Occurrence][Occurrence Property] of matching item from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] the item to remove must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to remove from the [Dictionary][Dictionary Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Occurrences
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### No items matching Value, or Occurrence is not present
+
+If [Dictionary][Dictionary Property] does not contain items matching the specified [Value][Value Property] or the specified [Occurrence][Occurrence Property] is not present, there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-key-block-3.md
new file mode 100644
index 000000000..70c10e14b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-key-block-3.md
@@ -0,0 +1,162 @@
+---
+title: "Remove Items With Key"
+linkTitle: "Remove Items With Key"
+description: "Removes all items with the given key from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemsWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items with the given [Key][Key Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove all items with a Key from an empty Dictionary
+
+This example will attempt to remove all items with the key `"Key1"` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Attempting to remove all items with the key `"Key1"` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove all items with a Key from a Dictionary
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to remove all items with that key.
+
+This example will illustrate this, by attempting to remove all items with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+
+#### Result
+
+Attempting to remove all items with the key `[1]` from `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```csharp
+{[2] : 2, [3] : 3, [3] : 3, [2] : 2}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove all items with the given [Key][Key Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the items to remove must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### No items with given Key
+
+If [Dictionary][Dictionary Property] does not contain items with the given [Key][Key Property] there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-keys-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-keys-block-3.md
new file mode 100644
index 000000000..e91bcb477
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-keys-block-3.md
@@ -0,0 +1,167 @@
+---
+title: "Remove Items With Keys"
+linkTitle: "Remove Items With Keys"
+description: "Removes all items with any of the given keys from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemsWithKeysBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items with any of the given [Keys][Keys Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove all items with any of the given Keys from an empty Dictionary
+
+This example will attempt to remove all items with any of the given keys in `["Key1", "Key2"]` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Keys][Keys Property] | `($)Keys`, with value `["Key1", "Key2"]` | `($)Keys` is a variable of type [IDictionary][]<[String][]> |
+
+#### Result
+
+Attempting to remove all items with any of the given keys in `["Key1", "Key2"]` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove all items with any of the given Keys from a Dictionary
+
+This example will attempt to remove all items with any of the given keys in `["Key1", "Key2"]` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Keys][Keys Property] | `($)Keys`, with value `["Key1", "Key2"]` | `($)Keys` is a variable of type [IDictionary][]<[String][]> |
+
+#### Result
+
+Attempting to remove all items with any of the given keys in `["Key1", "Key2"]` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove all items with any of the given [Keys][Keys Property] from.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Keys
+
+The [Keys][Keys Property] the items to remove must have one of.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TKey][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentNullException][] | Thrown when any key in [Keys][Keys Property] is `null`|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Keys][Keys Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### Empty Keys
+
+If [Keys][Keys Property] is empty (i.e. `[]`) there are no keys to match, therefore nothing can be removed and no operation is performed.
+
+### No items with one of the given Keys
+
+If [Dictionary][Dictionary Property] does not contain items with one of the given [Keys][Keys Property], there is nothing to remove for that key.
+
+### No items with any of the given Keys
+
+If [Dictionary][Dictionary Property] does not contain items with any of the given [Keys][Keys Property] there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Keys Property]: {{< ref "#keys" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[ArgumentNullException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentNullException" >}}
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-value-block-3.md
new file mode 100644
index 000000000..3775948b6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-value-block-3.md
@@ -0,0 +1,161 @@
+---
+title: "Remove Items With Value"
+linkTitle: "Remove Items With Value"
+description: "Removes all items matching a value from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemsWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items matching a [Value][Value Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove all items matching a Value from an empty Dictionary
+
+This example will attempt to remove all items matching the value `1` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove all items matching the value `1` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove all items matching a Value from a Dictionary
+
+This example will attempt to remove all items matching the value `1` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove all items matching the value `1` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove all matching items from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] the items to remove must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### No items matching Value
+
+If [Dictionary][Dictionary Property] does not contain items matching the specified [Value][Value Property], there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-values-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-values-block-3.md
new file mode 100644
index 000000000..37712ef00
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/remove-item/remove-items-with-values-block-3.md
@@ -0,0 +1,164 @@
+---
+title: "Remove Items With Values"
+linkTitle: "Remove Items With Values"
+description: "Removes all items matching one of the specified values from a Dictionary."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_RemoveItem_RemoveItemsWithValuesBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items matching one of the specified [Values][Values Property] from a [Dictionary][Dictionary Property].
+
+## Examples
+
+### Remove all items matching one of the specified Values from an empty Dictionary
+
+This example will attempt to remove all items matching one of the values `[1, 2]` from `{}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{}` | `($)Dictionary` is a variable of type [IDictionary][]<[dynamic][], [dynamic][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to remove all items matching one of the values `[1, 2]` from `{}` results in no operation, as there is nothing to remove. Therefore, the variable `($)Dictionary` remains:
+
+```json
+{}
+```
+
+***
+
+### Remove all items matching one of the specified Values from a Dictionary
+
+This example will attempt to remove all items matching one of the values `[1, 2]` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to remove all items matching one of the values `[1, 2]` from `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key3" : 3, "Key4" : 3}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to remove all matching items from.
+
+Items are considered matching if they have one of the specified [Values][Values Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Values
+
+The [Values][Values Property] the items to remove must match one of.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Values][Values Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to remove, so no operation is performed.
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`) there are no values to match, therefore nothing can be removed and no operation is performed.
+
+### No items matching a specified value in Values
+
+If [Dictionary][Dictionary Property] does not contain items matching one of the specified [Values][Values Property], there is nothing to remove for that value.
+
+### No items matching Values
+
+If [Dictionary][Dictionary Property] does not contain items matching any of the specified [Values][Values Property], there is nothing to remove, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Values Property]: {{< ref "#values" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/_index.md
new file mode 100644
index 000000000..56379859a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Set Item(s)"
+linkTitle: "Set Item(s)"
+description: "Set an item or multiple items in a dictionary to a new value."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-all-items-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-all-items-block-3.md
new file mode 100644
index 000000000..67b6571ce
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-all-items-block-3.md
@@ -0,0 +1,123 @@
+---
+title: "Set All Items"
+linkTitle: "Set All Items"
+description: "Sets all items in a Dictionary to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetAllItemsBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets all items in a [Dictionary][Dictionary Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set all items in a Dictionary to a New Value
+
+This example will set all items in `{"Key1" : 1, "Key2" : 2}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+
+#### Result
+
+Setting all items in `{"Key1" : 1, "Key2" : 2}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set all items in.
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### New Value
+
+The [New Value][NewValue Property] to set all items in [Dictionary][Dictionary Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to set, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-key-block-3.md
new file mode 100644
index 000000000..6d984389a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-key-block-3.md
@@ -0,0 +1,211 @@
+---
+title: "Set Item With Key"
+linkTitle: "Set Item With Key"
+description: "Sets the specified occurrence of an item with the given key in a Dictionary to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the specified [Occurrence][Occurrence Property] of an item with the given [Key][Key Property] in a [Dictionary][Dictionary Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the first Occurrence of an item with a Key in a Dictionary to a New Value
+
+This example will attempt to set the first occurrence of an item with the key `"Key1"` in `{"Key1" : 1, "Key2" : 2}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `"Key1"` | `($)Key` is a variable of type [String][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means set the first occurrence; `2` means second etc.
+
+Attempting to set the first occurrence of an item with the key `"Key1"` in `{"Key1" : 1, "Key2" : 2}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 1}
+```
+
+***
+
+### Set the last Occurrence of an item with a Key in a Dictionary to a New Value
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to set an occurrence of item with that key.
+
+This example will illustrate this, by attempting to set the last occurrence of an item with the key `[1]` in `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means set the last occurrence; `-2` means second last etc.
+
+Attempting to set the last occurrence of an item with the key `[1]` in `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```csharp
+{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set the specified [Occurrence][Occurrence Property] of item with the given [Key][Key Property] in.
+
+Items are considered matching if they have the specified [Key][Key Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the item to set must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set the specified [Occurrence][Occurrence Property] of item with the given [Key][Key Property] in [Dictionary][Dictionary Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of item with the given [Key][Key Property] to set in the [Dictionary][Dictionary Property].
+
+Items are considered matching if they have the specified [Key][Key Property].
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [KeyNotPresentException][] | Thrown when the [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [OccurrenceNotPresentException][] | Thrown when the specified [Occurrence][Occurrence Property] of item with the given [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Occurrences
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[KeyNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeyNotPresentException.MainDoc" >}}
+[OccurrenceNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Collections.OccurrenceNotPresentException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-value-block-3.md
new file mode 100644
index 000000000..bbd0a76a2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-item-with-value-block-3.md
@@ -0,0 +1,206 @@
+---
+title: "Set Item With Value"
+linkTitle: "Set Item With Value"
+description: "Sets the specified occurrence of an item matching a value in a Dictionary to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the specified [Occurrence][Occurrence Property] of an item matching a [Value][Value Property] in a [Dictionary][Dictionary Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the first Occurrence of an item matching a Value in a Dictionary to a New Value
+
+This example will attempt to set the first occurrence of an item matching the value `1` in `{"Key1" : 1, "Key2" : 1}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means set the first occurrence; `2` means second etc.
+
+Attempting to set the first occurrence of an item matching the value `1` in `{"Key1" : 1, "Key2" : 1}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 1}
+```
+
+***
+
+### Set the last Occurrence of an item matching a Value in a Dictionary to a New Value
+
+This example will attempt to set the last occurrence of an item matching the value `1` in `{"Key1" : 1, "Key2" : 1}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means set the last occurrence; `-2` means second last etc.
+
+Attempting to set the last occurrence of an item matching the value `1` in `{"Key1" : 1, "Key2" : 1}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 1, "Key2" : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set the specified [Occurrence][Occurrence Property] of matching item in.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] the item to set must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set the specified [Occurrence][Occurrence Property] of matching item in [Dictionary][Dictionary Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to set in the [Dictionary][Dictionary Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] or [New Value][NewValue Property] are `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Occurrences
+
+Unlike lists, dictionaries do not have a defined order. This means the nth occurrence is determined by the underlying Microsoft .Net implementation; this is not published and could change if the algorithm were to change.
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to set, so no operation is performed.
+
+### No items matching Value, or Occurrence is not present
+
+If [Dictionary][Dictionary Property] does not contain items matching the specified [Value][Value Property] or the specified [Occurrence][Occurrence Property] is not present, there is nothing to set, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-key-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-key-block-3.md
new file mode 100644
index 000000000..132557d01
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-key-block-3.md
@@ -0,0 +1,155 @@
+---
+title: "Set Items With Key"
+linkTitle: "Set Items With Key"
+description: "Sets all items with the given key in a Dictionary to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemsWithKeyBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets all items with the given [Key][Key Property] in a [Dictionary][Dictionary Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Sets all items with a Key in a Dictionary to a New Value
+
+Typically keys are simple data types such as [String][], [Int32][], [Boolean][], and for these a dictionary cannot the same key value more than once. This is due to how the data type's object equality is implemented (two items are considered equal if they have the same value rather than being the same object reference).
+
+However, other data types such as [IList][]<[Int32][]> can also be used as keys. For these data types, object equality only considers two items equal if they are the same reference; it does not care about whether they have the same value. Therefore, it is possible to have the same key value more than once, and as a result you should be able to set all items with that key.
+
+This example will illustrate this, by attempting to set all items with the key `[1]` in `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[IList][]<[Int32][]>, [Int32][]> |
+| [Key][Key Property] | `($)Key`, with value `[1]` | `($)Key` is a variable of type [IList][]<[Int32][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to set all items with the key `[1]` in `{[1] : 1, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 1}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```csharp
+{[1] : 10, [2] : 2, [3] : 3, [3] : 3, [2] : 2, [1] : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set all items with the given [Key][Key Property] in.
+
+Items are considered matching if they have the specified [Key][Key Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Key
+
+The [Key][Key Property] the items to set must have.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+For information about what a key is, please see [Keys][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TKey][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set all items with the given [Key][Key Property] in [Dictionary][Dictionary Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [KeyNotPresentException][] | Thrown when the [Key][Key Property] is not present in the [Dictionary][Dictionary Property]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Key][Key Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether a key is already present, please see [Object Equality][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Key Property]: {{< ref "#key" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[KeyNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeyNotPresentException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-keys-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-keys-block-3.md
new file mode 100644
index 000000000..49388153c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-keys-block-3.md
@@ -0,0 +1,150 @@
+---
+title: "Set Items With Keys"
+linkTitle: "Set Items With Keys"
+description: "Sets all items with any of the given keys in a Dictionary to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemsWithKeysBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets all items with any of the given [Keys][Keys Property] in a [Dictionary][Dictionary Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set all items with any of the given Keys in a Dictionary to New Values
+
+This example will attempt to set all items with any of the keys `["Key1", "Key2"]` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `[10, 20]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Keys][Keys Property] | `($)Keys`, with value `["Key1", "Key2"]` | `($)Keys` is a variable of type [IEnumerable][]<[String][]> |
+| [NewValues][NewValues Property] | `($)NewValues`, with value `[10, 20]` | `($)NewValues` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to set all items with any of the keys `["Key1", "Key2"]` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `[10, 20]` respectively, results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 20, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set all matching items in.
+
+Items are considered matching if they have any of the specified [Keys][Keys Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+### Keys
+
+The [Keys][Keys Property] the items to set must have one of.
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TKey][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items with the corresponding [Keys][Keys Property] in [Dictionary][Dictionary Property] to.
+
+The number of items in [New Values][NewValues Property] must match the number of items in [Keys][Keys Property].
+
+[Dictionary][Dictionary Property] items with the first key in [Keys][Keys Property] will be set to the first value in [New Values][NewValues Property]; [Dictionary][Dictionary Property] items with the second key in [Keys][Keys Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentNullException][] | Thrown when any key in [Keys][Keys Property] is `null`|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [KeysNotPresentException][] | Thrown when any key in the [Keys][Keys Property] is not present in the [Dictionary][Dictionary Property]. |
+| [PropertyItemCountException][] | Thrown when the count of items in [Keys][Keys Property] and the count of items in [New Values][NewValues Property] are not the same, or neither contain any items. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Keys][Keys Property] or [New Values][NewValues Property] are `null`. |
+
+## Remarks
+
+### Key Equality
+
+For information and examples of how it is determined whether an item has a specified key, please see [Object Equality][].
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Keys Property]: {{< ref "#keys" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[ArgumentNullException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentNullException" >}}
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[KeysNotPresentException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.KeysNotPresentException.MainDoc" >}}
+[PropertyItemCountException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyItemCountException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-value-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-value-block-3.md
new file mode 100644
index 000000000..482d394a7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-value-block-3.md
@@ -0,0 +1,152 @@
+---
+title: "Set Items With Value"
+linkTitle: "Set Items With Value"
+description: "Sets all items matching a value in a Dictionary to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemsWithValueBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets all items matching a [Value][Value Property] in a [Dictionary][Dictionary Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set all items matching a Value in a Dictionary to a New Value
+
+This example will attempt to set all items matching the value `1` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to set all items matching the value `1` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `10` results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set all matching items in.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Value
+
+The [Value][Value Property] the items to set must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set all matching items in [Dictionary][Dictionary Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] or [New Value][NewValue Property] are `null` and [Dictionary][Dictionary Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to set, so no operation is performed.
+
+### No items matching Value
+
+If [Dictionary][Dictionary Property] does not contain items matching the specified [Value][Value Property], there is nothing to set, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Value Property]: {{< ref "#value" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-values-block-3.md b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-values-block-3.md
new file mode 100644
index 000000000..51771bfc0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Dictionaries/set-item/set-items-with-values-block-3.md
@@ -0,0 +1,160 @@
+---
+title: "Set Items With Values"
+linkTitle: "Set Items With Values"
+description: "Sets all items matching one of the specified values in a Dictionary to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Dictionaries_SetItem_SetItemsWithValuesBlock_3.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Set all items matching one of the specified [Values][Values Property] in a [Dictionary][Dictionary Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set all items matching one of the specified Values in a Dictionary to New Values
+
+This example will attempt to set all items matching one of the values `[1, 2]` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `[10, 20]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Dictionary][Dictionary Property] | `($)Dictionary`, with value `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` | `($)Dictionary` is a variable of type [IDictionary][]<[String][], [Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [NewValues][NewValues Property] | `($)NewValues`, with value `[10, 20]` | `($)NewValues` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to set all items matching one of the values `[1, 2]` in `{"Key1" : 1, "Key2" : 2, "Key3" : 3, "Key4" : 3, "Key5" : 2, "Key6" : 1}` to `[10, 20]` respectively, results in the variable `($)Dictionary` being updated to the following:
+
+```json
+{"Key1" : 10, "Key2" : 20, "Key3" : 3, "Key4" : 3, "Key5" : 20, "Key6" : 10}
+```
+
+***
+
+## Properties
+
+### Dictionary
+
+The [Dictionary][Dictionary Property] to set all matching items in.
+
+Items are considered matching if they have one of the specified [Values][Values Property].
+
+[Dictionary][Dictionary Property] can be any [IDictionary][]<[TKey][], [TItem][]>, where [TKey][] represents the type of keys used to lookup items in the [Dictionary][Dictionary Property], and [TItem][] represents the type of items in the [Dictionary][Dictionary Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[TKey][], [TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Dictionary` with no value |
+
+### Values
+
+The [Values][Values Property] the items to set must match one of.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items matching the corresponding [Values][Values Property] in [Dictionary][Dictionary Property] to.
+
+The number of items in [New Values][NewValues Property] must match the number of items in [Values][Values Property].
+
+[Dictionary][Dictionary Property] items matching the first value in [Values][Values Property] will be set to the first value in [New Values][NewValues Property]; [Dictionary][Dictionary Property] items matching the second value in [Values][Values Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyDictionaryException][] | Thrown when [Dictionary][Dictionary Property] is read-only. |
+| [DuplicateValueException][] | Thrown when [Values][Values Property] contains duplicate values. |
+| [PropertyItemCountException][] | Thrown when the count of items in [Values][Values Property] and the count of items in [New Values][NewValues Property] are not the same, or neither contain any items. |
+| [PropertyNullException][] | Thrown when [Dictionary][Dictionary Property] or [Values][Values Property] or [New Values][NewValues Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Dictionary
+
+If [Dictionary][Dictionary Property] is empty (i.e. `{}`) there is nothing to set, so no operation is performed.
+
+### No items matching a specified value in Values
+
+If [Dictionary][Dictionary Property] does not contain items matching one of the specified [Values][Values Property], there is nothing to set for that value.
+
+### No items matching Values
+
+If [Dictionary][Dictionary Property] does not contain items matching any of the specified [Values][Values Property], there is nothing to set, so no operation is performed.
+
+### Defining dictionaries using literal syntax
+
+For information about how to define dictionaries using literal syntax, see [Dictionary Literals][].
+
+### Defining dictionaries using expression syntax
+
+For information about how to define dictionaries using expression syntax, see [Create a Dictionary<TKey, TItem>][].
+
+### Dictionaries containing items with same data types vs different data types
+
+For information about the different types of dictionaries, including those that can contain only the same type of item, and those that can contain different types of item, see [Dictionaries][].
+
+[Dictionary Property]: {{< ref "#dictionary" >}}
+[Values Property]: {{< ref "#values" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Dictionary Literals]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DictionaryLiteral" >}}
+[Create a Dictionary<TKey, TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Dictionaries]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Dictionaries" >}}
+
+[TKey]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyDictionaryException]: {{< url path="Cortex.Reference.Exceptions.Dictionaries.CannotModifyReadOnlyDictionaryException.MainDoc" >}}
+[DuplicateValueException]: {{< url path="Cortex.Reference.Exceptions.Lists.DuplicateValueException.MainDoc" >}}
+[PropertyItemCountException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyItemCountException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/_index.md
new file mode 100644
index 000000000..517a2760b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Exceptions"
+linkTitle: "Exceptions"
+description: "Blocks related to handling and throwing Exceptions."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/_index.md
new file mode 100644
index 000000000..0b363a866
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Handle Block Exception(s)"
+linkTitle: "Handle Block Exception(s)"
+description: "Handle exceptions that occur during block execution."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-block.md
new file mode 100644
index 000000000..6e454a488
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-block.md
@@ -0,0 +1,132 @@
+---
+title: "Handle Block Exception"
+linkTitle: "Handle Block Exception"
+description: "Handles any exception thrown by the block it is connected to."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleBlockException_HandleBlockExceptionBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any [Exception][Exception Property] thrown by the block it is connected to.
+
+## Examples
+
+### Handle and save the Exception
+
+This example will handle any exception thrown by the block it is connected to; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any exception and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+***
+
+### Handle and discard the Exception from being saved
+
+This example will handle any exception thrown by the block it is connected to; not saving the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any exception, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+## Properties
+
+### Exception
+
+The [Exception][Exception Property] that is handled.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Chaining Exception handling blocks
+
+Blocks that handle block exceptions can be chained together so different exceptions can be handled separately. The blocks are listed below:
+
+* [Handle Block Exception Matching Message][]
+* [Handle Block Exception Matching Messages][]
+* [Handle Block Exception Matching Type Name][]
+* [Handle Block Exception Matching Type Names][]
+* [Handle Block Exception][]
+
+{{< figure src="/images/chaining-handle-block-exception-blocks.png" >}}
+
+Each block has an input port on its left-hand side and, with the exception of this block, also have an output port on their right-hand side; this is so they can pass any exception they do not handle to the next block.
+
+As this block handles any exception, it does not require the output port.
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more information about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Block Exception Matching Message]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessage.MainDoc" >}}
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-message-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-message-block.md
new file mode 100644
index 000000000..fe0107c23
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-message-block.md
@@ -0,0 +1,229 @@
+---
+title: "Handle Block Exception Matching Message"
+linkTitle: "Handle Block Exception Matching Message"
+description: "Handles any exception thrown by the block it is connected to that matches a specified message."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleBlockException_HandleBlockExceptionMatchingMessageBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any [Exception][Exception Property] thrown by the block it is connected to that matches a specified [Message][Message Property].
+
+## Examples
+
+### Handle Exception containing Message and save the Exception
+
+This example will handle any exception thrown by the block it is connected to that contains `"'List' is null"` in its `Message` property; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Message][Message Property] | `($)Message`, with value `"'List' is null"` | `($)Message` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any exception containing `"'List' is null"` in its `Message` property and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's `Message` property would be `"'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing `"'List' is null"` in their `Message`, this exception would be handled and saved to the `($)Exception` variable.
+
+***
+
+### Handle Exception containing Message and discard the Exception
+
+This example is the same as the example above, except it does not save the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Message][Message Property] | `($)Message`, with value `"'List' is null"` | `($)Message` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any exception containing `"'List' is null"` in its `Message` property, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's `Message` property would be `"'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing `"'List' is null"` in their `Message`, this exception would be handled, but because the `($)_` variable is used it will not be saved to the `($)Exception` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+### Exception does not contain Message
+
+This example will not handle an exception thrown by the block it is connected to that does not contain `"'List' is null"` in its `Message` property; the exception will be passed to the next exception handling block.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Message][Message Property] | `($)Message`, with value `"'List' is null"` | `($)Message` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that won't be set |
+
+#### Result
+
+The block will not handle any exception that does not contain `"'List' is null"` in its `Message` property; instead the exception will be passed to the next exception handling block.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to a read-only List, it would throw a [CannotModifyReadOnlyListException][] when executed.
+
+This exception's `Message` property would be `"'List' cannot be modified because it's read-only.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing `"'List' is null"` in their `Message`, this exception would not be handled.
+
+***
+
+## Properties
+
+### Message
+
+The [Message][Message Property] the [Exception's][Exception Property] `Message` property must contain for this block to handle the [Exception][Exception Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether [Message][Message Property] is contained in the [Exception's][Exception Property] `Message` property.
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Exception
+
+The [Exception][Exception Property] if it is handled by the block.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Message
+
+If [Message][Message Property] is `null` or empty (i.e. `""`), and the thrown exception's `Message` property is also `null` or empty (i.e. `""`), the exception will be handled and saved to the variable specified in the [Exception][Exception Property] property.
+
+### Chaining Exception handling blocks
+
+Blocks that handle block exceptions can be chained together so different exceptions can be handled separately. The blocks are listed below:
+
+* [Handle Block Exception Matching Message][]
+* [Handle Block Exception Matching Messages][]
+* [Handle Block Exception Matching Type Name][]
+* [Handle Block Exception Matching Type Names][]
+* [Handle Block Exception][]
+
+{{< figure src="/images/chaining-handle-block-exception-blocks.png" >}}
+
+Each block has an input port on its left-hand side and, with the exception of the [Handle Block Exception][] block, also have an output port on their right-hand side; this is so they can pass any exception they do not handle to the next block.
+
+As the [Handle Block Exception][] block handles any exception, it does not require the output port.
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[Message Property]: {{< ref "#message" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Block Exception Matching Message]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessage.MainDoc" >}}
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-messages-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-messages-block.md
new file mode 100644
index 000000000..bd37e0708
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-messages-block.md
@@ -0,0 +1,233 @@
+---
+title: "Handle Block Exception Matching Messages"
+linkTitle: "Handle Block Exception Matching Messages"
+description: "Handles any exception thrown by the block it is connected to that matches any message in a given set of messages."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleBlockException_HandleBlockExceptionMatchingMessagesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any [Exception][Exception Property] thrown by the block it is connected to that matches any message in a given set of [Messages][Messages Property].
+
+## Examples
+
+### Handle Exception containing any of the Messages and save the Exception
+
+This example will handle any exception thrown by the block it is connected to that contains any of the messages in `["'List' is null", "'List' is empty"]` in its `Message` property; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Messages][Messages Property] | `($)Messages`, with value `["'List' is null", "'List' is empty"]` | `($)Messages` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any exception containing any of the messages in `["'List' is null", "'List' is empty"]` in its `Message` property and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's `Message` property would be `"'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing any of `["'List' is null", "'List' is empty"]` in their `Message`, this exception would be handled and saved to the `($)Exception` variable.
+
+***
+
+### Handle Exception containing any of the Messages and discard the Exception
+
+This example is the same as the example above, except it does not save the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Messages][Messages Property] | `($)Messages`, with value `["'List' is null", "'List' is empty"]` | `($)Messages` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any exception containing any of the messages in `["'List' is null", "'List' is empty"]` in its `Message` property, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's `Message` property would be `"'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing any of `["'List' is null", "'List' is empty"]` in their `Message`, this exception would be handled, but because the `($)_` variable is used it will not be saved to the `($)Exception` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+### Exception does not contain any of the Messages
+
+This example will not handle an exception thrown by the block it is connected to that does not contain any of `["'List' is null", "'List' is empty"]` in its `Message` property; the exception will be passed to the next exception handling block.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Messages][Messages Property] | `($)Messages`, with value `["'List' is null", "'List' is empty"]` | `($)Messages` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that won't be set |
+
+#### Result
+
+The block will not handle any exception that does not contain any of `["'List' is null", "'List' is empty"]` in its `Message` property; instead the exception will be passed to the next exception handling block.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to a read-only List, it would throw a [CannotModifyReadOnlyListException][] when executed.
+
+This exception's `Message` property would be `"'List' cannot be modified because it's read-only.\r\nPlease click the HelpLink for more information on how to fix this."`; therefore as we are checking for exceptions containing any of `["'List' is null", "'List' is empty"]` in their `Message`, this exception would not be handled.
+
+***
+
+## Properties
+
+### Messages
+
+The [Messages][Messages Property] the [Exception's][Exception Property] `Message` property must contain any of for this block to handle the [Exception][Exception Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether any of the [Messages][Messages Property] are contained in the [Exception's][Exception Property] `Message` property.
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Exception
+
+The [Exception][Exception Property] if it is handled by the block.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [PropertyEmptyException][] | Thrown when [Messages][Messages Property] contains no items. |
+| [PropertyNullException][] | Thrown when [Messages][Messages Property] is `null`. |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Message in Messages
+
+If any message in [Messages][Messages Property] is `null` or empty (i.e. `""`), and the thrown exception's `Message` property is also `null` or empty (i.e. `""`), the exception will be handled and saved to the variable specified in the [Exception][Exception Property] property.
+
+### Chaining Exception handling blocks
+
+Blocks that handle block exceptions can be chained together so different exceptions can be handled separately. The blocks are listed below:
+
+* [Handle Block Exception Matching Message][]
+* [Handle Block Exception Matching Messages][]
+* [Handle Block Exception Matching Type Name][]
+* [Handle Block Exception Matching Type Names][]
+* [Handle Block Exception][]
+
+{{< figure src="/images/chaining-handle-block-exception-blocks.png" >}}
+
+Each block has an input port on its left-hand side and, with the exception of the [Handle Block Exception][] block, also have an output port on their right-hand side; this is so they can pass any exception they do not handle to the next block.
+
+As the [Handle Block Exception][] block handles any exception, it does not require the output port.
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[Messages Property]: {{< ref "#messages" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Block Exception Matching Message]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessage.MainDoc" >}}
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-name-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-name-block.md
new file mode 100644
index 000000000..83f461a9a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-name-block.md
@@ -0,0 +1,228 @@
+---
+title: "Handle Block Exception Matching Type Name"
+linkTitle: "Handle Block Exception Matching Type Name"
+description: "Handles any exception thrown by the block it is connected to that matches a specified type name."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleBlockException_HandleBlockExceptionMatchingTypeNameBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any [Exception][Exception Property] thrown by the block it is connected to that matches a specified [Type Name][TypeName Property].
+
+## Examples
+
+### Handle Exception matching Type Name and save the Exception
+
+This example will handle any exception thrown by the block it is connected to that contains `"PropertyNull"` in its fully qualified `TypeName`; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of type names.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Name][TypeName Property] | `($)TypeName`, with value `"PropertyNull"` | `($)TypeName` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any exception containing `"PropertyNull"` in its fully qualified `TypeName` and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Common.Property.PropertyNullException"`; therefore as we are checking for exceptions containing `"PropertyNull"` in their `TypeName`, this exception would be handled and saved to the `($)Exception` variable.
+
+***
+
+### Handle Exception matching Type Name and discard the Exception
+
+This example is the same as the example above, except it does not save the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of type names.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Name][TypeName Property] | `($)TypeName`, with value `"PropertyNull"` | `($)TypeName` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any exception containing `"PropertyNull"` in its fully qualified `TypeName`, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Common.Property.PropertyNullException"`; therefore as we are checking for exceptions containing `"PropertyNull"` in their `TypeName`, this exception would be handled, but because the `($)_` variable is used it will not be saved to the `($)Exception` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+### Exception does not match Type Name
+
+This example will not handle an exception thrown by the block it is connected to that does not contain `"PropertyNull"` in its fully qualified `TypeName`; the exception will be passed to the next exception handling block.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of type names.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Name][TypeName Property] | `($)TypeName`, with value `"PropertyNull"` | `($)TypeName` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that won't be set |
+
+#### Result
+
+The block will not handle any exception that does not contain `"PropertyNull"` in its fully qualified `TypeName`; instead the exception will be passed to the next exception handling block.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to a read-only List, it would throw a [CannotModifyReadOnlyListException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Lists.CannotModifyReadOnlyListException"`; therefore as we are checking for exceptions containing `"PropertyNull"` in their `TypeName`, this exception would not be handled.
+
+***
+
+## Properties
+
+### Type Name
+
+The [Type Name][TypeName Property] the [Exception's][Exception Property] fully qualified `TypeName` must contain for this block to handle the [Exception][Exception Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `null`) |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether [Type Name][TypeName Property] is contained in the [Exception's][Exception Property] fully qualified `TypeName`.
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Exception
+
+The [Exception][Exception Property] if it is handled by the block.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [PropertyEmptyException][] | Thrown when [Type Name][TypeName Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Type Name][TypeName Property] is `null`. |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Chaining Exception handling blocks
+
+Blocks that handle block exceptions can be chained together so different exceptions can be handled separately. The blocks are listed below:
+
+* [Handle Block Exception Matching Message][]
+* [Handle Block Exception Matching Messages][]
+* [Handle Block Exception Matching Type Name][]
+* [Handle Block Exception Matching Type Names][]
+* [Handle Block Exception][]
+
+{{< figure src="/images/chaining-handle-block-exception-blocks.png" >}}
+
+Each block has an input port on its left-hand side and, with the exception of the [Handle Block Exception][] block, also have an output port on their right-hand side; this is so they can pass any exception they do not handle to the next block.
+
+As the [Handle Block Exception][] block handles any exception, it does not require the output port.
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[TypeName Property]: {{< ref "#type-name" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Block Exception Matching Message]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessage.MainDoc" >}}
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-names-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-names-block.md
new file mode 100644
index 000000000..a6f198f1d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-names-block.md
@@ -0,0 +1,232 @@
+---
+title: "Handle Block Exception Matching Type Names"
+linkTitle: "Handle Block Exception Matching Type Names"
+description: "Handles any exception thrown by the block it is connected to that matches any type name in a given set of type names."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleBlockException_HandleBlockExceptionMatchingTypeNamesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any [Exception][Exception Property] thrown by the block it is connected to that matches any type name in a given set of [Type Names][TypeNames Property].
+
+## Examples
+
+### Handle Exception matching any of the Type Names and save the Exception
+
+This example will handle any exception thrown by the block it is connected to that contains any of the type names in `["PropertyNull", "PropertyEmpty"]` in its fully qualified `TypeName`; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Names][TypeNames Property] | `($)TypeNames`, with value `["PropertyNull", "PropertyEmpty"]` | `($)TypeNames` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any exception containing any of the type names in `["PropertyNull", "PropertyEmpty"]` in its fully qualified `TypeName` and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Common.Property.PropertyNullException"`; therefore as we are checking for exceptions containing any of `["PropertyNull", "PropertyEmpty"]` in their `TypeName`, this exception would be handled and saved to the `($)Exception` variable.
+
+***
+
+### Handle Exception containing any of the Type Names and discard the Exception
+
+This example is the same as the example above, except it does not save the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Names][TypeNames Property] | `($)TypeNames`, with value `["PropertyNull", "PropertyEmpty"]` | `($)TypeNames` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any exception containing any of the type names in `["PropertyNull", "PropertyEmpty"]` in its fully qualified `TypeName`, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to null, it would throw a [PropertyNullException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Common.Property.PropertyNullException"`; therefore as we are checking for exceptions containing any of `["PropertyNull", "PropertyEmpty"]` in their `TypeName`, this exception would be handled, but because the `($)_` variable is used it will not be saved to the `($)Exception` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+### Exception does not contain any of the Type Names
+
+This example will not handle an exception thrown by the block it is connected to that does not contain any of `["PropertyNull", "PropertyEmpty"]` in its fully qualified `TypeName`; the exception will be passed to the next exception handling block.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of messages.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Type Names][TypeNames Property] | `($)TypeNames`, with value `["PropertyNull", "PropertyEmpty"]` | `($)TypeNames` is a variable of type [IEnumerable][]<[String][]> |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that won't be set |
+
+#### Result
+
+The block will not handle any exception that does not contain any of `["PropertyNull", "PropertyEmpty"]` in its fully qualified `TypeName`; instead the exception will be passed to the next exception handling block.
+
+E.g.
+
+If the List property of the Add Item At Beginning list block was set to a read-only List, it would throw a [CannotModifyReadOnlyListException][] when executed.
+
+This exception's fully qualified `TypeName` is `"Cortex.Exceptions.Lists.CannotModifyReadOnlyListException"`; therefore as we are checking for exceptions containing any of `["PropertyNull", "PropertyEmpty"]` in their `TypeName`, this exception would not be handled.
+
+***
+
+## Properties
+
+### Type Names
+
+The [Type Names][TypeNames Property] the [Exception's][Exception Property] fully qualified `TypeName` must contain any of for this block to handle the [Exception][Exception Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether any of the [Type Names][TypeNames Property] are contained in the [Exception's][Exception Property] fully qualified `TypeName`.
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Exception
+
+The [Exception][Exception Property] if it is handled by the block.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [PropertyContainsNullOrEmptyItemException][] | Thrown when any Type Name in [Type Names][TypeNames Property] is `null` or empty (i.e. `""`). |
+| [PropertyEmptyException][] | Thrown when [Type Names][TypeNames Property] contains no items. |
+| [PropertyNullException][] | Thrown when [Type Names][TypeNames Property] is `null`. |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Chaining Exception handling blocks
+
+Blocks that handle block exceptions can be chained together so different exceptions can be handled separately. The blocks are listed below:
+
+* [Handle Block Exception Matching Message][]
+* [Handle Block Exception Matching Messages][]
+* [Handle Block Exception Matching Type Name][]
+* [Handle Block Exception Matching Type Names][]
+* [Handle Block Exception][]
+
+{{< figure src="/images/chaining-handle-block-exception-blocks.png" >}}
+
+Each block has an input port on its left-hand side and, with the exception of the [Handle Block Exception][] block, also have an output port on their right-hand side; this is so they can pass any exception they do not handle to the next block.
+
+As the [Handle Block Exception][] block handles any exception, it does not require the output port.
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[TypeNames Property]: {{< ref "#type-names" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Block Exception Matching Message]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessage.MainDoc" >}}
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyContainsNullOrEmptyItemException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyContainsNullOrEmptyItemException.MainDoc" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/_index.md
new file mode 100644
index 000000000..9a2fdbacc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Handle Flow Exception(s)"
+linkTitle: "Handle Flow Exception(s)"
+description: "Handle exceptions not handled by any Handle Block Exception or Handle Workspace Exception blocks."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/handle-flow-exception-workspace-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/handle-flow-exception-workspace-block.md
new file mode 100644
index 000000000..77d9d9a97
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-flow-exception/handle-flow-exception-workspace-block.md
@@ -0,0 +1,143 @@
+---
+title: "Handle Flow Exception"
+linkTitle: "Handle Flow Exception"
+description: "Handles any unhandled exception within the Flow."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleFlowException_HandleFlowExceptionWorkspaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any unhandled [Exception][Exception Property] within the Flow.
+
+For more information, please see [Unhandled Exceptions][].
+
+## Examples
+
+### Handle and save the Exception
+
+This example will handle any unhandled exception within the Flow; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any unhandled exception within the Flow and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+***
+
+### Handle and discard the Exception from being saved
+
+This example will handle any unhandled exception within the Flow; not saving the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any unhandled exception within the Flow, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+## Properties
+
+### Exception
+
+The [Exception][Exception Property] that is handled.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+By default, this property is assigned the built-in `($)_` variable, so the exception will be discarded. If the flow execution does need the exception, a variable can be assigned to save it in.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Block Restrictions
+
+The following restrictions apply to this block:
+
+* A flow cannot contain more than one [Handle Flow Exception][] block.
+* The [Handle Flow Exception][] block is not available on any palette.
+* The [Handle Flow Exception][] block cannot be copied.
+* The [Handle Flow Exception][] block cannot be deleted.
+
+### Unhandled Exceptions
+
+If an exception thrown by a block is not handled by any connected [Handle Block Exception blocks][], it will be passed to the [Handle Workspace Exception][] block on the same workspace.
+
+If the workspace does not contain a [Handle Workspace Exception][] block it will be rethrown by the Workspace block the workspace belongs to.
+
+This process repeats until:
+
+* The exception is handled, or
+* The exception reaches the flow's top-level workspace, is not handled by any [Handle Block Exception blocks][] and the top-level workspace does not contain a [Handle Workspace Exception][] block. At this stage, the exception is handled by the flow's [Handle Flow Exception][] block.
+
+If an exception occurs within the workspace of the [Handle Flow Exception][] block and is not handled, the flow will end with a status of Error.
+
+{{< figure src="/images/flow-error-status.png" >}}
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Unhandled Exceptions]: {{< ref "#unhandled-exceptions" >}}
+
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/_index.md
new file mode 100644
index 000000000..bfe98fb7b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Handle Workspace Exception(s)"
+linkTitle: "Handle Workspace Exception(s)"
+description: "Handle exceptions not handled by any Handle Block Exception blocks."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/handle-workspace-exception-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/handle-workspace-exception-block.md
new file mode 100644
index 000000000..822923d3c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/handle-workspace-exception/handle-workspace-exception-block.md
@@ -0,0 +1,144 @@
+---
+title: "Handle Workspace Exception"
+linkTitle: "Handle Workspace Exception"
+description: "Handles any unhandled exception within its workspace."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_HandleWorkspaceException_HandleWorkspaceExceptionBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Handles any unhandled [Exception][Exception Property] within its workspace.
+
+For more information, please see [Unhandled Exceptions][].
+
+## Examples
+
+### Handle and save the Exception
+
+This example will handle any unhandled exception within the block's workspace; saving the exception to a variable, so the flow execution can use it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)Exception`, with no value | `($)Exception` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+The block will handle any unhandled exception within the block's workspace and save the exception to the `($)Exception` variable for use later in the flow execution.
+
+***
+
+### Handle and discard the Exception from being saved
+
+This example will handle any unhandled exception within the block's workspace; not saving the exception to a variable, as the flow execution does not need it to make decisions or take further action.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)_`, with no value | `($)_` is a built-in variable that indicates the flow execution does not need to save the exception, so it can be discarded |
+
+#### Result
+
+The block will handle any unhandled exception within the block's workspace, but will not save the exception as the `($)_` variable indicates it is not needed and can be discarded.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+***
+
+## Properties
+
+### Exception
+
+The [Exception][Exception Property] that is handled.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+If the flow execution does not need the exception, it can be discarded by assigning the built-in `($)_` variable.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)_` to [discard][] |
+
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Block Restrictions
+
+The following restrictions apply to this block:
+
+* A workspace cannot contain more than one [Handle Workspace Exception][] block. If more than one is added, it will be reported as a message when trying to debug the flow.
+* The [Handle Workspace Exception][] block will only handle the first unhandled exception within its workspace. This is to prevent infinite recursion within the flow. Subsequent unhandled exceptions are passed to the next relevant exception handling block. For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+* A flow's Top-Level Workspace cannot contain a [Handle Workspace Exception][] block. If one is added, it will be reported as a message when trying to debug the flow.
+
+### Unhandled Exceptions
+
+If an exception thrown by a block is not handled by any connected [Handle Block Exception blocks][], it will be passed to the [Handle Workspace Exception][] block on the same workspace.
+
+If the workspace does not contain a [Handle Workspace Exception][] block it will be rethrown by the [Workspace][] block the workspace belongs to.
+
+This process repeats until:
+
+* The exception is handled, or
+* The exception reaches the flow's top-level workspace, is not handled by any [Handle Block Exception blocks][] and the top-level workspace does not contain a [Handle Workspace Exception][] block. At this stage, the exception is handled by the flow's [Handle Flow Exception][] block.
+
+If an exception occurs within the workspace of the [Handle Flow Exception][] block and is not handled, the flow will end with a status of Error.
+
+{{< figure src="/images/flow-error-status.png" >}}
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Why does the Exception property return a dynamic data type?
+
+The decision for the [Exception][Exception Property] to return a [dynamic data type][dynamic] rather than an [Exception data type][Exception], was to avoid users having to [cast][Object Casting] the exception to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Exception data type][Exception] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the exception to its correct type.
+
+### Using the built-in ($)_ variable to discard the Exception from being saved
+
+Sometimes when an exception occurs the flow execution wants to use the exception to make decisions or take further action. However, there are occasions when the exception is not needed, and being forced to create another variable to save the exception is extra work for no benefit. In these circumstances it is possible to use the built-in `($)_` variable to indicate the exception does not need to be saved.
+
+For more infomation about using the built-in `($)_` variable, please see [Discarding Output Properties][].
+
+[Exception Property]: {{< ref "#exception" >}}
+[discard]: {{< ref "#using-the-built-in-_-variable-to-discard-the-exception-from-being-saved" >}}
+
+[Unhandled Exceptions]: {{< ref "#unhandled-exceptions" >}}
+
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+[Discarding Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+[Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/_index.md
new file mode 100644
index 000000000..2867ac09a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Rethrow Exception"
+linkTitle: "Rethrow Exception"
+description: "Rethrow a previously thrown and handled exception."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/rethrow-exception-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/rethrow-exception-block.md
new file mode 100644
index 000000000..b038da7aa
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/rethrow-exception/rethrow-exception-block.md
@@ -0,0 +1,89 @@
+---
+title: "Rethrow Exception"
+linkTitle: "Rethrow Exception"
+description: "Rethrows an Exception which has previously been thrown and handled."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_RethrowException_RethrowExceptionBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Rethrows an [Exception][Exception Property] which has previously been thrown and handled.
+
+## Examples
+
+### Rethrowing an Exception
+
+This example will rethrow the following handled [Exception][] thrown by an [Add Item At Beginning][] block:
+
+{{< figure src="/images/rethrow-original-list-exception.png" >}}
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Exception][Exception Property] | `($)Exception`, with value of`{"Exception Type": "PropertyNullException","Message": "'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this.","HelpLink": "https://docs.wearecortex.com/docs/2023.5/reference/exceptions/common/property/property-null-exception/"}` | `($)Exception` is a variable of type [PropertyNullException][] |
+
+#### Result
+
+Rethrowing `($)Exception` results in the [Exception][Exception Property] being rethrown and shown in the [Exceptions Viewer][]:
+
+{{< figure src="/images/rethrow-from-list-exception.png" >}}
+
+***
+
+## Properties
+
+### Exception
+
+The [Exception][Exception Property] that is rethrown.
+
+[Exception][Exception Property] can be any [Exception data type][Exception].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Exception][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Exception` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Exception][Exception Property] is `null`. |
+
+## Remarks
+
+### Propagating Exceptions
+
+Sometimes it is necessary to propagate exceptions thrown in a child flow to the flow that called it. Currently, using the [Rethrow Exception][] block to rethrow the [Exception][] from the [Handle Flow Exception][] workspace is the only way to achieve this. This can be seen below:
+
+{{< figure src="/images/rethrow-from-subflow.gif" >}}
+
+In future, additional ways to propagate exceptions between flows may be added.
+
+[Exception Property]: {{< ref "#exception" >}}
+
+[Rethrow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.RethrowException.RethrowException.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Add Item At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.AddItem.AddItemAtBeginning.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer">}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/_index.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/_index.md
new file mode 100644
index 000000000..6825cb935
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Throw Exception"
+linkTitle: "Throw Exception"
+description: "Throw an exception."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/throw-new-flow-exception-block.md b/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/throw-new-flow-exception-block.md
new file mode 100644
index 000000000..31007f815
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Exceptions/throw-exception/throw-new-flow-exception-block.md
@@ -0,0 +1,185 @@
+---
+title: "Throw New Flow Exception"
+linkTitle: "Throw New Flow Exception"
+description: "Throws a new FlowException with the specified message, category, error code, details, inner exception and help link."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Exceptions_ThrowException_ThrowNewFlowExceptionBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Throws a new [FlowException][] with the specified [Message][Message Property], [Category][Category Property], [Error Code][ErrorCode Property], [Details][Details Property], [Inner Exception][InnerException Property] and [Help Link][HelpLink Property].
+
+All properties are optional, and if not supplied will be set to the following default values:
+
+| Property | Default Value |
+|--------------------|-----------------------------------|
+| [Message][Message Property] | `"Exception of type 'Cortex.Exceptions.Flows.FlowException' was thrown."` |
+| [Category][Category Property] | `null` |
+| [Error Code][ErrorCode Property] | `null` |
+| [Details][Details Property] | `null`|
+| [InnerException][InnerException Property] | `null` |
+| [HelpLink][HelpLink Property] | `https://docs.wearecortex.com/docs/2023.5/reference/exceptions/flows/flow-exception/` |
+
+## Examples
+
+### Throw new FlowException with full configuration
+
+This example will throw a new [FlowException][] with all properties configured.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Message][Message Property] | `($)Message`, with value `"Custom Message"` | `($)Message` is a variable of type [String][] |
+| [Category][Category Property] | `($)Category`, with value `"Custom Category"` | `($)Category` is a variable of type [String][] |
+| [Error Code][ErrorCode Property] | `($)ErrorCode`, with value `100` | `($)ErrorCode` is a variable of type [Nullable][]<[Int32][]> |
+| [Details][Details Property] | `($)Details`, with value `{"DetailsKey1" : "DetailsValue1", "DetailsKey2" : "DetailsValue2"}` | `($)Details` is a variable of type [IDictionary][]<[String][], [String][]> |
+| [InnerException][InnerException Property] | `($)InnerException`, with value `($)Exception` containing another [FlowException][] with default properties | `($)InnerException` is a variable of type [FlowException][] |
+| [HelpLink][HelpLink Property] | `($)HelpLink`, with value `"http://customdomain.com/customurl"` | `($)HelpLink` is a variable of type [String][] |
+
+#### Result
+
+Throwing a new [FlowException][] with properties configured as above will result in the following exception:
+
+{{< figure src="/images/flow-exception-full-configuration.png" >}}
+
+***
+
+### Throw new FlowException with no configuration
+
+This example will throw a new [FlowException][] with no configuration.
+
+#### Properties
+
+No properties are configured for this example.
+
+#### Result
+
+Throwing a new [FlowException][] without configuring any of the block's properties will result in the following exception:
+
+{{< figure src="/images/flow-exception-no-configuration.png" >}}
+
+***
+
+## Properties
+
+### Message
+
+A [Message][Message Property] describing the exception that occurred.
+
+If [Message][Message Property] is not provided or is set to `null`, it will default to `"Exception of type 'Cortex.Exceptions.Flows.FlowException' was thrown."`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Category
+
+A [Category][Category Property] that can be used to categorise similar types of exception that has occurred (e.g. an `AuthenticationError` category may be set for exceptions relating to authentication issues). This can then be used for future decision making in the flow, or to assist in troubleshooting and reporting.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Error Code
+
+An [Error Code][ErrorCode Property] that can be used to uniquely identify the type of exception (e.g. There may be multiple exceptions with the same `AuthenticationError` category set, such as `InvalidCredentials`, `TokenExpired`. In this case each exception can be assigned its own unique [Error Code][ErrorCode Property]; `InvalidCredentials` = `100` and `TokenExpired` = `101`). This can then be used for future decision making in the flow, or to assist in troubleshooting and reporting.
+
+If [Error Code][ErrorCode Property] is not provided, it will default to `null`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Nullable][]<[Int32][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Details
+
+[Details][Details Property] can be used to provide more detailed information about the exception. It can be any type of [Object][]. This can then be used for future decision making in the flow, or to assist in troubleshooting and reporting.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Inner Exception
+
+[Inner Exception][InnerException Property] can be used to include another [exception][] within the thrown exception (e.g. If the [FlowException][] has been thrown as a result of handling another [exception][], then the handled [exception][] can be included within the [FlowException][] to add traceability).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Exception][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Help Link
+
+A [Help Link][HelpLink Property] can be specified where further information can be found about the exception being thrown.
+
+If [Help Link][HelpLink Property] is not provided or is set to `null`, it will default to a link to the [FlowException][] page; please note this page will not provide any guidance on how to fix the solution specific [exception][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null Message
+
+If [Message][Message Property] is not provided or is set to `null`, it will default to `"Exception of type 'Cortex.Exceptions.Flows.FlowException' was thrown."`.
+
+### Null Help Link
+
+If [Help Link][HelpLink Property] is not provided or is set to `null`, it will default to a link to the [FlowException][] page, please note this page will not provide any guidance on how to fix the solution specific [exception][].
+
+[Message Property]: {{< ref "#message" >}}
+[Category Property]: {{< ref "#category" >}}
+[ErrorCode Property]: {{< ref "#error-code" >}}
+[Details Property]: {{< ref "#details" >}}
+[InnerException Property]: {{< ref "#inner-exception" >}}
+[HelpLink Property]: {{< ref "#help-link" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+[FlowException]: {{< url path="Cortex.Reference.Exceptions.Flows.FlowException.MainDoc" >}}
+[Nullable]: {{< url path="Cortex.Reference.DataTypes.Other.Nullable.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/_index.md
new file mode 100644
index 000000000..f42a0941a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Files & Folders"
+linkTitle: "Files & Folders"
+description: "Blocks related to working with Files and Folders."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/_index.md
new file mode 100644
index 000000000..e5fb6edbb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Check File Exists"
+linkTitle: "Check File Exists"
+description: "Check if a file exists."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/check-file-exists-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/check-file-exists-block.md
new file mode 100644
index 000000000..2a00b2f51
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-file/check-file-exists-block.md
@@ -0,0 +1,159 @@
+---
+title: "Check File Exists"
+linkTitle: "Check File Exists"
+description: "Checks if a file exists at the specified file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CheckFile_CheckFileExistsBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [File Exists][FileExists Property] at the specified [File Path][FilePath Property].
+
+## Examples
+
+### File exists at the specified File Path
+
+This example will check if `"C:\Windows\System32\cmd.exe"` exists on the Windows server executing the flow.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Windows\System32\cmd.exe"` | `($)FilePath` is a variable of type [String][] |
+| [File Exists][FileExists Property] | `($)FileExists`, with no value | `($)FileExists` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"C:\Windows\System32\cmd.exe"` is the command prompt application on Windows machines. Checking this on the Windows server executing the flow will result in the variable `($)FileExists` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### File does not exist at the specified File Path
+
+This example will check if `"/etc/passwd"` exists on the Windows server executing the flow.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `"/etc/passwd"` | `($)FilePath` is a variable of type [String][] |
+| [File Exists][FileExists Property] | `($)FileExists`, with no value | `($)FileExists` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"/etc/passwd"` is a file that exists on Linux machines containing the list of system accounts. Checking this on the Windows server executing the flow will result in the variable `($)FileExists` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to check a file exists at.
+
+The [File Path][FilePath Property] is case-insensitive, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### File Exists
+
+The result of the file exists check.
+
+If the file exists at the specified [File Path][FilePath Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FileExists` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Windows\\System32\\cmd.exe"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Windows\System32\cmd.exe"`)
+
+### Null File Path
+
+If [File Path][FilePath Property] is `null` the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+### Empty File Path
+
+If [File Path][FilePath Property] is empty (i.e. `""`) the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+### Invalid File Path
+
+If [File Path][FilePath Property] is invalid (i.e. contains any of the following characters: `"`, `*`, `?`, `|`, `<`, `>`, `:`, `\`, `/`) the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+### File Path points to a folder
+
+If [File Path][FilePath Property] points to a folder, the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+To check if a folder exists, use the [Check Folder Exists block][].
+
+### File Path contains leading spaces
+
+If [File Path][FilePath Property] contains leading spaces they are not removed; however, trailing spaces are removed.
+
+### Error occurs whilst checking if the file exists
+
+If any error occurs whilst checking if a file exists at the specified [File Path][FilePath Property], the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+### User does not have necessary permissions to check if the file exists
+
+If the user the flow is executing as does not have permissions to check if a file exists at the specified [File Path][FilePath Property], the variable specified in the [File Exists][FileExists Property] property will be set to `false`.
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[FileExists Property]: {{< ref "#file-exists" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Check Folder Exists block]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CheckFolder.CheckFolderExists.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/_index.md
new file mode 100644
index 000000000..4ae62e559
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Check Folder Exists"
+linkTitle: "Check Folder Exists"
+description: "Check if a folder exists."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/check-folder-exists-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/check-folder-exists-block.md
new file mode 100644
index 000000000..182858896
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/check-folder/check-folder-exists-block.md
@@ -0,0 +1,159 @@
+---
+title: "Check Folder Exists"
+linkTitle: "Check Folder Exists"
+description: "Checks if a folder exists at the specified folder path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CheckFolder_CheckFolderExistsBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [Folder Exists][FolderExists Property] at the specified [Folder Path][FolderPath Property].
+
+## Examples
+
+### Folder exists at the specified Folder Path
+
+This example will check if `"C:\Windows\System32"` exists on the Windows server executing the flow.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Windows\System32"` | `($)FolderPath` is a variable of type [String][] |
+| [Folder Exists][FolderExists Property] | `($)FolderExists`, with no value | `($)FolderExists` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"C:\Windows\System32"` is the folder on Windows machines that contains files critical to the functioning of the operating system. Checking this on the Windows server executing the flow will result in the variable `($)FolderExists` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Folder does not exist at the specified Folder Path
+
+This example will check if `"/etc"` exists on the Windows server executing the flow.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `"/etc"` | `($)FolderPath` is a variable of type [String][] |
+| [Folder Exists][FolderExists Property] | `($)FolderExists`, with no value | `($)FolderExists` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"/etc"` is the folder on Linux machines containing system configuration files. Checking this on the Windows server executing the flow will result in the variable `($)FolderExists` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to check a folder exists at.
+
+The [Folder Path][FolderPath Property] is case-insensitive, any trailing spaces will be automatically removed, and can end with or without a trailing `\` (e.g. `@"C:\Windows\System32"` or `@"C:\Windows\System32\"`).
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Folder Exists
+
+The result of the folder exists check.
+
+If the folder exists at the specified [Folder Path][FolderPath Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderExists` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Windows\\System32"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Windows\System32"`)
+
+### Null Folder Path
+
+If [Folder Path][FolderPath Property] is `null` the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+### Empty Folder Path
+
+If [Folder Path][FolderPath Property] is empty (i.e. `""`) the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+### Invalid Folder Path
+
+If [Folder Path][FolderPath Property] is invalid (i.e. contains any of the following characters: `"`, `*`, `?`, `|`, `<`, `>`, `:`, `\`, `/`) the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+### Folder Path points to a file
+
+If [Folder Path][FolderPath Property] points to a file, the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+To check if a file exists, use the [Check File Exists block][].
+
+### Folder Path contains leading spaces
+
+If [Folder Path][FolderPath Property] contains leading spaces they are not removed; however, trailing spaces are removed.
+
+### Error occurs whilst checking if the folder exists
+
+If any error occurs whilst checking if a folder exists at the specified [Folder Path][FolderPath Property], the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+### User does not have necessary permissions to check if the folder exists
+
+If the user the flow is executing as does not have permissions to check if a folder exists at the specified [Folder Path][FolderPath Property], the variable specified in the [Folder Exists][FolderExists Property] property will be set to `false`.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[FolderExists Property]: {{< ref "#folder-exists" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Check File Exists block]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CheckFile.CheckFileExists.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/_index.md
new file mode 100644
index 000000000..71e54f21e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Copy File(s)"
+linkTitle: "Copy File(s)"
+description: "Copy a file or multiple files."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-file-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-file-block.md
new file mode 100644
index 000000000..0542f41e9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-file-block.md
@@ -0,0 +1,224 @@
+---
+title: "Copy File"
+linkTitle: "Copy File"
+description: "Copies a file at the specified file path to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CopyFile_CopyFileBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Copies a file at the specified [File Path][FilePath Property] to the given [Destination Path][DestinationPath Property], with an option to [Overwrite][Overwrite Property] the file if it already exists.
+
+## Examples
+
+### Copy a file to a folder keeping the same file name
+
+This example will copy `"C:\Source\OriginalFile.txt"` to `"C:\Destination"`, with the same file name of `"OriginalFile.txt"`.
+
+In this example assume `"C:\Destination"` does not already contain a file named `"OriginalFile.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\OriginalFile.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\OriginalFile.txt"` to `"C:\Destination"` that does not already contain a file named `"OriginalFile.txt"` will:
+
+* Create a new file at `"C:\Destination\OriginalFile.txt"` with:
+ * The content copied from `"C:\Source\OriginalFile.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\OriginalFile.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\OriginalFile.txt"`.
+
+***
+
+### Copy a file to a folder with a new name
+
+This example will copy `"C:\Source\OriginalFile.txt"` to `"C:\Destination"`, with a new file name of `"NewFile.txt"`.
+
+To rename the file when it is being copied, please note that the [Destination Path][DestinationPath Property] must be a file path, rather than a folder path (e.g. `"C:\Destination\NewFile.txt"` rather than `"C:\Destination"`).
+
+In this example assume `"C:\Destination"` does not already contain a file named `"NewFile.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\OriginalFile.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination\NewFile.txt"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\OriginalFile.txt"` to the path `"C:\Destination\NewFile.txt"` that does not already exist will:
+
+* Create a new file at `"C:\Destination\NewFile.txt"` with:
+ * The content copied from `"C:\Source\OriginalFile.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\OriginalFile.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\OriginalFile.txt"`.
+
+***
+
+### Copy a file to a folder overwriting any file that already exists with the same name
+
+This example will copy `"C:\Source\FileAlreadyExists.txt"` to `"C:\Destination"`, with the same file name of `"FileAlreadyExists.txt"`.
+
+In this example assume `"C:\Destination"` already contains a file named `"FileAlreadyExists.txt"`, so overwrite must be set to `true` to ensure the content of the existing file can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\FileAlreadyExists.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\FileAlreadyExists.txt"` to `"C:\Destination"` and overwriting the existing file named `"FileAlreadyExists.txt"` will:
+
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists.txt"`.
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to copy the file from.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to copy the file to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] can either point to a folder or a file:
+
+* If it points to a folder, the copied file will have the name specified in the [File Path][FilePath Property].
+* If it points to a file, the copied file will have the name specified in the [Destination Path][DestinationPath Property].
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the file in the [Destination Path][DestinationPath Property] if it already exists.
+
+If the file exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [Destination Path][DestinationPath Property] (if it points to a file), or the [Destination Path][DestinationPath Property] (if it points to a folder) plus the file name, exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [File Path][FilePath Property] does not exist. |
+| | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The file in the specified [Destination Path][DestinationPath Property] exists and overwrite is `false`. |
+| | The file in the specified [Destination Path][DestinationPath Property] exists, is read-only and overwrite is `true`. |
+| | The file in the specified [Destination Path][DestinationPath Property] exists, is hidden and overwrite is `true`, but the file in the specified [File Path][FilePath Property] is not hidden.|
+| | The user the flow is executing as does not have the required permissions to copy the file (e.g. not having read access to the [File Path][FilePath Property] or write access to the [Destination Path][DestinationPath Property]). |
+| | An unexpected error occurs when copying the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### File and Folder Paths
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path and Destination Path need escaping
+
+[File Path][FilePath Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\OriginalFile.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\OriginalFile.txt"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### File Attributes
+
+When copying a file from the [File Path][FilePath Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes will also be copied.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-files-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-files-block.md
new file mode 100644
index 000000000..c54a51005
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-file/copy-files-block.md
@@ -0,0 +1,215 @@
+---
+title: "Copy Files"
+linkTitle: "Copy Files"
+description: "Copies files at the specified file paths to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CopyFile_CopyFilesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Copies files at the specified [File Paths][FilePaths Property] to the given [Destination Path][DestinationPath Property], with an option to [Overwrite][Overwrite Property] the files if they already exist.
+
+## Examples
+
+### Copy files to a folder keeping the same file names
+
+This example will copy `["C:\Source\OriginalFile1.txt", "C:\Source\OriginalFile2.txt"]` to `"C:\Destination"`, with the same file names of `"OriginalFile1.txt"` and `"OriginalFile2.txt"`.
+
+In this example assume `"C:\Destination"` does not already contain a file named `"OriginalFile1.txt"` or a file named `"OriginalFile2.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\OriginalFile1.txt", @"C:\Source\OriginalFile2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\OriginalFile1.txt", "C:\Source\OriginalFile2.txt"]` to `"C:\Destination"` that does not already contain files named `"OriginalFile1.txt"` and `"OriginalFile2.txt"` will:
+
+* Create a new file at `"C:\Destination\OriginalFile1.txt"` with:
+ * The content copied from `"C:\Source\OriginalFile1.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\OriginalFile1.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\OriginalFile1.txt"`.
+* Create a new file at `"C:\Destination\OriginalFile2.txt"` with:
+ * The content copied from `"C:\Source\OriginalFile2.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\OriginalFile2.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\OriginalFile2.txt"`.
+
+***
+
+### Copy files to a folder overwriting any files that already exists with the same names
+
+This example will copy `["C:\Source\FileAlreadyExists1.txt", "C:\Source\FileAlreadyExists2.txt"]` to `"C:\Destination"`, with the same file names of `"FileAlreadyExists1.txt"` and `"FileAlreadyExists2.txt"`.
+
+In this example assume `"C:\Destination"` already contains a file named `"FileAlreadyExists1.txt"` and a file named `"FileAlreadyExists2.txt"`, so overwrite must be set to `true` to ensure the content of the existing files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\FileAlreadyExists1.txt", @"C:\Source\FileAlreadyExists2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\FileAlreadyExists1.txt", "C:\Source\FileAlreadyExists2.txt"]` to `"C:\Destination"` and overwriting the existing files named `"FileAlreadyExists1.txt"` and `"FileAlreadyExists2.txt"` will:
+
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists1.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists1.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists1.txt"`.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists2.txt"`.
+
+***
+
+## Properties
+
+### File Paths
+
+The [File Paths][FilePaths Property] to copy the files from.
+
+Each file path in [File Paths][FilePaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePaths` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to copy the files to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The copied files will have the names specified in the [File Paths][FilePaths Property].
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the files in the [Destination Path][DestinationPath Property] if they already exist.
+
+If any file exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] does not point to a folder. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [Destination Path][DestinationPath Property] (if it points to a file), or the [Destination Path][DestinationPath Property] (if it points to a folder) plus the file name, exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | Any file path in [File Paths][FilePaths Property] is `null` or empty (i.e. `""`). |
+| | Any file path in [File Paths][FilePaths Property] is duplicated. |
+| | Any file path in [File Paths][FilePaths Property] does not exist. |
+| | Any file path in [File Paths][FilePaths Property] points to a folder. |
+| | Any file path in [File Paths][FilePaths Property] contains leading spaces. |
+| | Any file path in [File Paths][FilePaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | Any file path in [File Paths][FilePaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any file path in [File Paths][FilePaths Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | Any file path in [File Paths][FilePaths Property] exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file path in [File Paths][FilePaths Property] exists in the specified [Destination Path][DestinationPath Property] with the same name, is read-only and overwrite is `true`. |
+| | Any file path in [File Paths][FilePaths Property] exists in the specified [Destination Path][DestinationPath Property] with the same name, is hidden and overwrite is `true`, but the file in the specified [File Paths][FilePaths Property] is not hidden.|
+| | The user the flow is executing as does not have the required permissions to copy any file (e.g. not having read access to a file path in [File Paths][FilePaths Property] or write access to the [Destination Path][DestinationPath Property]). |
+| | An unexpected error occurs when copying a file. |
+| [PropertyEmptyException][] | Thrown when [File Paths][FilePaths Property] does not contain any items, or [Destination Path][DestinationPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Paths][FilePaths Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### File and Folder Paths
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Paths and Destination Path need escaping
+
+Each file path in [File Paths][FilePaths Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\OriginalFile.txt"`), or
+* Prepending an `@` character before the start of the
+file path (e.g. `@"C:\Source\OriginalFile.txt"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### File Attributes
+
+When copying a file in the [File Paths][FilePaths Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes will also be copied.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to copy a file in the [File Paths][FilePaths Property], it will be recorded and the block will continue processing the remaining files. Once all files are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FilePaths Property]: {{< ref "#file-paths" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/_index.md
new file mode 100644
index 000000000..0b4717a91
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Copy Folder(s)"
+linkTitle: "Copy Folder(s)"
+description: "Copy a folder or multiple folders."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folder-block.md
new file mode 100644
index 000000000..c759f552f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folder-block.md
@@ -0,0 +1,386 @@
+---
+title: "Copy Folder"
+linkTitle: "Copy Folder"
+description: "Copies a folder at the specified folder path to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CopyFolder_CopyFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Copies a folder at the specified [Folder Path][FolderPath Property] to the given [Destination Path][DestinationPath Property], with an option to copy the folder and its content, or just its [Content Only][ContentOnly Property].
+
+An option can also be specified to [Overwrite][Overwrite Property] anything being copied that already exists in the [Destination Path][DestinationPath Property].
+
+## Examples
+
+### Copy a folder and its content
+
+This example will copy `"C:\Source\Folder"` and its content to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"Folder"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\Folder"` and its content to `"C:\Destination"` that does not already contain a folder named `"Folder"` will:
+
+* Create a new folder at `"C:\Destination\Folder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder"`.
+* Create a new folder at `"C:\Destination\Folder\SubFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder\SubFolder"`.
+* Create a new file at `"C:\Destination\Folder\File.txt"` with:
+ * The content copied from `"C:\Source\Folder\File.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\File.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\File.txt"`.
+
+***
+
+### Copy a folder and its content, overwriting any content that already exists
+
+This example will copy `"C:\Source\Folder"` and its content to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists"`.
+ * A file named `"File.txt"`.
+ * A file named `"FileAlreadyExists.txt"`.
+* `"C:\Destination"` already contains a folder named `"Folder"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists"`.
+ * A file named `"FileAlreadyExists.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing `"SubFolderAlreadyExists"` and `"FileAlreadyExists.txt"` can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\Folder"` and its content to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\Folder"`, `"C:\Destination\Folder\SubFolderAlreadyExists"` and `"C:\Destination\Folder\FileAlreadyExists.txt"` already exist will:
+
+* Overwrite the existing folder at `"C:\Destination\Folder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new empty folder at `"C:\Destination\Folder\SubFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder\SubFolder"`.
+* Overwrite the existing folder at `"C:\Destination\Folder\SubFolderAlreadyExists"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\Folder\File.txt"` with:
+ * The content copied from `"C:\Source\Folder\File.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\File.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\File.txt"`.
+* Overwrite the existing file at `"C:\Destination\Folder\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+
+***
+
+### Copy a folder's content only
+
+This example will copy `"C:\Source\Folder"` content only to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"SubFolder"` or a file named `"File.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\Folder"` content only to `"C:\Destination"` that does not already contain a folder named `"SubFolder"` or a file named `"File.txt"` will:
+
+* Create a new folder at `"C:\Destination\SubFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder\SubFolder"`.
+* Create a new file at `"C:\Destination\File.txt"` with:
+ * The content copied from `"C:\Source\Folder\File.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\File.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\File.txt"`.
+
+***
+
+### Copy a folder's content only, overwriting any content that already exists
+
+This example will copy `"C:\Source\Folder"` content only to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists"`.
+ * A file named `"File.txt"`.
+ * A file named `"FileAlreadyExists.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"SubFolderAlreadyExists"`.
+ * A file named `"FileAlreadyExists.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing `"SubFolderAlreadyExists"` and `"FileAlreadyExists.txt"` can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `"C:\Source\Folder"` content only to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\SubFolderAlreadyExists"` and `"C:\Destination\FileAlreadyExists.txt"` already exist will:
+
+* Create a new empty folder at `"C:\Destination\SubFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder\SubFolder"`.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\File.txt"` with:
+ * The content copied from `"C:\Source\Folder\File.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\File.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\File.txt"`.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+
+***
+
+### Copy a folder and its content to the same location but with a different name
+
+If it is required to copy a folder and its content into the same folder it is currently located in, but with a different name, then it is not possible to do with this block; the [Duplicate Folder][] block must be used instead.
+
+***
+
+### Copy a folder and its content to a different location but with a different name
+
+If it is required to copy a folder and its content into a different folder than the one it is currently located in, but with a different name, then it is not possible to do with this block; the [Rename Folder][] block must be used instead.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to copy the folder and/or its content from.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to copy the folder and/or its content to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The copied folders and files will have the same names as the folders and files copied.
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the folder and/or contents being copied to in the [Destination Path][DestinationPath Property] if they already exist.
+
+If the folder and/or contents exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing folders and files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Content Only
+
+Option to specify whether to copy the folder and its content or just the [Content Only][ContentOnly Property].
+
+To copy the folder and its content, [Content Only][ContentOnly Property] must be set to `false`; to copy just the content, [Content Only][ContentOnly Property] must be set to `true`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] points to a file. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Destination Path][DestinationPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] does not exist. |
+| | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | The [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The [Folder Path][FolderPath Property] and [Destination Path][DestinationPath Property] point to the same folder and [Content Only][ContentOnly Property] is `true`. |
+| | The [Folder Path][FolderPath Property] is a child folder in the [Destination Path][DestinationPath Property] and [Content Only][ContentOnly Property] is `false`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property], is read-only and overwrite is `true`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property], is hidden and overwrite is `true`, but the file under the specified [Folder Path][FolderPath Property] is not hidden.|
+| | The user the flow is executing as does not have the required permissions to copy the folder or any of its content (e.g. not having read access to the [Folder Path][FolderPath Property] or its content, or write access to the [Destination Path][DestinationPath Property]). |
+| | The operation is cyclic (e.g. copying a folder into one of its sub-folders). |
+| | An unexpected error occurs when copying the folder or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path and Destination Path need escaping
+
+[Folder Path][FolderPath Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### Folder Attributes
+
+When copying the folder at the specified [Folder Path][FolderPath Property] or any folder under it to the new [Destination Path][DestinationPath Property], if the copied folder already exists its attributes remain unchanged, otherwise they are copied.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### File Attributes
+
+When copying a file under [Folder Path][FolderPath Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes are also copied.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to copy [Folder Path][FolderPath Property], an [OperationFailedException][] will be thrown.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[ContentOnly Property]: {{< ref "#content-only" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Rename Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.RenameFolder.RenameFolder.MainDoc" >}}
+[Duplicate Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.DuplicateFolder.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folders-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folders-block.md
new file mode 100644
index 000000000..f1f10885c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/copy-folders-block.md
@@ -0,0 +1,496 @@
+---
+title: "Copy Folders"
+linkTitle: "Copy Folders"
+description: "Copies folders at the specified folder paths to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CopyFolder_CopyFoldersBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Copies folders at the specified [Folder Paths][FolderPaths Property] to the given [Destination Path][DestinationPath Property], with an option to copy the folders and their content, or just their [Content Only][ContentOnly Property].
+
+An option can also be specified to [Overwrite][Overwrite Property] anything being copied that already exists in the [Destination Path][DestinationPath Property].
+
+## Examples
+
+### Copy folders and their content
+
+This example will copy `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * A file named `"File1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * A file named `"File2.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"Folder1"` or `"Folder2"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"` that does not already contain folders named `"Folder1"` and `"Folder2"` will:
+
+* Create a new folder at `"C:\Destination\Folder1"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder1"`.
+* Create a new folder at `"C:\Destination\Folder1\SubFolder1"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder1\SubFolder1"`.
+* Create a new file at `"C:\Destination\Folder1\File1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\File1.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\File1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\File1.txt"`.
+* Create a new folder at `"C:\Destination\Folder2"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder2"`.
+* Create a new folder at `"C:\Destination\Folder2\SubFolder2"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder2\SubFolder2"`.
+* Create a new file at `"C:\Destination\Folder2\File2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\File2.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\File2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\File2.txt"`.
+
+***
+
+### Copy folders and their content, overwriting any content that already exists
+
+This example will copy `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"File1.txt"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"File2.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"Folder1"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+ * A folder named `"Folder2"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing folders and files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\Folder1"`, `"C:\Destination\Folder1\SubFolderAlreadyExists1"`, `"C:\Destination\Folder1\FileAlreadyExists1.txt"`, `"C:\Destination\Folder2"`, `"C:\Destination\Folder2\SubFolderAlreadyExists2"` and `"C:\Destination\Folder2\FileAlreadyExists2.txt"` already exist will:
+
+* Overwrite the existing folder at `"C:\Destination\Folder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new empty folder at `"C:\Destination\Folder1\SubFolder1"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder1\SubFolder1"`.
+* Overwrite the existing folder at `"C:\Destination\Folder1\SubFolderAlreadyExists1"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\Folder1\File1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\File1.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\File1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\File1.txt"`.
+* Overwrite the existing file at `"C:\Destination\Folder1\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+* Overwrite the existing folder at `"C:\Destination\Folder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new empty folder at `"C:\Destination\Folder2\SubFolder2"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder2\SubFolder2"`.
+* Overwrite the existing folder at `"C:\Destination\Folder2\SubFolderAlreadyExists2"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\Folder2\File2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\File2.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\File2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\File2.txt"`.
+* Overwrite the existing file at `"C:\Destination\Folder2\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+
+***
+
+### Copy the folders' content only
+
+This example will copy `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * A file named `"File1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * A file named `"File2.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"SubFolder1"` or `"SubFolder2"` or a file named `"File1.txt"` or `"File2.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"` that does not already contain a folder named `"SubFolder1"` or `"SubFolder2"` or a file named `"File1.txt"` or `"File2.txt"` will:
+
+* Create a new folder at `"C:\Destination\SubFolder1"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder1\SubFolder1"`.
+* Create a new file at `"C:\Destination\File1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\File1.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\File1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\File1.txt"`.
+* Create a new folder at `"C:\Destination\SubFolder2"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder2\SubFolder2"`.
+* Create a new file at `"C:\Destination\File2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\File2.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\File2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\File2.txt"`.
+
+***
+
+### Copy folders' content only, overwriting any content that already exists
+
+This example will copy `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"File1.txt"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"File2.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"SubFolderAlreadyExists1"`.
+ * A folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing folders and files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Copying `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\SubFolderAlreadyExists1"`, `"C:\Destination\SubFolderAlreadyExists2"`, `"C:\Destination\FileAlreadyExists1.txt"` and `"C:\Destination\FileAlreadyExists2.txt"` already exist will:
+
+* Create a new empty folder at `"C:\Destination\SubFolder1"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder1\SubFolder1"`.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists1"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\File1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\File1.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\File1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\File1.txt"`.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+* Create a new empty folder at `"C:\Destination\SubFolder2"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder2\SubFolder2"`.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists2"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Create a new file at `"C:\Destination\File2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\File2.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\File2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\File2.txt"`.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+
+***
+
+### Copy folders and their content to the same location but with a different name
+
+If it is required to copy folders and their content into the same folder they are currently located in, but with a different name, then it is not possible to do with this block; the [Duplicate Folder][] block must be used instead.
+
+***
+
+### Copy folders and their content to a different location but with a different name
+
+If it is required to copy folders and their content into a different folder than the one they are currently located in, but with a different name, then it is not possible to do with this block; the [Rename Folder][] block must be used instead.
+
+***
+
+## Properties
+
+### Folder Paths
+
+The [Folder Paths][FolderPaths Property] to copy the folders and/or their content from.
+
+Each folder path in [Folder Paths][FolderPaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPaths` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to copy the folders and/or their content to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The copied folders and files will have the same names as the folders and files copied.
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the folders and/or contents being copied to in the [Destination Path][DestinationPath Property] if they already exist.
+
+If any of the folders and/or contents exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing folders and files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Content Only
+
+Option to specify whether to copy the folders and their content or just the [Content Only][ContentOnly Property].
+
+To copy the folders and their content, [Content Only][ContentOnly Property] must be set to `false`; to copy just the content, [Content Only][ContentOnly Property] must be set to `true`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] points to a file. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Destination Path][DestinationPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | Any folder path in [Folder Paths][FolderPaths Property] is `null` or empty (i.e. `""`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is duplicated. |
+| | Any folder path in [Folder Paths][FolderPaths Property] does not exist. |
+| | Any folder path in [Folder Paths][FolderPaths Property] points to a file. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains leading spaces. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | Any folder path in [Folder Paths][FolderPaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any folder path in [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | Any folder path in [Folder Paths][FolderPaths Property] and [Destination Path][DestinationPath Property] point to the same folder and [Content Only][ContentOnly Property] is `true`. |
+| | Any folder path in [Folder Paths][FolderPaths Property] is a child folder in the [Destination Path][DestinationPath Property] and [Content Only][ContentOnly Property] is `false`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property], is read-only and overwrite is `true`. |
+| | Any file being copied already exists in the specified [Destination Path][DestinationPath Property], is hidden and overwrite is `true`, but the file under any of the specified [Folder Paths][FolderPaths Property] is not hidden.|
+| | The user the flow is executing as does not have the required permissions to copy the folder or any of its content (e.g. not having read access to any of the folders in [Folder Paths][FolderPaths Property] or its content, or write access to the [Destination Path][DestinationPath Property]). |
+| | The operation is cyclic (e.g. copying a folder into one of its sub-folders). |
+| | An unexpected error occurs when copying a folder or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Paths][FolderPaths Property] does not contain any items, or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path and Destination Path need escaping
+
+Each folder paths in [Folder Paths][FolderPaths Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the folder path (e.g. `@"C:\Source"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### Folder Attributes
+
+When copying the folders at the specified [Folder Paths][FolderPaths Property] or any folder under them to the new [Destination Path][DestinationPath Property], if the copied folder already exists its attributes remain unchanged, otherwise they are copied.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### File Attributes
+
+When copying a file under any of the [Folder Paths][FolderPaths Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes are also copied.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Conflicting Content
+
+If two or more paths in the specified [Folder Paths][FolderPaths Property] contain content (folders or files) with the same name, and [Overwrite][Overwrite Property] and [Content Only][ContentOnly Property] are `true`:
+
+* The attributes of the folder/file in the [Destination Path][DestinationPath Property] will be that of the first one copied.
+* For files, the content of the file in the [Destination Path][DestinationPath Property] will be that of the last one copied.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to copy a folder in [Folder Paths][FolderPaths Property], it will be recorded and the block will continue processing the remaining folders. Once all folders are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FolderPaths Property]: {{< ref "#folder-paths" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[ContentOnly Property]: {{< ref "#content-only" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Rename Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.RenameFolder.RenameFolder.MainDoc" >}}
+[Duplicate Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.DuplicateFolder.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/duplicate-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/duplicate-folder-block.md
new file mode 100644
index 000000000..0cc8ffb25
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/copy-folder/duplicate-folder-block.md
@@ -0,0 +1,181 @@
+---
+title: "Duplicate Folder"
+linkTitle: "Duplicate Folder"
+description: "Copies a folder at the specified folder path to the same location but with a new name."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CopyFolder_DuplicateFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Copies a folder at the specified [Folder Path][FolderPath Property] to the same location but with a [New Name][NewName Property].
+
+## Examples
+
+### Duplicate a folder
+
+This example will make a copy of `"C:\Source\Folder"` at `"C:\Source\CopyOfFolder"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [New Name][NewName Property] | `($)NewName`, with value `"CopyOfFolder"` | `($)NewName` is a variable of type [String][] |
+
+#### Result
+
+Making a copy of `"C:\Source\Folder"` with a new name of `"CopyOfFolder"` will:
+
+* Create a new folder at `"C:\Source\CopyOfFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder"`.
+* Create a new folder at `"C:\Source\CopyOfFolder\SubFolder"` with:
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` set to the time the copy occurred.
+ * The [Folder attributes][] copied from `"C:\Source\Folder\SubFolder"`.
+* Create a new file at `"C:\Source\CopyOfFolder\File.txt"` with:
+ * The content copied from `"C:\Source\Folder\File.txt"`.
+ * The `Date Created` set to the time the copy occurred.
+ * The `Date Accessed` set to the time the copy occurred.
+ * The `Date Modified` copied from `"C:\Source\Folder\File.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\File.txt"`.
+
+***
+
+### Other Copy Operations
+
+If any other folder copying operation is required, the [Copy Folder][] or [Copy Folders][] blocks must be used instead.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to copy the folder and its content from.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### New Name
+
+The [New Name][NewName Property] to use for the copy of the folder.
+
+The [New Name][NewName Property] is case-insensitive and any trailing spaces will be automatically removed.
+
+The [New Name][NewName Property] must be a valid folder name, otherwise an [InvalidFolderNameException][] will be thrown.
+
+All child folders and files copied will have the same names as the folders and files copied.
+
+For information about valid folder names, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidFolderNameException][] | A folder or file with the [New Name][NewName Property] already exists. |
+| | The [New Name][NewName Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`). |
+| | The [New Name][NewName Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] does not exist. |
+| | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | The [Folder Path][FolderPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to copy the folder or any of its content (e.g. not having read access to the [Folder Path][FolderPath Property] or its content, or write access to the parent of [Folder Path][FolderPath Property]. |
+| | An unexpected error occurs when copying the folder or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] or [New Name][NewName Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] or [New Name][NewName Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+### Folder Attributes
+
+When copying the folder at or any folder under the specified [Folder Path][FolderPath Property] all of the folder's attributes are also copied.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### File Attributes
+
+When copying a file under [Folder Path][FolderPath Property] all of the file's attributes are also copied.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to copy [Folder Path][FolderPath Property], an [OperationFailedException][] will be thrown.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[NewName Property]: {{< ref "#new-name" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidFolderNameException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidFolderNameException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Copy Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.CopyFolder.MainDoc" >}}
+[Copy Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.CopyFolders.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/_index.md
new file mode 100644
index 000000000..91e4e4279
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Create Folder(s)"
+linkTitle: "Create Folder(s)"
+description: "Create a folder or multiple folders."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folder-block.md
new file mode 100644
index 000000000..ef24a457f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folder-block.md
@@ -0,0 +1,108 @@
+---
+title: "Create Folder"
+linkTitle: "Create Folder"
+description: "Creates a folder at the specified folder path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CreateFolder_CreateFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Creates a folder at the specified [Folder Path][FolderPath Property].
+
+## Examples
+
+### Create a folder
+
+This example will create `"C:\Source\NewFolder"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\NewFolder"` | `($)FolderPath` is a variable of type [String][] |
+
+#### Result
+
+Creating `"C:\Source\NewFolder"` results in the folder `"NewFolder"` being created in the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to create the folder at.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+Any folders that do not exist in the [Folder Path][FolderPath Property] will be created.
+
+If the [Folder Path][FolderPath Property] already exists, a new folder is not created, and no exception is thrown.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to create the folder at the [Folder Path][FolderPath Property]. |
+| | An unexpected error occurs when creating the folder at the [Folder Path][FolderPath Property] or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] is `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+### Folder Path already exists
+
+If the [Folder Path][FolderPath Property] already exists nothing is created, and no exception is thrown.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folders-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folders-block.md
new file mode 100644
index 000000000..e055574d7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/create-folder/create-folders-block.md
@@ -0,0 +1,115 @@
+---
+title: "Create Folders"
+linkTitle: "Create Folders"
+description: "Create folders at the specified folder paths."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_CreateFolder_CreateFoldersBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Creates folders at the specified [Folder Paths][FolderPaths Property].
+
+## Examples
+
+### Create folders
+
+This example will create `["C:\Source\NewFolder1", "C:\Source\NewFolder2"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\NewFolder1", @"C:\Source\NewFolder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Creating `["C:\Source\NewFolder1", "C:\Source\NewFolder2"]` results in the folders `"NewFolder1"` and `"NewFolder2"` being create in the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### Folder Paths
+
+The [Folder Paths][FolderPaths Property] to create the folders at.
+
+Each folder path in [Folder Paths][FolderPaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+Any folders that do not exist in any of the [Folder Paths][FolderPaths Property] will be created.
+
+If a folder in [Folder Paths][FolderPaths Property] already exists, a new folder is not created, and no exception is thrown.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPaths` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | Any folder path in [Folder Paths][FolderPaths Property] is `null` or empty (i.e. `""`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is duplicated. |
+| | Any folder path in [Folder Paths][FolderPaths Property] points to a file. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains leading spaces. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | Any folder path in [Folder Paths][FolderPaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to create a folder in the [Folder Paths][FolderPaths Property]. |
+| | An unexpected error occurs when creating a folder in the [Folder Paths][FolderPaths Property] or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Paths][FolderPaths Property] does not contain any items. | |
+| [PropertyNullException][] | Thrown when [Folder Paths][FolderPaths Property] is `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Paths need escaping
+
+Each folder path in [Folder Paths][FolderPaths Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the folder path (e.g. `@"C:\Source"`).
+
+### Folder Path already exists
+
+If a folder path in [Folder Paths][FolderPaths Property] already exists nothing is created, and no exception is thrown.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to create a folder in [Folder Paths][FolderPaths Property], it will be recorded and the block will continue processing the remaining folders. Once all folders are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FolderPaths Property]: {{< ref "#folder-paths" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/_index.md
new file mode 100644
index 000000000..e4e10375e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Delete File(s)"
+linkTitle: "Delete File(s)"
+description: "Delete a file or multiple files."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-file-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-file-block.md
new file mode 100644
index 000000000..a3596286b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-file-block.md
@@ -0,0 +1,110 @@
+---
+title: "Delete File"
+linkTitle: "Delete File"
+description: "Deletes a file at the specified file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_DeleteFile_DeleteFileBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Deletes a file at the specified [File Path][FilePath Property].
+
+## Examples
+
+### Delete a file
+
+This example will delete `"C:\Source\File.txt"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+
+#### Result
+
+Deleting `"C:\Source\File.txt"` results in the file `"File.txt"` being deleted from the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to delete the file from.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+If the [File Path][FilePath Property] exists it is permanently deleted; it does not go into a recycle bin.
+
+If the [File Path][FilePath Property] does not exist no exception is thrown.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The file at the specified [File Path][FilePath Property] is read-only. |
+| | The file at the specified [File Path][FilePath Property] is in use by another application. |
+| | The user the flow is executing as does not have the required permissions to delete the file. |
+| | An unexpected error occurs when deleting the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### File Path does not exist
+
+If the [File Path][FilePath Property] does not exist nothing is deleted, and no exception is thrown.
+
+[FilePath Property]: {{< ref "#file-path" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-files-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-files-block.md
new file mode 100644
index 000000000..1f775355a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-file/delete-files-block.md
@@ -0,0 +1,121 @@
+---
+title: "Delete Files"
+linkTitle: "Delete Files"
+description: "Deletes files at the specified file paths."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_DeleteFile_DeleteFilesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Deletes files at the specified [File Paths][FilePaths Property].
+
+## Examples
+
+### Delete files
+
+This example will delete files `["C:\Source\File1.txt", "C:\Source\File2.txt"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\File1.txt", @"C:\Source\File2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Deleting `["C:\Source\File1.txt", "C:\Source\File2.txt"]` results in files `"File1.txt"` and `"File2.txt"` being deleted from the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### File Paths
+
+The [File Paths][FilePaths Property] to delete the files from.
+
+Each file path in [File Paths][FilePaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+If a file path in [File Paths][FilePaths Property] exists it is permanently deleted; it does not go into a recycle bin.
+
+If a file path in [File Paths][FilePaths Property] does not exist no exception is recorded for that file path.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePaths` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | Any file path in [File Paths][FilePaths Property] is `null` or empty (i.e. `""`). |
+| | Any file path in [File Paths][FilePaths Property] is duplicated. |
+| | Any file path in [File Paths][FilePaths Property] points to a folder. |
+| | Any file path in [File Paths][FilePaths Property] contains leading spaces. |
+| | Any file path in [File Paths][FilePaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | Any file path in [File Paths][FilePaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any file path in [File Paths][FilePaths Property] is invalid (for example, it is on an unmapped drive). |
+| | Any file path in [File Paths][FilePaths Property] is read-only. |
+| | Any file path in [File Paths][FilePaths Property] is in use by another application. |
+| | The user the flow is executing as does not have the required permissions to delete a file in [File Paths][FilePaths Property]. |
+| | An unexpected error occurs when deleting a file in [File Paths][FilePaths Property]. |
+| [PropertyEmptyException][] | Thrown when [File Paths][FilePaths Property] does not contain any items. |
+| [PropertyNullException][] | Thrown when [File Paths][FilePaths Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Paths need escaping
+
+Each file path in [File Paths][FilePaths Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the
+file path (e.g. `@"C:\Source\File.txt"`).
+
+### File Path does not exist
+
+If a file path in [File Paths][FilePaths Property] does not exist no exception is recorded for that file path.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to delete a file in the [File Paths][FilePaths Property], it will be recorded and the block will continue processing the remaining files. Once all files are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FilePaths Property]: {{< ref "#file-paths" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[Duplicate File Paths]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.IndexesOfDuplicatePaths" >}}
+[Null Or Empty File Paths]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.IndexesOfNullOrEmptyPaths" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/_index.md
new file mode 100644
index 000000000..03f110087
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Delete Folder(s)"
+linkTitle: "Delete Folder(s)"
+description: "Delete a folder or multiple folders."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folder-block.md
new file mode 100644
index 000000000..c10eede1b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folder-block.md
@@ -0,0 +1,163 @@
+---
+title: "Delete Folder"
+linkTitle: "Delete Folder"
+description: "Deletes a folder at the specified folder path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_DeleteFolder_DeleteFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Deletes a folder at the specified [Folder Path][FolderPath Property].
+
+A [Recursive][Recursive Property] option must be set to `true` to be able to delete a folder that contains files and/or other folders. This is to prevent unintentional and destructive deletion of files and folders.
+
+## Examples
+
+### Delete an empty folder
+
+This example will delete `"C:\Source\EmptyFolder"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\EmptyFolder"` | `($)FolderPath` is a variable of type [String][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `false` | `($)Recursive` is a variable of type [Boolean][] |
+
+#### Result
+
+Deleting `"C:\Source\EmptyFolder"` results in the folder `"EmptyFolder"` being deleted from the folder `"C:\Source"`.
+
+***
+
+### Delete a folder and its content
+
+This example will delete `"C:\Source\Folder"` and its content.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * A file named `"FileInFolder.txt"`.
+ * An empty sub-folder named `"EmptySubFolder"`.
+ * An sub-folder named `"SubFolder"` that contains.
+ * A file named `"FileInSubFolder.txt"`.
+
+Therefore, recursive must be set to `true` to ensure child folders and files can be deleted.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `true` | `($)Recursive` is a variable of type [Boolean][] |
+
+#### Result
+
+Deleting `"C:\Source\Folder"` and its content results in:
+
+* File `"FileInSubFolder.txt"` being deleted from the folder `"C:\Source\Folder\SubFolder"`.
+* Folder `"SubFolder"` being deleted from the folder `"C:\Source\Folder"`.
+* Folder `"EmptySubFolder"` being deleted from the folder `"C:\Source\Folder"`.
+* File `"FileInFolder.txt"` being deleted from the folder `"C:\Source\Folder"`.
+* Folder `"Folder"` being deleted from the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to delete the folder from.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Recursive
+
+[Recursive][Recursive Property] option that must be set to `true` to be able to delete a folder that contains files and/or other folders.
+
+If [Recursive][Recursive Property] is set to `false`, only an empty folder will be able to be deleted; for a non-empty folder an [OperationFailedException][] will be thrown.
+
+By default, this is set to `false` to prevent unintentional and destructive deletion of files and folders.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The folder at the [Folder Path][FolderPath Property] is not empty and recursive is `false`. |
+| | The folder at the [Folder Path][FolderPath Property] or any sub-folders are read-only or contain read-only files and/or folders.
+| | The user the flow is executing as does not have the required permissions to delete the folder at the [Folder Path][FolderPath Property] or any of its content. |
+| | An unexpected error occurs when deleting the folder at the [Folder Path][FolderPath Property] or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] is `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+### Folder Path does not exist
+
+If the [Folder Path][FolderPath Property] does not exist nothing is deleted, and no exception is thrown.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to delete [Folder Path][FolderPath Property], an [OperationFailedException][] will be thrown.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[Recursive Property]: {{< ref "#recursive" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md
new file mode 100644
index 000000000..72118f5f9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md
@@ -0,0 +1,177 @@
+---
+title: "Delete Folders"
+linkTitle: "Delete Folders"
+description: "Deletes folders at the specified folder paths."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_DeleteFolder_DeleteFoldersBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Deletes folders at the specified [Folder Paths][FolderPaths Property].
+
+A [Recursive][Recursive Property] option must be set to `true` to be able to delete folders that contain files and/or other folders. This is to prevent unintentional and destructive deletion of files and folders.
+
+## Examples
+
+### Delete empty folders
+
+This example will delete `["C:\Source\EmptyFolder1", "C:\Source\EmptyFolder2"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\EmptyFolder1", @"C:\Source\EmptyFolder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `false` | `($)Recursive` is a variable of type [Boolean][] |
+
+#### Result
+
+Deleting `["C:\Source\EmptyFolder1", "C:\Source\EmptyFolder2"]` results in the folders `"EmptyFolder1"` and `"EmptyFolder2"` being deleted from the folder `"C:\Source"`.
+
+***
+
+### Delete folders and their content
+
+This example will delete `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * A file named `"FileInFolder1.txt"`.
+ * An empty sub-folder named `"EmptySubFolder1"`.
+ * An sub-folder named `"SubFolder1"` that contains.
+ * A file named `"FileInSubFolder1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * A file named `"FileInFolder2.txt"`.
+ * An empty sub-folder named `"EmptySubFolder2"`.
+ * An sub-folder named `"SubFolder2"` that contains.
+ * A file named `"FileInSubFolder2.txt"`.
+
+Therefore, recursive must be set to `true` to ensure child folders and files can be deleted.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `true` | `($)Recursive` is a variable of type [Boolean][] |
+
+#### Result
+
+Deleting `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` and their content results in:
+
+* File `"FileInSubFolder1.txt"` being deleted from the folder `"C:\Source\Folder1\SubFolder1"`.
+* File `"FileInSubFolder2.txt"` being deleted from the folder `"C:\Source\Folder2\SubFolder2"`.
+* Folder `"SubFolder1"` being deleted from the folder `"C:\Source\Folder1"`.
+* Folder `"SubFolder2"` being deleted from the folder `"C:\Source\Folder2"`.
+* Folder `"EmptySubFolder1"` being deleted from the folder `"C:\Source\Folder1"`.
+* Folder `"EmptySubFolder2"` being deleted from the folder `"C:\Source\Folder2"`.
+* File `"FileInFolder1.txt"` being deleted from the folder `"C:\Source\Folder1"`.
+* File `"FileInFolder2.txt"` being deleted from the folder `"C:\Source\Folder2"`.
+* Folder `"Folder1"` being deleted from the folder `"C:\Source"`.
+* Folder `"Folder2"` being deleted from the folder `"C:\Source"`.
+
+***
+
+## Properties
+
+### Folder Paths
+
+The [Folder Paths][FolderPaths Property] to delete the folders from.
+
+Each folder path in [Folder Paths][FolderPaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPaths` with no value |
+
+### Recursive
+
+[Recursive][Recursive Property] option that must be set to `true` to be able to delete folders that contain files and/or other folders.
+
+If [Recursive][Recursive Property] is set to `false`, only empty folders will be able to be deleted; for non-empty folders an [OperationFailedException][] will be thrown.
+
+By default, this is set to `false` to prevent unintentional and destructive deletion of files and folders.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | Any folder path in [Folder Paths][FolderPaths Property] is `null` or empty (i.e. `""`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is duplicated. For more information, see [Duplicate Folder Paths][]. |
+| | Any folder path in [Folder Paths][FolderPaths Property] points to a file. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains leading spaces. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | Any folder path in [Folder Paths][FolderPaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is not empty and recursive is `false`. |
+| | Any folder path in [Folder Paths][FolderPaths Property] or any of their sub-folders are read-only or contain read-only files and/or folders.
+| | The user the flow is executing as does not have the required permissions to delete a folder in the [Folder Paths][FolderPaths Property] or any of its content. |
+| | An unexpected error occurs when deleting a folder in the [Folder Paths][FolderPaths Property] or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Paths][FolderPaths Property] does not contain any items. | |
+| [PropertyNullException][] | Thrown when [Folder Paths][FolderPaths Property] is `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Paths need escaping
+
+Each folder path in [Folder Paths][FolderPaths Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the folder path (e.g. `@"C:\Source"`).
+
+### Folder Path does not exist
+
+If a folder path in [Folder Paths][FolderPaths Property] does not exist no exception is recorded for that folder path.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to delete a folder in [Folder Paths][FolderPaths Property], it will be recorded and the block will continue processing the remaining folders. Once all folders are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FolderPaths Property]: {{< ref "#folder-paths" >}}
+[Recursive Property]: {{< ref "#recursive" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+
+[Duplicate Folder Paths]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.DuplicateFolder.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/_index.md
new file mode 100644
index 000000000..e2945e03a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get File Information"
+linkTitle: "Get File Information"
+description: "Get information about a file (i.e. file attributes, created, accessed and modified dates etc.)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/get-file-information-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/get-file-information-block.md
new file mode 100644
index 000000000..f788b2e41
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-file-information/get-file-information-block.md
@@ -0,0 +1,154 @@
+---
+title: "Get File Information"
+linkTitle: "Get File Information"
+description: "Gets information about a file (e.g. file attributes, created, accessed, modified dates etc.) at the specified file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_GetFileInformation_GetFileInformationBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets [File Information][FileInformation Property] about a file (e.g. file attributes, created, accessed, modified dates etc.) at the specified [File Path][FilePath Property].
+
+## Examples
+
+### Get file information
+
+This example will get information about `"C:\Source\File.txt"`.
+
+In this example assume `"C:\Source\File.txt"`:
+
+* Is on a server where local time and UTC time are the same (e.g. in UK).
+* Was created at 10.00am on the 1st January 2021.
+* Was last modified at 10.00am on the 1st January 2021.
+* Was last accessed at 1.00pm on the 10th January 2021.
+* Is 100 bytes in size.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [File Information][FileInformation Property] | `($)FileInformation`, with no value | `($)FilePath` is a variable that will be set to a [FileInformation][] value |
+
+#### Result
+
+Getting file information for `"C:\Source\File.txt"` results in the variable `($)FileInformation` being updated to the following:
+
+```json
+{
+ "Extension": ".exe",
+ "Path": "C:\\Source\\File.txt",
+ "Name": "File.txt",
+ "ParentRoot": "C:\\",
+ "ParentPath": "C:\\Source",
+ "SizeInBytes": 100,
+ "IsArchive": false,
+ "IsCompressed": false,
+ "IsEncrypted": false,
+ "IsHidden": false,
+ "IsNormal": false,
+ "IsTemporary": false,
+ "IsReadOnly": false,
+ "IsSystem": false,
+ "CreationTimeLocal": "2021-01-01T10:00:00+00:00",
+ "CreationTimeUtc": "2021-01-01T10:00:00Z",
+ "LastAccessTimeLocal": "2021-01-10T13:00:00+00:00",
+ "LastAccessTimeUtc": "2021-01-10T13:00:00Z",
+ "LastWriteTimeLocal": "2021-01-01T10:00:00+00:00",
+ "LastWriteTimeUtc": "2021-01-01T10:00:00Z"
+}
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to get the [File Information][FileInformation Property] of.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### File Information
+
+The [File Information][FileInformation Property] retrieved from the file at the specified [File Path][FilePath Property].
+
+[File Information][FileInformation Property] includes file attributes, create, access and write dates and path details.
+
+For more information see the [example][] above, or the [FileInformation][] data type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [FileInformation][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FileInformation` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder or file names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to get information about the file at the [File Path][FilePath Property]. |
+| | An unexpected error occurs when getting information for the file at the [File Path][FilePath Property]. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[FileInformation Property]: {{< ref "#file-information" >}}
+[Example]: {{< ref "#get-file-information" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[FileInformation]: {{< url path="Cortex.Reference.DataTypes.FilesAndFolders.FileInformation.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/_index.md
new file mode 100644
index 000000000..4c4696535
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Folder Content"
+linkTitle: "Get Folder Content"
+description: "Get the paths of files or folders in another folder."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/get-folder-content-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/get-folder-content-block.md
new file mode 100644
index 000000000..80f16e84f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-content/get-folder-content-block.md
@@ -0,0 +1,389 @@
+---
+title: "Get Folder Content"
+linkTitle: "Get Folder Content"
+description: "Gets the paths of files or folders under the specified folder path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_GetFolderContent_GetFolderContentBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Paths][Paths Property] of files or folders under the specified [Folder Path][FolderPath Property] whose name matches the given [Search Pattern][SearchPattern Property].
+
+The returned [Paths][Paths Property] can then be used in other file and folder blocks that require paths.
+
+Additional options can be specified:
+
+* [Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search.
+* [Content Options][ContentOptions Property] can be specified to choose whether to search for files or folders.
+* A [Recursive][Recursive Property] option can specified to choose whether to search only in the specified [Folder Path][FolderPath Property], or include all subfolders.
+* A [Comparison Type][ComparisonType Property] option can specified to choose how it is determined whether the file or folder name matches the [Search Pattern][SearchPattern Property] (e.g. whether the search is case-sensitive or case-insensitive).
+
+## Examples
+
+### Get paths of files in a folder whose names contain a given text
+
+This example will get the paths of all files in `"C:\Source\Folder"` that contain `"file"` in their name.
+
+It will perform a case-insensitive search, and will not get any paths of folders or any paths of files that reside in subfolders of `"C:\Source\Folder"`.
+
+In this example assume `"C:\Source\Folder"` contains:
+
+* A file named `"FileInFolder1.txt"`.
+* A file named `"FileInFolder2.txt"`.
+* A folder named `"SubFolder"` which contains:
+ * A file named `"FileInSubFolder1.txt"`.
+ * A file named `"FileInSubFolder2.txt"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"file"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Content Options][ContentOptions Property] | `($)ContentOptions`, with value `ContentOptions.Files` | `($)ContentOptions` is a variable of type [ContentOptions][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `false` | `($)Recursive` is a variable of type [Boolean][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Paths][Paths Property] | `($)Paths`, with no value | `($)Paths` is a variable that will be set to an [IList][]<[String][]> value |
+
+#### Result
+
+Getting all file paths that contain `"file"` (case-insensitive) in `"C:\Source\Folder"` excluding any of its subfolders, results in the variable `($)Paths` being updated to the following:
+
+```json
+[
+ "C:\\Source\\Folder\\FileInFolder1.txt",
+ "C:\\Source\\Folder\\FileInFolder2.txt"
+]
+```
+
+***
+
+### Get paths of files in a folder (and its subfolders) whose names contain a given text
+
+This example will get the paths of all files in `"C:\Source\Folder"` or any of its subfolders, that contain `"File"` in their name.
+
+It will perform a case-sensitive search and will not get any paths of folders.
+
+In this example assume `"C:\Source\Folder"` contains:
+
+* A file named `"FileInFolder1.txt"`.
+* A file named `"FileInFolder2.txt"`.
+* A folder named `"SubFolder"` which contains:
+ * A file named `"FileInSubFolder1.txt"`.
+ * A file named `"FileInSubFolder2.txt"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"File"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Content Options][ContentOptions Property] | `($)ContentOptions`, with value `ContentOptions.Files` | `($)ContentOptions` is a variable of type [ContentOptions][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `true` | `($)Recursive` is a variable of type [Boolean][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Paths][Paths Property] | `($)Paths`, with no value | `($)Paths` is a variable that will be set to an [IList][]<[String][]> value |
+
+#### Result
+
+Getting all file paths that contain `"File"` (case-sensitive) in `"C:\Source\Folder"` or any of its subfolders, results in the variable `($)Paths` being updated to the following:
+
+```json
+[
+ "C:\\Source\\Folder\\FileInFolder1.txt",
+ "C:\\Source\\Folder\\FileInFolder2.txt",
+ "C:\\Source\\Folder\\SubFolder\\FileInSubFolder1.txt",
+ "C:\\Source\\Folder\\SubFolder\\FileInSubFolder2.txt"
+]
+```
+
+***
+
+### Get paths of folders in a folder whose names match a given pattern
+
+This example will get the paths of all folders that are in `"C:\Source\Folder"`, and match the pattern `"*"` in their name.
+
+It will perform a case-insensitive search, will not get any paths of files, and will match any folder in `"C:\Source\Folder"`. It will not match any child folders of folders in `"C:\Source\Folder"`.
+
+In this example assume `"C:\Source\Folder"` contains:
+
+* A file named `"FileInFolder1.txt"`.
+* A file named `"FileInFolder2.txt"`.
+* A folder named `"SubFolder"` which contains:
+ * A file named `"FileInSubFolder1.txt"`.
+ * A file named `"FileInSubFolder2.txt"`.
+ * An empty folder named `"NestedSubFolder"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"*"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Content Options][ContentOptions Property] | `($)ContentOptions`, with value `ContentOptions.Folders` | `($)ContentOptions` is a variable of type [ContentOptions][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `false` | `($)Recursive` is a variable of type [Boolean][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Paths][Paths Property] | `($)Paths`, with no value | `($)Paths` is a variable that will be set to an [IList][]<[String][]> value |
+
+#### Result
+
+Getting all folder paths that match the pattern `"*"` (case-insensitive) in `"C:\Source\Folder"` excluding any of its subfolders, results in the variable `($)Paths` being updated to the following:
+
+```json
+[
+ "C:\\Source\\Folder\\SubFolder"
+]
+```
+
+***
+
+### Get paths of folders in a folder (and its subfolders) whose names match a given regex
+
+This example will get the paths of all folders that are in `"C:\Source\Folder"` or any of its subfolders, and match the regex `"Folder$"` in their name.
+
+It will perform a case-sensitive search, will not get any paths of files, and will match folders whose name ends with `"Folder"`.
+
+In this example assume `"C:\Source\Folder"` contains:
+
+* A file named `"FileInFolder1.txt"`.
+* A file named `"FileInFolder2.txt"`.
+* A folder named `"SubFolder"` which contains:
+ * A file named `"FileInSubFolder1.txt"`.
+ * A file named `"FileInSubFolder2.txt"`.
+ * An empty folder named `"NestedSubFolder"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"Folder$"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Content Options][ContentOptions Property] | `($)ContentOptions`, with value `ContentOptions.Folders` | `($)ContentOptions` is a variable of type [ContentOptions][] |
+| [Recursive][Recursive Property] | `($)Recursive`, with value `true` | `($)Recursive` is a variable of type [Boolean][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Paths][Paths Property] | `($)Paths`, with no value | `($)Paths` is a variable that will be set to an [IList][]<[String][]> value |
+
+#### Result
+
+Getting all folder paths that match the regex `"Folder$"` (case-sensitive) in `"C:\Source\Folder"` or any of its subfolders, results in the variable `($)Paths` being updated to the following:
+
+```json
+[
+ "C:\\Source\\Folder\\SubFolder",
+ "C:\\Source\\Folder\\SubFolder\\NestedSubFolder"
+]
+```
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to get the [Paths][Paths Property] of files or folders whose name matches the given [Search Pattern][SearchPattern Property].
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Search Pattern
+
+The [Search Pattern][SearchPattern Property] file or folder names must match to be included in the returned [Paths][Paths Property].
+
+Only file or folder names are matched, not the whole path.
+
+A [Search Pattern][SearchPattern Property] of `null` or empty (i.e. `""`) means match any name; all additional block options such as [Content Options][ContentOptions Property] etc. still take effect.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Search Pattern][SearchPattern Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the file or folder name contains the text specified in [Search Pattern][SearchPattern Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Content Options
+
+[Content Options][ContentOptions Property] can be specified to choose whether [Search Pattern][SearchPattern Property] should be match file or folder names.
+
+* ContentOptions.Files restricts the search to match only files.
+* ContentOptions.Folders restricts the search to match only folders.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ContentOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `Files` |
+
+### Recursive
+
+[Recursive][Recursive Property] option can specified to choose whether to search only in the specified [Folder Path][FolderPath Property], or include all subfolders.
+
+To search only in the specified [Folder Path][FolderPath Property] set [Recursive][Recursive Property] to `false`, or to include all subfolders set [Recursive][Recursive Property] to `true`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match file or folder names against the given [Search Pattern][SearchPattern Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Paths
+
+All [Paths][Paths Property] that match the specified [Search Pattern][SearchPattern Property] based on the other specified options.
+
+The [Paths][Paths Property] returned will be absolute paths, and based on the [Folder Path][FolderPath Property] provided (i.e. if a UNC path is specified, all returned paths will be UNC paths).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[String][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Paths` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| | Thrown when [Content Options][ContentOptions Property] is not one of the specified [ContentOptions][] types (e.g. `(ContentOptions)10`). |
+| | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to get the paths of files or folders in the [Folder Path][FolderPath Property], or any of its subfolders if [Recursive][Recursive Property] is `true`. |
+| | An unexpected error occurs when getting the paths of files or folders in the [Folder Path][FolderPath Property], or any of its subfolders if [Recursive][Recursive Property] is `true`. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] is `null`. |
+| [RegexMatchTimeoutException][] | Thrown when using [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and the [Search Pattern][SearchPattern Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+### Null or empty Search Pattern
+
+A `null` or empty (i.e. `""`) [Search Pattern][SearchPattern Property] means match any name; all additional block options such as [Content Options][ContentOptions Property] etc. still take effect.
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to match a file or folder name, it will be recorded and the block will continue processing the remaining files or folders. Once all files or folders are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[SearchPattern Property]: {{< ref "#search-pattern" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ContentOptions Property]: {{< ref "#content-options" >}}
+[Recursive Property]: {{< ref "#recursive" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Paths Property]: {{< ref "#paths" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+[ContentOptions]: {{< url path="Cortex.Reference.DataTypes.FilesAndFolders.ContentOptions.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/_index.md
new file mode 100644
index 000000000..9b3213535
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Folder Information"
+linkTitle: "Get Folder Information"
+description: "Get information about a folder (i.e. folder attributes, created, accessed and modified dates etc.)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/get-folder-information-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/get-folder-information-block.md
new file mode 100644
index 000000000..8f53d6999
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/get-folder-information/get-folder-information-block.md
@@ -0,0 +1,158 @@
+---
+title: "Get Folder Information"
+linkTitle: "Get Folder Information"
+description: "Gets information about a folder (e.g. folder attributes, created, accessed, modified dates etc.) at the specified folder path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_GetFolderInformation_GetFolderInformationBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets [Folder Information][FolderInformation Property] about a folder (e.g. folder attributes, created, accessed, modified dates etc.) at the specified [Folder Path][FolderPath Property].
+
+## Examples
+
+### Get folder information
+
+This example will get information about `"C:\Source\Folder"`.
+
+In this example assume `"C:\Source\Folder"`:
+
+* Is on a server where local time and UTC time are the same (e.g. in UK).
+* Was created at 10.00am on the 1st January 2021.
+* Was last modified at 10.00am on the 1st January 2021.
+* Was last accessed at 1.00pm on the 10th January 2021.
+* Contains a single file named `"File.txt"` which is 100 bytes in size.
+* Contains a single empty folder named `"SubFolder"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Folder Information][FolderInformation Property] | `($)FolderInformation`, with no value | `($)FolderPath` is a variable that will be set to a [FolderInformation][] value |
+
+#### Result
+
+Getting folder information for `"C:\Source\Folder"` results in the variable `($)FolderInformation` being updated to the following:
+
+```json
+{
+ "FileCount": 1,
+ "FolderCount": 1,
+ "TotalItemCount": 2,
+ "Path": "C:\\Source\\Folder",
+ "Name": "Test",
+ "ParentRoot": "C:\\",
+ "ParentPath": "C:\\Source",
+ "SizeInBytes": 100,
+ "IsArchive": false,
+ "IsCompressed": false,
+ "IsEncrypted": false,
+ "IsHidden": false,
+ "IsNormal": false,
+ "IsTemporary": false,
+ "IsReadOnly": false,
+ "IsSystem": false,
+ "CreationTimeLocal": "2021-01-01T10:00:00+00:00",
+ "CreationTimeUtc": "2021-01-01T10:00:00Z",
+ "LastAccessTimeLocal": "2021-01-10T13:00:00+00:00",
+ "LastAccessTimeUtc": "2021-01-10T13:00:00Z",
+ "LastWriteTimeLocal": "2021-01-01T10:00:00+00:00",
+ "LastWriteTimeUtc": "2021-01-01T10:00:00Z"
+}
+```
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to get the [Folder Information][FolderInformation Property] of.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Folder Information
+
+The [Folder Information][FolderInformation Property] retrieved from the folder at the specified [Folder Path][FolderPath Property].
+
+[Folder Information][FolderInformation Property] includes folder attributes, create, access and write dates, path details and folder and file counts.
+
+For more information see the [example][] above, or the [FolderInformation][] data type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [FolderInformation][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderInformation` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to get information about the folder at the [Folder Path][FolderPath Property]. |
+| | An unexpected error occurs when getting information for the folder at the [Folder Path][FolderPath Property] or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] is `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[FolderInformation Property]: {{< ref "#folder-information" >}}
+
+[Example]: {{< ref "#get-folder-information" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[FolderInformation]: {{< url path="Cortex.Reference.DataTypes.FilesAndFolders.FolderInformation.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/_index.md
new file mode 100644
index 000000000..72624ef3e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Move File(s)"
+linkTitle: "Move File(s)"
+description: "Move a file or multiple files."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-file-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-file-block.md
new file mode 100644
index 000000000..f28976562
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-file-block.md
@@ -0,0 +1,223 @@
+---
+title: "Move File"
+linkTitle: "Move File"
+description: "Moves a file at the specified file path to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_MoveFile_MoveFileBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Moves a file at the specified [File Path][FilePath Property] to the given [Destination Path][DestinationPath Property], with an option to [Overwrite][Overwrite Property] the file if it already exists.
+
+## Examples
+
+### Move a file to a folder keeping the same file name
+
+This example will move `"C:\Source\OriginalFile.txt"` to `"C:\Destination"`, with the same file name of `"OriginalFile.txt"`.
+
+In this example assume `"C:\Destination"` does not already contain a file named `"OriginalFile.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\OriginalFile.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\OriginalFile.txt"` to `"C:\Destination"` that does not already contain a file named `"OriginalFile.txt"` will:
+
+* Move `"C:\Source\OriginalFile.txt"` to `"C:\Destination\OriginalFile.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move a file to a folder with a new name
+
+This example will move `"C:\Source\OriginalFile.txt"` to `"C:\Destination"`, with a new file name of `"NewFile.txt"`.
+
+To rename the file when it is being moved, please note that the [Destination Path][DestinationPath Property] must be a file path, rather than a folder path (e.g. `"C:\Destination\NewFile.txt"` rather than `"C:\Destination"`).
+
+In this example assume `"C:\Destination"` does not already contain a file named `"NewFile.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\OriginalFile.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination\NewFile.txt"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Move `"C:\Source\OriginalFile.txt"` to the path `"C:\Destination\NewFile.txt"` that does not already exist will:
+
+* Move `"C:\Source\OriginalFile.txt"` to `"C:\Destination\NewFile.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move a file to a folder overwriting any file that already exists with the same name
+
+This example will move `"C:\Source\FileAlreadyExists.txt"` to `"C:\Destination"`, with the same file name of `"FileAlreadyExists.txt"`.
+
+In this example assume `"C:\Destination"` already contains a file named `"FileAlreadyExists.txt"`, so overwrite must be set to `true` to ensure the content of the existing file can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\FileAlreadyExists.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\FileAlreadyExists.txt"` to `"C:\Destination"` and overwriting the existing file named `"FileAlreadyExists.txt"` will:
+
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists.txt"`.
+ * The `Date Created` copied from `"C:\Source\FileAlreadyExists.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\FileAlreadyExists.txt"`
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists.txt"`.
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to move the file from.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to move the file to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] can either point to a folder or a file:
+
+* If it points to a folder, the moved file will have the name specified in the [File Path][FilePath Property].
+* If it points to a file, the moved file will have the name specified in the [Destination Path][DestinationPath Property].
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the file in the [Destination Path][DestinationPath Property] if it already exists.
+
+If the file exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [Destination Path][DestinationPath Property] (if it points to a file), or the [Destination Path][DestinationPath Property] (if it points to a folder) plus the file name, exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [File Path][FilePath Property] does not exist. |
+| | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The file in the specified [Destination Path][DestinationPath Property] exists and overwrite is `false`. |
+| | The file in the specified [Destination Path][DestinationPath Property] exists, is read-only and overwrite is `true`. |
+| | The user the flow is executing as does not have the required permissions to move the file (e.g. not having read access to the [File Path][FilePath Property] or write access to the [Destination Path][DestinationPath Property]). |
+| | An unexpected error occurs when moving the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### File and Folder Paths
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path and Destination Path need escaping
+
+[File Path][FilePath Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\OriginalFile.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\OriginalFile.txt"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### File Attributes
+
+When moving a file from the [File Path][FilePath Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes will also be moved.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-files-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-files-block.md
new file mode 100644
index 000000000..b99f6d675
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-file/move-files-block.md
@@ -0,0 +1,214 @@
+---
+title: "Move Files"
+linkTitle: "Move Files"
+description: "Moves files at the specified file paths to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_MoveFile_MoveFilesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Moves files at the specified [File Paths][FilePaths Property] to the given [Destination Path][DestinationPath Property], with an option to [Overwrite][Overwrite Property] the files if they already exist.
+
+## Examples
+
+### Move files to a folder keeping the same file names
+
+This example will move `["C:\Source\OriginalFile1.txt", "C:\Source\OriginalFile2.txt"]` to `"C:\Destination"`, with the same file names of `"OriginalFile1.txt"` and `"OriginalFile2.txt"`.
+
+In this example assume `"C:\Destination"` does not already contain a file named `"OriginalFile1.txt"` or a file named `"OriginalFile2.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\OriginalFile1.txt", @"C:\Source\OriginalFile2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\OriginalFile1.txt", "C:\Source\OriginalFile2.txt"]` to `"C:\Destination"` that does not already contain files named `"OriginalFile1.txt"` and `"OriginalFile2.txt"` will:
+
+* Move `"C:\Source\OriginalFile1.txt"` to `"C:\Destination\OriginalFile1.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Move `"C:\Source\OriginalFile2.txt"` to `"C:\Destination\OriginalFile2.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move files to a folder overwriting any files that already exists with the same names
+
+This example will move `["C:\Source\FileAlreadyExists1.txt", "C:\Source\FileAlreadyExists2.txt"]` to `"C:\Destination"`, with the same file names of `"FileAlreadyExists1.txt"` and `"FileAlreadyExists2.txt"`.
+
+In this example assume `"C:\Destination"` already contains a file named `"FileAlreadyExists1.txt"` and a file named `"FileAlreadyExists2.txt"`, so overwrite must be set to `true` to ensure the content of the existing files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\FileAlreadyExists1.txt", @"C:\Source\FileAlreadyExists2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\FileAlreadyExists1.txt", "C:\Source\FileAlreadyExists2.txt"]` to `"C:\Destination"` and overwriting the existing files named `"FileAlreadyExists1.txt"` and `"FileAlreadyExists2.txt"` will:
+
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists1.txt"`.
+ * The `Date Created` copied from `"C:\Source\FileAlreadyExists1.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\FileAlreadyExists1.txt"`
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists1.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists1.txt"`.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The `Date Created` copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The `Date Modified` copied from `"C:\Source\FileAlreadyExists2.txt"`.
+ * The [File Attributes][] copied from `"C:\Source\FileAlreadyExists2.txt"`.
+
+***
+
+## Properties
+
+### File Paths
+
+The [File Paths][FilePaths Property] to move the files from.
+
+Each file path in [File Paths][FilePaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePaths` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to move the files to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The moved files will have the names specified in the [File Paths][FilePaths Property].
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the files in the [Destination Path][DestinationPath Property] if they already exist.
+
+If any file exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] does not point to a folder. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [Destination Path][DestinationPath Property] (if it points to a file), or the [Destination Path][DestinationPath Property] (if it points to a folder) plus the file name, exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | Any file path in [File Paths][FilePaths Property] is `null` or empty (i.e. `""`). |
+| | Any file path in [File Paths][FilePaths Property] is duplicated. |
+| | Any file path in [File Paths][FilePaths Property] does not exist. |
+| | Any file path in [File Paths][FilePaths Property] points to a folder. |
+| | Any file path in [File Paths][FilePaths Property] contains leading spaces. |
+| | Any file path in [File Paths][FilePaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | Any file path in [File Paths][FilePaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any file path in [File Paths][FilePaths Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | Any file path in [File Paths][FilePaths Property] exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file path in [File Paths][FilePaths Property] exists in the specified [Destination Path][DestinationPath Property] with the same name, is read-only and overwrite is `true`. |
+| | The user the flow is executing as does not have the required permissions to move any file (e.g. not having read access to a file path in [File Paths][FilePaths Property] or write access to the [Destination Path][DestinationPath Property]). |
+| | An unexpected error occurs when moving a file. |
+| [PropertyEmptyException][] | Thrown when [File Paths][FilePaths Property] does not contain any items, or [Destination Path][DestinationPath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Paths][FilePaths Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### File and Folder Paths
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Paths and Destination Path need escaping
+
+Each file path in [File Paths][FilePaths Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\OriginalFile.txt"`), or
+* Prepending an `@` character before the start of the
+file path (e.g. `@"C:\Source\OriginalFile.txt"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### File Attributes
+
+When moving a file in the [File Paths][FilePaths Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes will also be moved.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to move a file in the [File Paths][FilePaths Property], it will be recorded and the block will continue processing the remaining files. Once all files are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FilePaths Property]: {{< ref "#file-paths" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/_index.md
new file mode 100644
index 000000000..facdb6dda
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Move Folder(s)"
+linkTitle: "Move Folder(s)"
+description: "Move a folder or folders."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folder-block.md
new file mode 100644
index 000000000..b36340253
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folder-block.md
@@ -0,0 +1,384 @@
+---
+title: "Move Folder"
+linkTitle: "Move Folder"
+description: "Moves a folder at the specified folder path to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_MoveFolder_MoveFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Moves a folder at the specified [Folder Path][FolderPath Property] to the given [Destination Path][DestinationPath Property], with an option to move the folder and its content, or just its [Content Only][ContentOnly Property].
+
+An option can also be specified to [Overwrite][Overwrite Property] anything being moved that already exists in the [Destination Path][DestinationPath Property].
+
+## Examples
+
+### Move a folder and its content
+
+This example will move `"C:\Source\Folder"` and its content to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"Folder"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\Folder"` and its content to `"C:\Destination"` that does not already contain a folder named `"Folder"` will:
+
+* Move `"C:\Source\Folder"` to `"C:\Destination\Folder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\SubFolder"` to `"C:\Destination\Folder\SubFolder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\File.txt"` to `"C:\Destination\Folder\File.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move a folder and its content, overwriting any content that already exists
+
+This example will move `"C:\Source\Folder"` and its content to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists"`.
+ * A file named `"File.txt"`.
+ * A file named `"FileAlreadyExists.txt"`.
+* `"C:\Destination"` already contains a folder named `"Folder"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists"`.
+ * A file named `"FileAlreadyExists.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing `"SubFolderAlreadyExists"` and `"FileAlreadyExists.txt"` can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\Folder"` and its content to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\Folder"`, `"C:\Destination\Folder\SubFolderAlreadyExists"` and `"C:\Destination\Folder\FileAlreadyExists.txt"` already exist will:
+
+* Overwrite the existing folder at `"C:\Destination\Folder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the move occurred.
+ * The `Date Modified` set to the time the move occurred.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\SubFolder"` to `"C:\Destination\Folder\SubFolder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\Folder\SubFolderAlreadyExists"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\File.txt"` to `"C:\Destination\Folder\File.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\Folder\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+
+***
+
+### Move a folder's content only
+
+This example will move `"C:\Source\Folder"` content only to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"SubFolder"` or a file named `"File.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\Folder"` content only to `"C:\Destination"` that does not already contain a folder named `"SubFolder"` or a file named `"File.txt"` will:
+
+* Move `"C:\Source\Folder\SubFolder"` to `"C:\Destination\SubFolder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\File.txt"` to `"C:\Destination\File.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move a folder's content only, overwriting any content that already exists
+
+This example will move `"C:\Source\Folder"` content only to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists"`.
+ * A file named `"File.txt"`.
+ * A file named `"FileAlreadyExists.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"SubFolderAlreadyExists"`.
+ * A file named `"FileAlreadyExists.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing `"SubFolderAlreadyExists"` and `"FileAlreadyExists.txt"` can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `"C:\Source\Folder"` content only to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\SubFolderAlreadyExists"` and `"C:\Destination\FileAlreadyExists.txt"` already exist will:
+
+* Move `"C:\Source\Folder\SubFolder"` to `"C:\Destination\SubFolder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder\File.txt"` to `"C:\Destination\File.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists.txt"` with:
+ * The content copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder\FileAlreadyExists.txt"`.
+
+***
+
+### Move a folder and its content to the same location but with a different name
+
+If it is required to move a folder and its content into the same folder it is currently located in, but with a different name, then it is not possible to do with this block; the [Rename Folder][] block must be used instead.
+
+***
+
+### Move a folder and its content to a different location but with a different name
+
+If it is required to move a folder and its content into a different folder than the one it is currently located in, but with a different name, it is not possible to do with a single block; you must use a combination of this block and the [Rename Folder][] block.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] to move the folder and/or its content from.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to move the folder and/or its content to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The moved folders and files will have the same names as the folders and files moved.
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the folder and/or contents being moved to in the [Destination Path][DestinationPath Property] if they already exist.
+
+If the folder and/or contents exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing folders and files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Content Only
+
+Option to specify whether to move the folder and its content or just the [Content Only][ContentOnly Property].
+
+To move the folder and its content, [Content Only][ContentOnly Property] must be set to `false`; to move just the content, [Content Only][ContentOnly Property] must be set to `true`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] points to a file. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Destination Path][DestinationPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] does not exist. |
+| | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | The [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The [Folder Path][FolderPath Property] and [Destination Path][DestinationPath Property] point to the same folder and [Content Only][ContentOnly Property] is `true`. |
+| | The [Folder Path][FolderPath Property] is a child folder in the [Destination Path][DestinationPath Property] and [Content Only][ContentOnly Property] is `false`. |
+| | Any file being moved already exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file being moved already exists in the specified [Destination Path][DestinationPath Property], is read-only and overwrite is `true`. |
+| | The user the flow is executing as does not have the required permissions to move the folder or any of its content (e.g. not having read access to the [Folder Path][FolderPath Property] or its content, or write access to the [Destination Path][DestinationPath Property]). |
+| | The operation is cyclic (e.g. moving a folder into one of its sub-folders). |
+| | An unexpected error occurs when moving the folder or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path and Destination Path need escaping
+
+[Folder Path][FolderPath Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### Folder Attributes
+
+When moving the folder at the specified [Folder Path][FolderPath Property] or any folder under it to the new [Destination Path][DestinationPath Property], if the folder already exists in the destination its attributes remain unchanged.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### File Attributes
+
+When moving a file under [Folder Path][FolderPath Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes are also moved.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to move [Folder Path][FolderPath Property], an [OperationFailedException][] will be thrown.
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[ContentOnly Property]: {{< ref "#content-only" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Rename Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.RenameFolder.RenameFolder.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folders-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folders-block.md
new file mode 100644
index 000000000..da4312d0d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/move-folder/move-folders-block.md
@@ -0,0 +1,494 @@
+---
+title: "Move Folders"
+linkTitle: "Move Folders"
+description: "Moves folders at the specified folder paths to the given destination path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_MoveFolder_MoveFoldersBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Moves folders at the specified [Folder Paths][FolderPaths Property] to the given [Destination Path][DestinationPath Property], with an option to move the folders and their content, or just their [Content Only][ContentOnly Property].
+
+An option can also be specified to [Overwrite][Overwrite Property] anything being moved that already exists in the [Destination Path][DestinationPath Property].
+
+## Examples
+
+### Move folders and their content
+
+This example will move `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * A file named `"File1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * A file named `"File2.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"Folder1"` or `"Folder2"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"` that does not already contain folders named `"Folder1"` and `"Folder2"` will:
+
+* Move `"C:\Source\Folder1"` to `"C:\Destination\Folder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\SubFolder1"` to `"C:\Destination\Folder1\SubFolder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\File1.txt"` to `"C:\Destination\Folder1\File1.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Move `"C:\Source\Folder2"` to `"C:\Destination\Folder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\SubFolder2"` to `"C:\Destination\Folder2\SubFolder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\File2.txt"` to `"C:\Destination\Folder2\File2.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move folders and their content, overwriting any content that already exists
+
+This example will move `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"File1.txt"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"File2.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"Folder1"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+ * A folder named `"Folder2"`, which already contains:
+ * A folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing folders and files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `false` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\Folder1", "C:\Source\Folder2"]` and their content to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\Folder1"`, `"C:\Destination\Folder1\SubFolderAlreadyExists1"`, `"C:\Destination\Folder1\FileAlreadyExists1.txt"`, `"C:\Destination\Folder2"`, `"C:\Destination\Folder2\SubFolderAlreadyExists2"` and `"C:\Destination\Folder2\FileAlreadyExists2.txt"` already exist will:
+
+* Overwrite the existing folder at `"C:\Destination\Folder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the move occurred.
+ * The `Date Modified` set to the time the move occurred.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\SubFolder1"` to `"C:\Destination\Folder1\SubFolder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\Folder1\SubFolderAlreadyExists1"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\File1.txt"` to `"C:\Destination\Folder1\File1.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\Folder1\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+* Overwrite the existing folder at `"C:\Destination\Folder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` set to the time the move occurred.
+ * The `Date Modified` set to the time the move occurred.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\SubFolder2"` to `"C:\Destination\Folder2\SubFolder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\Folder2\SubFolderAlreadyExists2"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\File2.txt"` to `"C:\Destination\Folder2\File2.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\Folder2\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+
+***
+
+### Move the folders' content only
+
+This example will move `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"`.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * A file named `"File1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * A file named `"File2.txt"`.
+* `"C:\Destination"` does not already contain a folder named `"SubFolder1"` or `"SubFolder2"` or a file named `"File1.txt"` or `"File2.txt"`, so overwrite can be set to either `true` or `false` and it will still work.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"` that does not already contain a folder named `"SubFolder1"` or `"SubFolder2"` or a file named `"File1.txt"` or `"File2.txt"` will:
+
+* Move `"C:\Source\Folder1\SubFolder1"` to `"C:\Destination\SubFolder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\File1.txt"` to `"C:\Destination\File1.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Move `"C:\Source\Folder2\SubFolder2"` to `"C:\Destination\SubFolder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\File2.txt"` to `"C:\Destination\File2.txt"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+
+***
+
+### Move folders' content only, overwriting any content that already exists
+
+This example will move `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"`, overwriting any content that already exists.
+
+In this example assume:
+
+* `"C:\Source\Folder1"` contains:
+ * An empty sub-folder named `"SubFolder1"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists1"`.
+ * A file named `"File1.txt"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+* `"C:\Source\Folder2"` contains:
+ * An empty sub-folder named `"SubFolder2"`.
+ * An empty sub-folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"File2.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+* `"C:\Destination"` already contains:
+ * A folder named `"SubFolderAlreadyExists1"`.
+ * A folder named `"SubFolderAlreadyExists2"`.
+ * A file named `"FileAlreadyExists1.txt"`.
+ * A file named `"FileAlreadyExists2.txt"`.
+
+Therefore, overwrite must be set to `true` to ensure the existing folders and files can be overwritten.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Paths][FolderPaths Property] | `($)FolderPaths`, with value `[@"C:\Source\Folder1", @"C:\Source\Folder2"]` | `($)FolderPaths` is a variable of type [IEnumerable][]<[String][]> |
+| [Destination Path][DestinationPath Property] | `($)DestinationPath`, with value `@"C:\Destination"` | `($)DestinationPath` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Content Only][ContentOnly Property] | `($)ContentOnly`, with value `true` | `($)ContentOnly` is a variable of type [Boolean][] |
+
+#### Result
+
+Moving `["C:\Source\Folder1", "C:\Source\Folder2"]` content only to `"C:\Destination"` with the [Overwrite][Overwrite Property] option set to `true`, and where `"C:\Destination\SubFolderAlreadyExists1"`, `"C:\Destination\SubFolderAlreadyExists2"`, `"C:\Destination\FileAlreadyExists1.txt"` and `"C:\Destination\FileAlreadyExists2.txt"` already exist will:
+
+* Move `"C:\Source\Folder1\SubFolder1"` to `"C:\Destination\SubFolder1"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists1"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder1\File1.txt"` to `"C:\Destination\File1.txt"` with:
+ * The content copied left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists1.txt"` with:
+ * The content copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder1\FileAlreadyExists1.txt"`.
+* Move `"C:\Source\Folder2\SubFolder2"` to `"C:\Destination\SubFolder2"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Overwrite the existing folder at `"C:\Destination\SubFolderAlreadyExists2"` with:
+ * The content left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* Move `"C:\Source\Folder2\File2.txt"` to `"C:\Destination\File2.txt"` with:
+ * The content copied left unchanged.
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [File attributes][] left unchanged.
+* Overwrite the existing file at `"C:\Destination\FileAlreadyExists2.txt"` with:
+ * The content copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Created` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Accessed` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The `Date Modified` copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+ * The [File attributes][] copied from `"C:\Source\Folder2\FileAlreadyExists2.txt"`.
+
+***
+
+### Move folders and their content to the same location but with a different name
+
+If it is required to move folders and their content into the same folder they are currently located in, but with a different name, then it is not possible to do with this block; the [Rename Folder][] block must be used instead.
+
+***
+
+### Move folders and their content to a different location but with a different name
+
+If it is required to move folders and their content into a different folder than the one they are currently located in, but with a different name, it is not possible to do with a single block; you must use a combination of this block and the [Rename Folder][] block.
+
+***
+
+## Properties
+
+### Folder Paths
+
+The [Folder Paths][FolderPaths Property] to move the folders and/or their content from.
+
+Each folder path in [Folder Paths][FolderPaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPaths` with no value |
+
+### Destination Path
+
+The [Destination Path][DestinationPath Property] to move the folders and/or their content to.
+
+The [Destination Path][DestinationPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+The [Destination Path][DestinationPath Property] must point to a folder, otherwise an [InvalidPathException][] will be thrown.
+
+The moved folders and files will have the same names as the folders and files copied.
+
+Any non-existing folders within the [Destination Path][DestinationPath Property] will be automatically created.
+
+For information about the supported file and folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the folders and/or contents being moved to in the [Destination Path][DestinationPath Property] if they already exist.
+
+If any of the folders and/or contents exists, [Overwrite][Overwrite Property] must be set to `true`, otherwise an [OperationFailedException][] will be thrown. By default, this is set to `false` to avoid implicit and accidental overwriting of existing folders and files.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Content Only
+
+Option to specify whether to move the folders and their content or just the [Content Only][ContentOnly Property].
+
+To move the folders and their content, [Content Only][ContentOnly Property] must be set to `false`; to move just the content, [Content Only][ContentOnly Property] must be set to `true`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPathException][] | The [Destination Path][DestinationPath Property] points to a file. |
+| | The [Destination Path][DestinationPath Property] contains leading spaces. |
+| | The [Destination Path][DestinationPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Destination Path][DestinationPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | Any folder path in [Folder Paths][FolderPaths Property] is `null` or empty (i.e. `""`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] is duplicated. |
+| | Any folder path in [Folder Paths][FolderPaths Property] does not exist. |
+| | Any folder path in [Folder Paths][FolderPaths Property] points to a file. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains leading spaces. |
+| | Any folder path in [Folder Paths][FolderPaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | Any folder path in [Folder Paths][FolderPaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any folder path in [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | Any folder path in [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] is invalid (for example, it is on an unmapped drive). |
+| | Any folder path in [Folder Paths][FolderPaths Property] and [Destination Path][DestinationPath Property] point to the same folder and [Content Only][ContentOnly Property] is `true`. |
+| | Any folder path in [Folder Paths][FolderPaths Property] is a child folder in the [Destination Path][DestinationPath Property] and [Content Only][ContentOnly Property] is `false`. |
+| | Any file being moved already exists in the specified [Destination Path][DestinationPath Property] and overwrite is `false`. |
+| | Any file being moved already exists in the specified [Destination Path][DestinationPath Property], is read-only and overwrite is `true`. |
+| | The user the flow is executing as does not have the required permissions to move the folder or any of its content (e.g. not having read access to any of the folders in [Folder Paths][FolderPaths Property] or its content, or write access to the [Destination Path][DestinationPath Property]). |
+| | The operation is cyclic (e.g. moving a folder into one of its sub-folders). |
+| | An unexpected error occurs when moving a folder or any of its content. |
+| [PropertyEmptyException][] | Thrown when [Folder Paths][FolderPaths Property] does not contain any items, or [Destination Path][DestinationPath Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Paths][FolderPaths Property] or [Destination Path][DestinationPath Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path and Destination Path need escaping
+
+Each folder paths in [Folder Paths][FolderPaths Property] and [Destination Path][DestinationPath Property] require `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the folder path (e.g. `@"C:\Source"`) and [Destination Path][DestinationPath Property] (e.g. `@"C:\Destination"`).
+
+### Folder Attributes
+
+When moving the folders at the specified [Folder Paths][FolderPaths Property] or any folder under them to the new [Destination Path][DestinationPath Property], if the folder already exists in the destination its attributes remain unchanged.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### File Attributes
+
+When moving a file under any of the [Folder Paths][FolderPaths Property] to the new [Destination Path][DestinationPath Property], all of the file's attributes are also moved.
+
+For information about the file attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+### Conflicting Content
+
+If two or more paths in the specified [Folder Paths][FolderPaths Property] contain content (folders or files) with the same name, and [Overwrite][Overwrite Property] and [Content Only][ContentOnly Property] are `true`:
+
+* The attributes of the folder/file in the [Destination Path][DestinationPath Property] will be that of the first one moved.
+* For files, the content of the file in the [Destination Path][DestinationPath Property] will be that of the last one moved.
+
+### Handling of Exceptions
+
+If an exception occurs when trying to move a folder in [Folder Paths][FolderPaths Property], it will be recorded and the block will continue processing the remaining folders. Once all folders are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+[FolderPaths Property]: {{< ref "#folder-paths" >}}
+[DestinationPath Property]: {{< ref "#destination-path" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[ContentOnly Property]: {{< ref "#content-only" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+[File Attributes]: {{< ref "#file-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidPathException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidPathException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Rename Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.RenameFolder.RenameFolder.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/_index.md
new file mode 100644
index 000000000..172a52744
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Read File"
+linkTitle: "Read File"
+description: "Read the content of a file."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-lines-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-lines-block.md
new file mode 100644
index 000000000..5b4b345a7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-lines-block.md
@@ -0,0 +1,178 @@
+---
+title: "Read All Lines"
+linkTitle: "Read All Lines"
+description: "Reads all lines from a file at the specified file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_ReadFile_ReadAllLinesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Reads all [Lines][Lines Property] from a file at the specified [File Path][FilePath Property], with an option to explicitly specify the [Encoding][Encoding Property] of the file if needed.
+
+## Examples
+
+### Read all lines
+
+This example will read all lines from `"C:\Source\File.txt"`, automatically detecting the encoding.
+
+In this example assume `"C:\Source\File.txt"` is a UTF-8 encoded file containing 10 lines:
+
+```plaintext
+This is Line 1
+This is Line 2
+This is Line 3
+This is Line 4
+This is Line 5
+This is Line 6
+This is Line 7
+This is Line 8
+This is Line 9
+This is Line 10
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Lines][Lines Property] | `($)Lines`, with no value | `($)Lines` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Reading all lines from `"C:\Source\File.txt"` results in the variable `($)Lines` being updated to the following:
+
+```json
+[
+ "This is Line 1",
+ "This is Line 2",
+ "This is Line 3",
+ "This is Line 4",
+ "This is Line 5",
+ "This is Line 6",
+ "This is Line 7",
+ "This is Line 8",
+ "This is Line 9",
+ "This is Line 10"
+]
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to read all lines of the file from.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to read the file.
+
+Most of the time [Encoding][Encoding Property] can be left as `null`; allowing the block to automatically attempt to detect the encoding of the file based on the presence of byte order marks. However, if it is found that the returned [Lines][Lines Property] are not in the correct format because the block was unable to detect the encoding of the file, it is possible to specify the [Encoding][Encoding Property] explicitly using this property.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Lines
+
+All [Lines][Lines Property] that were read from the file.
+
+A line is defined as a sequence of characters followed by a carriage return (i.e. `\r`), a line feed (i.e. `\n`), or a carriage return immediately followed by a line feed. The resulting [Lines][Lines Property] do not contain the terminating carriage returns and/or line feeds.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[String][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Lines` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | The [File Path][FilePath Property] does not exist. |
+| | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to read the file. |
+| | An unexpected error occurs when reading the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+[Lines Property]: {{< ref "#lines" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-text-block.md
new file mode 100644
index 000000000..60f4e5c2c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/read-file/read-all-text-block.md
@@ -0,0 +1,173 @@
+---
+title: "Read All Text"
+linkTitle: "Read All Text"
+description: "Reads all text from a file at the specified file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_ReadFile_ReadAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Reads all [Text][Text Property] from a file at the specified [File Path][FilePath Property], with an option to explicitly specify the [Encoding][Encoding Property] of the file if needed.
+
+## Examples
+
+### Read all text
+
+This example will read all text from `"C:\Source\File.txt"`, automatically detecting the encoding.
+
+In this example assume `"C:\Source\File.txt"` is a UTF-8 encoded file containing the following text:
+
+```plaintext
+This is Line 1
+This is Line 2
+This is Line 3
+This is Line 4
+This is Line 5
+This is Line 6
+This is Line 7
+This is Line 8
+This is Line 9
+This is Line 10
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] |
+
+#### Result
+
+Reading all text from `"C:\Source\File.txt"` results in the variable `($)Text` being updated to the following:
+
+```json
+"This is Line 1
+This is Line 2
+This is Line 3
+This is Line 4
+This is Line 5
+This is Line 6
+This is Line 7
+This is Line 8
+This is Line 9
+This is Line 10"
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to read all text of the file from.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to read the file.
+
+Most of the time [Encoding][Encoding Property] can be left as `null`; allowing the block to automatically attempt to detect the encoding of the file based on the presence of byte order marks. However, if it is found that the returned [Text][Text Property] are not in the correct format because the block was unable to detect the encoding of the file, it is possible to specify the [Encoding][Encoding Property] explicitly using this property.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Text
+
+All [Text][Text Property] that was read from the file.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | The [File Path][FilePath Property] does not exist. |
+| | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to read the file. |
+| | An unexpected error occurs when reading the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/_index.md
new file mode 100644
index 000000000..e4b6c16b7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Rename Folder"
+linkTitle: "Rename Folder"
+description: "Rename a folder."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/rename-folder-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/rename-folder-block.md
new file mode 100644
index 000000000..0595cb931
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/rename-folder/rename-folder-block.md
@@ -0,0 +1,158 @@
+---
+title: "Rename Folder"
+linkTitle: "Rename Folder"
+description: "Renames a folder at the specified folder path to a new name."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_RenameFolder_RenameFolderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Renames a folder at the specified [Folder Path][FolderPath Property] to a [New Name][NewName Property].
+
+## Examples
+
+### Rename a folder
+
+This example will rename `"C:\Source\Folder"` to `"C:\Source\RenamedFolder"`.
+
+In this example assume:
+
+* `"C:\Source\Folder"` contains:
+ * An empty sub-folder named `"SubFolder"`.
+ * A file named `"File.txt"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Folder Path][FolderPath Property] | `($)FolderPath`, with value `@"C:\Source\Folder"` | `($)FolderPath` is a variable of type [String][] |
+| [New Name][NewName Property] | `($)NewName`, with value `"RenamedFolder"` | `($)NewName` is a variable of type [String][] |
+
+#### Result
+
+Renaming `"C:\Source\Folder"` to `"RenamedFolder"` will:
+
+* Rename the existing folder at `"C:\Source\Folder"` to `"C:\Source\RenamedFolder"` with:
+ * The `Date Created` left unchanged.
+ * The `Date Accessed` left unchanged.
+ * The `Date Modified` left unchanged.
+ * The [Folder attributes][] left unchanged.
+* `"SubFolder"` and `"File.txt"` will be located under `"C:\Source\RenamedFolder"` and their names, dates, attributes and content will be left unchanged.
+
+***
+
+### Other Move Operations
+
+If any other folder move operation is required, the [Move Folder][] or [Move Folders][] blocks must be used instead.
+
+***
+
+## Properties
+
+### Folder Path
+
+The [Folder Path][FolderPath Property] of the folder to rename.
+
+The [Folder Path][FolderPath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FolderPath` with no value |
+
+### New Name
+
+The [New Name][NewName Property] to rename the folder to.
+
+The [New Name][NewName Property] is case-insensitive and any trailing spaces will be automatically removed.
+
+The [New Name][NewName Property] must be a valid folder name, otherwise an [InvalidFolderNameException][] will be thrown.
+
+For information about valid folder names, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidFolderNameException][] | A folder or file with the [New Name][NewName Property] already exists. |
+| | The [New Name][NewName Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`). |
+| | The [New Name][NewName Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| [OperationFailedException][] | The [Folder Path][FolderPath Property] does not exist. |
+| | The [Folder Path][FolderPath Property] points to a file. |
+| | The [Folder Path][FolderPath Property] contains leading spaces. |
+| | The [Folder Path][FolderPath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any folder names. |
+| | The [Folder Path][FolderPath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [Folder Path][FolderPath Property] is a win32 device path (i.e starts with a `"\\.\"`). |
+| | The [Folder Path][FolderPath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to rename the folder or any of its content (e.g. not having read access to the [Folder Path][FolderPath Property] or its content, or write access to the parent of [Folder Path][FolderPath Property]. |
+| | An unexpected error occurs when renaming the folder. |
+| [PropertyEmptyException][] | Thrown when [Folder Path][FolderPath Property] or [New Name][NewName Property] are empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Folder Path][FolderPath Property] or [New Name][NewName Property] are `null`. |
+
+## Remarks
+
+### Folder Paths
+
+For information about the supported folder path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### Folder Path needs escaping
+
+[Folder Path][FolderPath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\"`), or
+* Prepending an `@` character before the start of the [Folder Path][FolderPath Property] (e.g. `@"C:\Source"`).
+
+### Folder Attributes
+
+When renaming the folder at the specified [Folder Path][FolderPath Property] all of the folder's attributes are left unchanged.
+
+For information about the folder attributes (i.e. ReadOnly, Hidden, Archive etc.), please see [File & Folder Attributes][].
+
+[FolderPath Property]: {{< ref "#folder-path" >}}
+[NewName Property]: {{< ref "#new-name" >}}
+
+[Folder Attributes]: {{< ref "#folder-attributes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[InvalidFolderNameException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.InvalidFolderNameException.MainDoc" >}}
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Attributes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Attributes.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[Move Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFolder.MoveFolder.MainDoc" >}}
+[Move Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFolder.MoveFolders.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/_index.md
new file mode 100644
index 000000000..5bdc44c30
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Search File(s)"
+linkTitle: "Search File(s)"
+description: "Search a file or multiple files."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-file-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-file-block.md
new file mode 100644
index 000000000..0362dca0f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-file-block.md
@@ -0,0 +1,406 @@
+---
+title: "Search File"
+linkTitle: "Search File"
+description: "Searches a file at a specified file path for a matching search pattern."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_SearchFile_SearchFileBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Searches the file at the specified [File Path][FilePath Property] for text that matches a given [Search Pattern][SearchPattern Property].
+
+Results are returned as a list of [Matches][Matches Property].
+
+Additional options can be specified:
+
+* [Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search.
+* [Encoding][Encoding Property] can be specified if needed to explicitly state the encoding that should be used to read and search the file.
+* A [Comparison Type][ComparisonType Property] option can specified to choose how it is determined whether text matches the [Search Pattern][SearchPattern Property] (e.g. whether the search is case-sensitive or case-insensitive).
+
+## Examples
+
+### Get matches for a given text
+
+This example will get all matches in the file `"C:\Source\File.txt"` that match the text `"error"`.
+
+It will perform a case-insensitive search, and let the block determine the encoding of the file automatically.
+
+In this example assume `"C:\Source\File.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"error"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IList][]<[FileMatch][]> value |
+
+#### Result
+
+Searching `"C:\Source\File.txt"` for all text matching `"error"` (case-insensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+[
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 1,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 4,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 4,
+ "Value": "error",
+ "Index": 19,
+ "Length": 5,
+ "Groups": {}
+ }
+]
+```
+
+***
+
+### Get matches for a given pattern
+
+This example will get all matches in the file `"C:\Source\File.txt"` that match the pattern `"Uptime is * hours."`.
+
+It will perform a case-sensitive search, and let the block determine the encoding of the file automatically.
+
+In this example assume `"C:\Source\File.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"Uptime is * hours."` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IList][]<[FileMatch][]> value |
+
+#### Result
+
+Searching `"C:\Source\File.txt"` for all text matching the pattern `"Uptime is * hours."` (case-sensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+[
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 2,
+ "Value": "Uptime is 2 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 3,
+ "Value": "Uptime is 3 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ }
+]
+```
+
+***
+
+### Get matches for a given regex
+
+This example will get all matches in the file `"C:\Source\File.txt"` that match the regex `"^Error:.*$"`.
+
+It will perform a case-sensitive search, explicitly specify the encoding of the file as UTF-8 and will match any line that starts with `"Error:"`.
+
+In this example assume `"C:\Source\File.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"^Error:.*$"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `Encoding.UTF8` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IList][]<[FileMatch][]> value |
+
+#### Result
+
+Searching `"C:\Source\File.txt"` for all text matching the regex `"^Error:.*$"` (case-sensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+[
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 1,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 4,
+ "Value": "Error: An terminal error has occurred. The service will restart now.",
+ "Index": 0,
+ "Length": 68,
+ "Groups": {}
+ }
+]
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to search for text that matches a given [Search Pattern][SearchPattern Property].
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Search Pattern
+
+The [Search Pattern][SearchPattern Property] which text must match to be included in the returned [Matches][Matches Property].
+
+A `null` or empty (i.e. `""`) [Search Pattern][SearchPattern Property] means match anything; all additional block options such as [Search Options][SearchOptions Property] etc. still take effect.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Search Pattern][SearchPattern Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to read and search the file.
+
+Most of the time [Encoding][Encoding Property] can be left as `null`; allowing the block to automatically attempt to detect the encoding of the file based on the presence of byte order marks. However, if it is found that the returned [Matches][Matches Property] are not correct because the block was unable to detect the encoding of the file, it is possible to specify the [Encoding][Encoding Property] explicitly using this property.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match text against the given [Search Pattern][SearchPattern Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Matches
+
+[Matches][Matches Property] containing a [FileMatch][] for every text that matches the specified [Search Pattern][SearchPattern Property] based on the other specified options.
+
+A basic example with a single [FileMatch][] can be seen below:
+
+```json
+[
+ {
+ "FilePath": "C:\\Source\\File.txt",
+ "Line": 1,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ }
+]
+```
+
+For more information see the [example][] above, or the [FileMatch][] data type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[FileMatch][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Matches` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | The [File Path][FilePath Property] does not exist. |
+| | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to search the [File Path][FilePath Property]. |
+| | An unexpected error occurs when searching the [File Path][FilePath Property]. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+| [RegexMatchTimeoutException][] | Thrown when using [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and the [Search Pattern][SearchPattern Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Null or empty Search Pattern
+
+A `null` or empty (i.e. `""`) [Search Pattern][SearchPattern Property] means match anything; all additional block options such as [Search Options][SearchOptions Property] etc. still take effect.
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Known Limitations
+
+* The text in the file at the specified [File Path][FilePath Property] is searched line-by-line. As a result, when using `SearchOptions.Regex` the in-line `s` regex character is not supported.
+* If the text in the file at the specified [File Path][FilePath Property] ends with a blank line (`0` length) that line will not be read and therefore not matched against.
+* If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[SearchPattern Property]: {{< ref "#search-pattern" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Matches Property]: {{< ref "#matches" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[Example]: {{< ref "#get-matches-for-a-given-text" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[FileMatch]: {{< url path="Cortex.Reference.DataTypes.FilesAndFolders.FileMatch.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-files-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-files-block.md
new file mode 100644
index 000000000..d5129d3dc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/search-file/search-files-block.md
@@ -0,0 +1,527 @@
+---
+title: "Search Files"
+linkTitle: "Search Files"
+description: "Searches files at the specified file paths for a matching search pattern."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_SearchFile_SearchFilesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Searches the files at the specified [File Paths][FilePaths Property] for text that matches a given [Search Pattern][SearchPattern Property].
+
+Results are returned as [Matches][Matches Property].
+
+Additional options can be specified:
+
+* [Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search.
+* [Encoding][Encoding Property] can be specified if needed to explicitly state the encoding that should be used to read and search the files.
+* A [Comparison Type][ComparisonType Property] option can specified to choose how it is determined whether text matches the [Search Pattern][SearchPattern Property] (e.g. whether the search is case-sensitive or case-insensitive).
+
+## Examples
+
+### Get matches for a given text
+
+This example will get all matches in the files `["C:\Source\File1.txt", "C:\Source\File2.txt"]` that match the text `"error"`.
+
+It will perform a case-insensitive search, and let the block determine the encoding of the files automatically.
+
+In this example assume `"C:\Source\File1.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+and `"C:\Source\File2.txt"` contains the following text:
+
+```plaintext
+Information: Uptime is 1 hour.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: Failed to determine uptime.
+Error: Failed to determine uptime.
+Information: Uptime is 6 hours.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\File1.txt", @"C:\Source\File2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable]<[String][]> |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"error"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IDictionary][]<[String][], [IList][]<[FileMatch][]>> value |
+
+#### Result
+
+Searching `"C:\Source\File.txt"` for all text matching `"error"` (case-insensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+{
+ "C:\\Source\\File1.txt" : [
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 1,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 4,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 4,
+ "Value": "error",
+ "Index": 19,
+ "Length": 5,
+ "Groups": {}
+ }
+ ],
+ "C:\\Source\\File2.txt" : [
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 4,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 5,
+ "Value": "Error",
+ "Index": 0,
+ "Length": 5,
+ "Groups": {}
+ }
+ ]
+}
+```
+
+***
+
+### Get matches for a given pattern
+
+This example will get all matches in the files `["C:\Source\File1.txt", "C:\Source\File2.txt"]` that match the pattern `"Uptime is * hour?."`.
+
+It will perform a case-sensitive search, and let the block determine the encoding of the files automatically.
+
+In this example assume `"C:\Source\File1.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+and `"C:\Source\File2.txt"` contains the following text:
+
+```plaintext
+Information: Uptime is 1 hour.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: Failed to determine uptime.
+Error: Failed to determine uptime.
+Information: Uptime is 6 hours.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\File1.txt", @"C:\Source\File2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable]<[String][]> |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"Uptime is * hour?."` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IDictionary][]<[String][], [IList][]<[FileMatch][]>> value |
+
+#### Result
+
+Searching the files `["C:\Source\File1.txt", "C:\Source\File2.txt"]` for all text matching the pattern `"Uptime is * hour?."` (case-sensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+{
+ "C:\\Source\\File1.txt" : [
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 2,
+ "Value": "Uptime is 2 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 3,
+ "Value": "Uptime is 3 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ }
+ ],
+ "C:\\Source\\File2.txt" : [
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 1,
+ "Value": "Uptime is 1 hour.",
+ "Index": 13,
+ "Length": 17,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 2,
+ "Value": "Uptime is 2 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 3,
+ "Value": "Uptime is 3 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 6,
+ "Value": "Uptime is 6 hours.",
+ "Index": 13,
+ "Length": 18,
+ "Groups": {}
+ }
+ ]
+}
+```
+
+***
+
+### Get matches for a given regex
+
+This example will get all matches in the files `["C:\Source\File1.txt", "C:\Source\File2.txt"]` that match the regex `"^Error:.*$"`.
+
+It will perform a case-sensitive search, explicitly specify the encoding of the files as UTF-8 and will match any lines that start with `"Error:"`.
+
+In this example assume `"C:\Source\File1.txt"` contains the following text:
+
+```plaintext
+Error: Failed to determine uptime.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: An terminal error has occurred. The service will restart now.
+```
+
+and `"C:\Source\File2.txt"` contains the following text:
+
+```plaintext
+Information: Uptime is 1 hour.
+Information: Uptime is 2 hours.
+Information: Uptime is 3 hours.
+Error: Failed to determine uptime.
+Error: Failed to determine uptime.
+Information: Uptime is 6 hours.
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Paths][FilePaths Property] | `($)FilePaths`, with value `[@"C:\Source\File1.txt", @"C:\Source\File2.txt"]` | `($)FilePaths` is a variable of type [IEnumerable]<[String][]> |
+| [Search Pattern][SearchPattern Property] | `($)SearchPattern`, with value `"^Error:.*$"` | `($)SearchPattern` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `Encoding.UTF8` | `($)Encoding` is a variable of type [Encoding][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [IDictionary][]<[String][], [IList][]<[FileMatch][]>> value |
+
+#### Result
+
+Searching the files `["C:\Source\File1.txt", "C:\Source\File2.txt"]` for all text matching the regex `"^Error:.*$"` (case-sensitive), results in the variable `($)Matches` being updated to the following:
+
+```json
+{
+ "C:\\Source\\File1.txt" : [
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 1,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 4,
+ "Value": "Error: An terminal error has occurred. The service will restart now.",
+ "Index": 0,
+ "Length": 68,
+ "Groups": {}
+ }
+ ],
+ "C:\\Source\\File2.txt" : [
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 4,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ },
+ {
+ "FilePath": "C:\\Source\\File2.txt",
+ "Line": 5,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ }
+ ]
+}
+```
+
+***
+
+## Properties
+
+### File Paths
+
+The [File Paths][FilePaths Property] to search for text that matches a given [Search Pattern][SearchPattern Property].
+
+Each file path in [File Paths][FilePaths Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePaths` with no value |
+
+### Search Pattern
+
+The [Search Pattern][SearchPattern Property] which text must match to be included in the returned [Matches][Matches Property].
+
+A `null` or empty (i.e. `""`) [Search Pattern][SearchPattern Property] means match anything; all additional block options such as [Search Options][SearchOptions Property] etc. still take effect.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `""`) |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Search Pattern][SearchPattern Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to read and search the files.
+
+Most of the time [Encoding][Encoding Property] can be left as `null`; allowing the block to automatically attempt to detect the encoding of the files based on the presence of byte order marks. However, if it is found that the returned [Matches][Matches Property] are not correct because the block was unable to detect the encoding of the files, it is possible to specify the [Encoding][Encoding Property] explicitly using this property.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match text against the given [Search Pattern][SearchPattern Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Matches
+
+[Matches][Matches Property] containing an entry for each file in [File Paths][FilePaths Property].
+
+The key of each entry is the file path, and the value contains a [FileMatch][] for every text in the file path that matches the specified [Search Pattern][SearchPattern Property] based on the other specified options.
+
+A basic example with a single file path and a single [FileMatch][] can be seen below:
+
+```json
+{
+ "C:\\Source\\File1.txt" : [
+ {
+ "FilePath": "C:\\Source\\File1.txt",
+ "Line": 1,
+ "Value": "Error: Failed to determine uptime.",
+ "Index": 0,
+ "Length": 34,
+ "Groups": {}
+ }
+ ]
+}
+```
+
+For more information see the [example][] above, or the [FileMatch][] data type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IDictionary][]<[String][], [IList][]<[FileMatch][]>> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Matches` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | Any file path in [File Paths][FilePaths Property] is `null` or empty (i.e. `""`).|
+| | Any file path in [File Paths][FilePaths Property] is duplicated. |
+| | Any file path in [File Paths][FilePaths Property] does not exist. |
+| | Any file path in [File Paths][FilePaths Property] points to a folder. |
+| | Any file path in [File Paths][FilePaths Property] contains leading spaces. |
+| | Any file path in [File Paths][FilePaths Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | Any file path in [File Paths][FilePaths Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | Any file path in [File Paths][FilePaths Property] is invalid (for example, it is on an unmapped drive). |
+| | The user the flow is executing as does not have the required permissions to search a file path in [File Paths][FilePaths Property]. |
+| | An unexpected error occurs when searching any file path in [File Paths][FilePaths Property]. |
+| [PropertyEmptyException][] | Thrown when [File Paths][FilePaths Property] does not contain any items. |
+| [PropertyNullException][] | Thrown when [File Paths][FilePaths Property] is `null`. |
+| [RegexMatchTimeoutException][] | Thrown when using [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and the [Search Pattern][SearchPattern Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Paths needs escaping
+
+Each file path in [File Paths][FilePaths Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Paths][FilePaths Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Null or empty Search Pattern
+
+A `null` or empty (i.e. `""`) [Search Pattern][SearchPattern Property] means match anything; all additional block options such as [Search Options][SearchOptions Property] etc. still take effect.
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Handling of Exceptions
+
+If an exception occurs when trying to search a file in the [File Paths][FilePaths Property], it will be recorded and the block will continue processing the remaining files. Once all files are processed, recorded exceptions will be thrown within an [OperationFailedException][].
+
+### Known Limitations
+
+* The text in the files at the specified [File Paths][FilePaths Property] is searched line-by-line. As a result, when using `SearchOptions.Regex` the in-line `s` regex character is not supported.
+* If the text in the files at the specified [File Paths][FilePaths Property] ends with a blank line (`0` length) that line will not be read and therefore not matched against.
+* If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[FilePaths Property]: {{< ref "#file-paths" >}}
+[SearchPattern Property]: {{< ref "#search-pattern" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Matches Property]: {{< ref "#matches" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[Example]: {{< ref "#get-matches-for-a-given-text" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[FileMatch]: {{< url path="Cortex.Reference.DataTypes.FilesAndFolders.FileMatch.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/_index.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/_index.md
new file mode 100644
index 000000000..bcadbe7f5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Write File"
+linkTitle: "Write File"
+description: "Write the content of a file."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-lines-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-lines-block.md
new file mode 100644
index 000000000..f492aae35
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-lines-block.md
@@ -0,0 +1,226 @@
+---
+title: "Write All Lines"
+linkTitle: "Write All Lines"
+description: "Writes all specified lines to a file at the given file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_WriteFile_WriteAllLinesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Writes all specified [Lines][Lines Property] to the end of the file at the given [File Path][FilePath Property], with an option to explicitly specify the [Encoding][Encoding Property] to write the file as if needed.
+
+An option can also be specified to [Overwrite][Overwrite Property] rather than append to the file.
+
+## Examples
+
+### Write all lines, appending to the end of the file
+
+This example will append `["New Line 1", "New Line 2"]` to `"C:\Source\File.txt"`, using UTF-8 encoding without a byte order mark.
+
+In this example assume `"C:\Source\File.txt"` contains 2 lines:
+
+```plaintext
+Original Line 1
+Original Line 2
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Lines][Lines Property] | `($)Lines`, with value `["New Line 1", "New Line 2"]` | `($)Lines` is a variable of type [IEnumerable][]<[String][]> |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+
+#### Result
+
+Writing `["New Line 1", "New Line 2"]` to `"C:\Source\File.txt"` results in the content being updated to the following:
+
+```plaintext
+Original Line 1
+Original Line 2
+New Line 1
+New Line 2
+```
+
+***
+
+### Write all lines, overwriting the file content
+
+This example will overwrite the content of `"C:\Source\File.txt"` with `["New Line 1", "New Line 2"]`, using UTF-8 encoding without a byte order mark.
+
+In this example assume `"C:\Source\File.txt"` contains 2 lines:
+
+```plaintext
+Original Line 1
+Original Line 2
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Lines][Lines Property] | `($)Lines`, with value `["New Line 1", "New Line 2"]` | `($)Lines` is a variable of type [IEnumerable][]<[String][]> |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+
+#### Result
+
+Overwriting `"C:\Source\File.txt"` with `["New Line 1", "New Line 2"]` results in the content being updated to the following:
+
+```plaintext
+New Line 1
+New Line 2
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to write all [Lines][Lines Property] to.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+If the file does not exist at the [File Path][FilePath Property], a new file is created, and any non-existing folders will also be created.
+
+If the file already exists at the [File Path][FilePath Property] and [Overwrite][Overwrite Property] is:
+
+* `true`, the [Lines][Lines Property] overwrite the existing file content.
+* `false`, the [Lines][Lines Property] are appended to the existing file content.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Lines
+
+The [Lines][Lines Property] to write to the file.
+
+[Lines][Lines Property] can be `null` or empty (i.e. `""`).
+
+If [Lines][Lines Property] is `null` or empty (i.e. `""`) and [Overwrite][Overwrite Property] is:
+
+* `true`, a blank file will be written.
+* `false`, nothing is written.
+
+If [Lines][Lines Property] contains an entry that is `null` or empty (i.e. `""`) a blank line will be written for that entry.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Lines` with no value |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the file content with the [Lines][Lines Property], rather than appending them.
+
+By default, this is set to `false` to avoid implicit and accidental overwriting of the file content.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to write the file.
+
+If the [Encoding][Encoding Property] is left as `null`, the [Lines][Lines Property] will be written using UTF-8 encoding without a byte order mark.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The file at the specified [File Path][FilePath Property] is hidden or is a System file, and overwrite is `true`. |
+| | The file at the specified [File Path][FilePath Property] is a read-only file. |
+| | The user the flow is executing as does not have the required permissions to write to the file. |
+| | An unexpected error occurs when writing the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[Lines Property]: {{< ref "#lines" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-text-block.md
new file mode 100644
index 000000000..842f74cf8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Files-And-Folders/write-file/write-all-text-block.md
@@ -0,0 +1,223 @@
+---
+title: "Write All Text"
+linkTitle: "Write All Text"
+description: "Writes all specified text to a file at the given file path."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_FilesAndFolders_WriteFile_WriteAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Writes all specified [Text][Text Property] to the end of the file at the given [File Path][FilePath Property], with an option to explicitly specify the [Encoding][Encoding Property] to write the file as if needed.
+
+An option can also be specified to [Overwrite][Overwrite Property] rather than append to the file.
+
+## Examples
+
+### Write all text, appending to the end of the file
+
+This example will append `"New Line 1\r\nNew Line 2"` to `"C:\Source\File.txt"`, using UTF-8 encoding without a byte order mark.
+
+In this example assume `"C:\Source\File.txt"` contains the following text:
+
+```plaintext
+Original Line 1
+Original Line 2
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Text][Text Property] | `($)Text`, with value `"New Line 1\r\nNew Line 2"` | `($)Text` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `false` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+
+#### Result
+
+Writing `"New Line 1\r\nNew Line 2"` to `"C:\Source\File.txt"` results in the content being updated to the following:
+
+```plaintext
+Original Line 1
+Original Line 2
+New Line 1
+New Line 2
+```
+
+***
+
+### Write all text, overwriting the file content
+
+This example will overwrite the content of `"C:\Source\File.txt"` with `"New Line 1\r\nNew Line 2"`, using UTF-8 encoding without a byte order mark.
+
+In this example assume `"C:\Source\File.txt"` contains the following text:
+
+```plaintext
+Original Line 1
+Original Line 2
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [File Path][FilePath Property] | `($)FilePath`, with value `@"C:\Source\File.txt"` | `($)FilePath` is a variable of type [String][] |
+| [Text][Text Property] | `($)Text`, with value `"New Line 1\r\nNew Line 2"` | `($)Text` is a variable of type [String][] |
+| [Overwrite][Overwrite Property] | `($)Overwrite`, with value `true` | `($)Overwrite` is a variable of type [Boolean][] |
+| [Encoding][Encoding Property] | `($)Encoding`, with value `null` | `($)Encoding` is a variable of type [Encoding][] |
+
+#### Result
+
+Overwriting `"C:\Source\File.txt"` with `"New Line 1\r\nNew Line 2"` results in the content being updated to the following:
+
+```plaintext
+New Line 1
+New Line 2
+```
+
+***
+
+## Properties
+
+### File Path
+
+The [File Path][FilePath Property] to write the [Text][Text Property] to.
+
+The [File Path][FilePath Property] is case-insensitive, cannot contain any wildcard characters, and any trailing spaces will be automatically removed.
+
+If the file does not exist at the [File Path][FilePath Property], a new file is created, and any non-existing folders will also be created.
+
+If the file already exists at the [File Path][FilePath Property] and [Overwrite][Overwrite Property] is:
+
+* `true`, the [Text][Text Property] overwrites the existing file content.
+* `false`, the [Text][Text Property] is appended to the existing file content.
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, please see [File & Folder Paths][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)FilePath` with no value |
+
+### Text
+
+The [Text][Text Property] to write to the file.
+
+[Text][Text Property] can be `null` or empty (i.e. `""`).
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) and [Overwrite][Overwrite Property] is:
+
+* `true`, a blank file will be written.
+* `false`, nothing is written.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Overwrite
+
+Option to [Overwrite][Overwrite Property] the file content with the [Text][Text Property], rather than appending it.
+
+By default, this is set to `false` to avoid implicit and accidental overwriting of the file content.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `false` |
+
+### Encoding
+
+Option to specify the [Encoding][Encoding Property] that should be used to write the file.
+
+If the [Encoding][Encoding Property] is left as `null`, the [Text][Text Property] will be written using UTF-8 encoding without a byte order mark.
+
+For information about encoding, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Encoding][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Encoding][Encoding Property] is invalid (e.g. `Encoding.GetEncoding(-1)`). See [Value Is Invalid][]. |
+| [OperationFailedException][] | The [File Path][FilePath Property] points to a folder. |
+| | The [File Path][FilePath Property] contains leading spaces. |
+| | The [File Path][FilePath Property] contains only whitespace, or the NUL character (i.e. `\0`), or contains one or more invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`) in any file or folder names. |
+| | The [File Path][FilePath Property] exceeds the system-defined maximum length (typically 32,767 characters). |
+| | The [File Path][FilePath Property] is invalid (for example, it is on an unmapped drive). |
+| | The file at the specified [File Path][FilePath Property] is hidden or is a System file, and overwrite is `true`. |
+| | The file at the specified [File Path][FilePath Property] is a read-only file. |
+| | The user the flow is executing as does not have the required permissions to write to the file. |
+| | An unexpected error occurs when writing the file. |
+| [PropertyEmptyException][] | Thrown when [File Path][FilePath Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [File Path][FilePath Property] is `null`. |
+
+## Remarks
+
+### File Paths
+
+For information about the supported file path formats (i.e. absolute, relative, UNC etc.) and examples of each, including how it is determined if a path points to a folder or a file, please see [File & Folder Paths][].
+
+### File Path needs escaping
+
+[File Path][FilePath Property] requires `\` characters to be escaped, otherwise each unescaped `\` will be reported as an `Invalid property value` message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+* Escaping the `\` character with another `\` character (e.g. `"C:\\Source\\File.txt"`), or
+* Prepending an `@` character before the start of the [File Path][FilePath Property] (e.g. `@"C:\Source\File.txt"`).
+
+### Encoding of text
+
+For information about encoding of text, examples of available encodings and using them, please see [Encoding][Working with Text - Encoding].
+
+[FilePath Property]: {{< ref "#file-path" >}}
+[Text Property]: {{< ref "#text" >}}
+[Overwrite Property]: {{< ref "#overwrite" >}}
+[Encoding Property]: {{< ref "#encoding" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Working with Text - Encoding]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Encoding.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[OperationFailedException]: {{< url path="Cortex.Reference.Exceptions.FilesAndFolders.OperationFailedException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Encoding]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/_index.md
new file mode 100644
index 000000000..6e11b63ca
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Count(s) of Items"
+linkTitle: "Get Count(s) of Items"
+description: "Get the count(s) of items in a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-all-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-all-items-block-2.md
new file mode 100644
index 000000000..5b9210bcd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-all-items-block-2.md
@@ -0,0 +1,115 @@
+---
+title: "Get Count Of All Items"
+linkTitle: "Get Count Of All Items"
+description: "Gets the count of all items in a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetCount_GetCountOfAllItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Count][Count Property] of all items in a [List][List Property].
+
+## Examples
+
+### Get Count of all items in a List
+
+This example will get the count of all items in `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Count][Count Property] | `($)Count`, with no value | `($)Count` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+Getting the count of all items in `["Some Text", 1]` results in the variable `($)Count` being updated to the following:
+
+```json
+2
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Count][Count Property] of all items for.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Count
+
+The [Count][Count Property] of all items in [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Count][Count Property] property is set to `0`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-value-block-2.md
new file mode 100644
index 000000000..7b68af599
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-value-block-2.md
@@ -0,0 +1,145 @@
+---
+title: "Get Count Of Items With Value"
+linkTitle: "Get Count Of Items With Value"
+description: "Gets the count of items in a List with the specified value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetCount_GetCountOfItemsWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Count][Count Property] of items in a [List][List Property] with the specified [Value][Value Property].
+
+## Examples
+
+### Get Count of items in a List with a Value
+
+This example will get the count of items in `["Some Text", 1]` with the value `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Count][Count Property] | `($)Count`, with no value | `($)Count` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+Getting the count of items in `["Some Text", 1]` with the value `1` results in the variable `($)Count` being updated to the following:
+
+```json
+1
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Count][Count Property] of items with the specified [Value][Value Property] for.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] items must match to be included in the [Count][Count Property].
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Count
+
+The [Count][Count Property] of items in [List][List Property] with the specified [Value][Value Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Count][Count Property] property is set to `0`.
+
+### No items matching Value
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property], the variable specified in the [Count][Count Property] property is set to `0`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-values-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-values-block-2.md
new file mode 100644
index 000000000..9571a09f0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-values-block-2.md
@@ -0,0 +1,149 @@
+---
+title: "Get Counts Of Items With Values"
+linkTitle: "Get Counts Of Items With Values"
+description: "Gets the counts of items in a List matching each of the specified values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetCount_GetCountsOfItemsWithValuesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Counts][Counts Property] of items in a [List][List Property] matching each of the specified [Values][Values Property].
+
+## Examples
+
+### Get Counts of items in a List matching each of the Values
+
+This example will get the counts of items in `["Some Text", 1]` matching each of the values `[1, 2, 3]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Counts][Counts Property] | `($)Counts`, with no value | `($)Counts` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+Getting the counts of items in `["Some Text", 1]` matching each of the values `[1, 2, 3]` results in the variable `($)Counts` being updated to the following:
+
+```json
+[1, 0, 0]
+```
+
+The counts of items matching each value are added to `($)Counts` at the same [index][Indexes] the value is in `($)Values`. In this example, there is one item matching the first value `1`, zero items matching the second value `2` and zero items matching the third value `3`, resulting in `($)Counts` being set to `[1, 0, 0]`.
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Counts][Counts Property] of items matching each of the specified [Values][Values Property] for.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Values
+
+The [Values][Values Property] items must match to be included in the [Counts][Counts Property].
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Counts
+
+The [Counts][Counts Property] of items in [List][List Property] matching each of the specified [Values][Values Property].
+
+For each value in [Values][Values Property], [Counts][Counts Property] will have a corresponding item whose value is the count of items in [List][List Property] matching the value.
+
+I.e. The count of items matching the first value in [Values][Values Property] will be saved as the first item in [Counts][Counts Property]; the count of items matching the second value in [Values][Values Property] will be saved as the second item in [Counts][Counts Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[Int32][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Counts` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] or [Values][Values Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`), the variable specified in the [Counts][Counts Property] property is set to empty (i.e. `[]`).
+
+### No items matching a specified value in Values
+
+If [List][List Property] does not contain items matching one of the specified [Values][Values Property], `0` is written to the corresponding item in [Counts][Counts Property] for that value.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Values Property]: {{< ref "#values" >}}
+[Counts Property]: {{< ref "#counts" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/_index.md
new file mode 100644
index 000000000..f76c2f371
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Index(es) of Items"
+linkTitle: "Get Index(es) of Items"
+description: "Get the index of an item or indexes of multiple items contained in a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-index-of-item-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-index-of-item-with-value-block-2.md
new file mode 100644
index 000000000..b21ce2717
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-index-of-item-with-value-block-2.md
@@ -0,0 +1,207 @@
+---
+title: "Get Index Of Item With Value"
+linkTitle: "Get Index Of Item With Value"
+description: "Gets the index of the specified occurrence of an item in a List matching a value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetIndex_GetIndexOfItemWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of an item in a [List][List Property] matching a [Value][Value Property].
+
+## Examples
+
+### Get the Index of the first Occurrence of an item in a List matching a Value
+
+This example will attempt to get the index of the first occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means the first occurrence; `2` means second etc.
+
+Attempting to get the index of the first occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)Index` being updated to the following:
+
+```json
+0
+```
+
+***
+
+### Get the Index of the last Occurrence of an item in a List matching a Value
+
+This example will attempt to get the index of the last occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means the last occurrence; `-2` means second last etc.
+
+Attempting to get the index of the last occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)List` being updated to the following:
+
+```json
+5
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of matching item from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the item to get the [Index][Index Property] of the specified [Occurrence][Occurrence Property] must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to get the [Index][Index Property] of.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Index
+
+[Int32][] indicating the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of item matching [Value][Value Property] in [List][List Property].
+
+If there is no specified [Occurrence][Occurrence Property] of item matching [Value][Value Property] in [List][List Property], the specified variable will be set to `-1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Index` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Occurrences
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### No items matching Value, or Occurrence is not present
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property] or the specified [Occurrence][Occurrence Property] is not present, the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Occurrence is zero
+
+If the [Occurrence][Occurrence Property] is set to `0`, the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-indexes-of-items-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-indexes-of-items-with-value-block-2.md
new file mode 100644
index 000000000..46cc20c8e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/Get-Index/get-indexes-of-items-with-value-block-2.md
@@ -0,0 +1,153 @@
+---
+title: "Get Indexes Of Items With Value"
+linkTitle: "Get Indexes Of Items With Value"
+description: "Gets the indexes of all items in a List matching a value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetIndex_GetIndexesOfItemsWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Indexes][Indexes Property] of all items in a [List][List Property] matching a [Value][Value Property].
+
+## Examples
+
+### Get the Indexes of all items in a List matching a Value
+
+This example will attempt to get the indexes of all items matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+Attempting to get the indexes of all items matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)Indexes` being updated to the following:
+
+```json
+[0, 5]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Indexes][Indexes Property] of matching items from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the items to get the [Indexes][Indexes Property] of must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Indexes
+
+[IList][]<[Int32][]> containing the [Indexes][Indexes Property] of items matching [Value][Value Property] in [List][List Property].
+
+If there are no items matching [Value][Value Property] in [List][List Property], the specified variable will be set to `[-1]`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[Int32][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Indexes` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Indexes][Indexes Property] property is set to `[-1]`.
+
+### No items matching Value
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property], the variable specified in the [Indexes][Indexes Property] property is set to `[-1]`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[Indexes Property]: {{< ref "#indexes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/_index.md
new file mode 100644
index 000000000..81c3fb421
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Lists"
+linkTitle: "Lists"
+description: "Blocks related to working with Lists."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/_index.md
new file mode 100644
index 000000000..46346dea3
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Add Item(s)"
+linkTitle: "Add Item(s)"
+description: "Add an item or multiple items to a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-beginning-block-2.md
new file mode 100644
index 000000000..2127a3d94
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-beginning-block-2.md
@@ -0,0 +1,137 @@
+---
+title: "Add Item At Beginning"
+linkTitle: "Add Item At Beginning"
+description: "Adds an Item at the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds an [Item][Item Property] at the beginning of a [List][List Property].
+
+## Examples
+
+### Add an Item at the beginning of an empty List
+
+This example will add `"New Item"` at the beginning of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+
+#### Result
+
+Adding `"New Item"` at the beginning of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item"]
+```
+
+***
+
+### Add an Item at the beginning of a List
+
+This example will add `"New Item"` at the beginning of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+
+#### Result
+
+Adding `"New Item"` at the beginning of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item", "Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Item][Item Property] is added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Item
+
+The [Item][Item Property] to be added at the beginning of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Item][Item Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-end-block-2.md
new file mode 100644
index 000000000..38c27bb97
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-end-block-2.md
@@ -0,0 +1,138 @@
+---
+title: "Add Item At End"
+linkTitle: "Add Item At End"
+description: "Adds an Item at the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Lists.AddItem.AddItemAtEndBlock`2)
+
+## Description
+
+Adds an [Item][Item Property] at the end of a [List][List Property].
+
+## Examples
+
+### Add an Item at the end of an empty List
+
+This example will add `"New Item"` at the end of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+
+#### Result
+
+Adding `"New Item"` at the end of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item"]
+```
+
+***
+
+### Add an Item at the end of a List
+
+This example will add `"New Item"` at the end of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+
+#### Result
+
+Adding `"New Item"` at the end of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1, "New Item"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Item][Item Property] is added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Item
+
+The [Item][Item Property] to be added at the end of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Item][Item Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-index-block-2.md
new file mode 100644
index 000000000..af7c4a13b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-item-at-index-block-2.md
@@ -0,0 +1,186 @@
+---
+title: "Add Item At Index"
+linkTitle: "Add Item At Index"
+description: "Adds an Item at the specified Index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds an [Item][Item Property] at the specified [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Add an Item at the first Index (i.e. `0`) of an empty List
+
+This example will add `"New Item"` at index `0` of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"New Item"` at index `0` of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item"]
+```
+
+***
+
+### Add an Item at the first Index (i.e. `0`) of a List
+
+This example will add `"New Item"` at index `0` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"New Item"` at index `0` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item", "Some Text", 1]
+```
+
+***
+
+### Add an Item at the end (i.e. Index equals count of items) of a List
+
+This example will add `"New Item"` at index `2` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with value `"New Item"` | `($)Item` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `2` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"New Item"` at index `2` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1, "New Item"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Item][Item Property] is added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Item
+
+The [Item][Item Property] to be added at the specified [Index][Index Property] of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Index
+
+The [Index][Index Property] to add the [Item][Item Property] at.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property].
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Item][Item Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is out of the range of the list indexes. Valid indexes are between and including `0` and the count of items in the [List][List Property]. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Item Property]: {{< ref "#item" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-beginning-block-2.md
new file mode 100644
index 000000000..f8a90c90c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-beginning-block-2.md
@@ -0,0 +1,139 @@
+---
+title: "Add Items At Beginning"
+linkTitle: "Add Items At Beginning"
+description: "Adds Items at the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemsAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Items][Items Property] at the beginning of a [List][List Property].
+
+## Examples
+
+### Add Items at the beginning of an empty List
+
+This example will add `["New Item 1", "New Item 2"]` at the beginning of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at the beginning of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item 1", "New Item 2"]
+```
+
+***
+
+### Add Items at the beginning of a List
+
+This example will add `["New Item 1", "New Item 2"]` at the beginning of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at the beginning of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item 1", "New Item 2", "Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Items][Items Property] are added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Items
+
+The [Items][Items Property] to be added at the beginning of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Items][Items Property] is `null`. |
+
+## Remarks
+
+### Empty Items
+
+If [Items][Items Property] is empty (i.e. `[]`) there is nothing to add, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-end-block-2.md
new file mode 100644
index 000000000..d447abfea
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-end-block-2.md
@@ -0,0 +1,139 @@
+---
+title: "Add Items At End"
+linkTitle: "Add Items At End"
+description: "Adds Items at the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemsAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Items][Items Property] at the end of a [List][List Property].
+
+## Examples
+
+### Add Items at the end of an empty List
+
+This example will add `["New Item 1", "New Item 2"]` at the end of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at the end of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item 1", "New Item 2"]
+```
+
+***
+
+### Add Items at the end of a List
+
+This example will add `["New Item 1", "New Item 2"]` at the end of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at the end of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1, "New Item 1", "New Item 2"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Items][Items Property] are added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Items
+
+The [Items][Items Property] to be added at the end of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Items][Items Property] is `null`. |
+
+## Remarks
+
+### Empty Items
+
+If [Items][Items Property] is empty (i.e. `[]`) there is nothing to add, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-index-block-2.md
new file mode 100644
index 000000000..07914cdbd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/add-item/add-items-at-index-block-2.md
@@ -0,0 +1,185 @@
+---
+title: "Add Items At Index"
+linkTitle: "Add Items At Index"
+description: "Adds Items at the specified Index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_AddItem_AddItemsAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Items][Items Property] at the specified [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Add Items at the first index (i.e. `0`) of an empty List
+
+This example will add `["New Item 1", "New Item 2"]` at index `0` of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at index `0` of `[]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item 1", "New Item 2"]
+```
+
+***
+
+### Add Items at the first Index (i.e. `0`) of a List
+
+This example will add `["New Item 1", "New Item 2"]` at index `0` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at index `0` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["New Item 1", "New Item 2", "Some Text", 1]
+```
+
+***
+
+### Add Items at the end (i.e. Index equals count of items) of a List
+
+This example will add `["New Item 1", "New Item 2"]` at index `2` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Items][Items Property] | `($)Items`, with value `["New Item 1", "New Item 2"]` | `($)Items` is a variable of type [IEnumerable][]<[String][]> |
+| [Index][Index Property] | `($)Index`, with value `2` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `["New Item 1", "New Item 2"]` at index `2` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1, "New Item 1", "New Item 2"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the [Items][Items Property] are added.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be added to the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Items
+
+The [Items][Items Property] to be added at the specified [Index][Index Property] of the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Index
+
+The [Index][Index Property] to add the [Items][Items Property] at.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property].
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Items][Items Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is out of the range of the list indexes. Valid indexes are between and including `0` and the count of items in the [List][List Property]. |
+
+## Remarks
+
+### Empty Items
+
+If [Items][Items Property] is empty (i.e. `[]`) there is nothing to add, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Items Property]: {{< ref "#items" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/_index.md
new file mode 100644
index 000000000..30f4fc7df
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Contains Item(s)"
+linkTitle: "Contains Item(s)"
+description: "Check if an item or multiple items are contained in a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-item-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-item-with-value-block-2.md
new file mode 100644
index 000000000..7f1b5c433
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-item-with-value-block-2.md
@@ -0,0 +1,167 @@
+---
+title: "Contains Item With Value"
+linkTitle: "Contains Item With Value"
+description: "Checks if a List contains at least one item matching the specified value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_ContainsItem_ContainsItemWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [List][List Property] contains at least one item matching [Value][Value Property].
+
+## Examples
+
+### List contains item with Value
+
+This example will check whether `[1, 2, 3, 3, 2, 1]` contains the value `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`[1, 2, 3, 3, 2, 1]` contains two items with the value `1`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### List does not contain item with Value
+
+This example will check whether `[1, 2, 3, 3, 2, 1]` contains the value `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `10` | `($)Value` is a variable of type [Int32][] |
+| [Contains Item][ContainsItem Property] | `($)ContainsItem`, with no value | `($)ContainsItem` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`[1, 2, 3, 3, 2, 1]` does not contain any items with the value `10`. Therefore, the variable `($)ContainsItem` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to check whether it contains at least one item matching the specified [Value][Value Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] to check for matching items.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Item
+
+The result of the contains item check.
+
+If [List][List Property] contains at least one item matching the specified [Value][Value Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItem` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Contains Item][ContainsItem Property] property is set to `false`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[ContainsItem Property]: {{< ref "#contains-item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-items-with-values-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-items-with-values-block-2.md
new file mode 100644
index 000000000..2786f60c7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/contains-item/contains-items-with-values-block-2.md
@@ -0,0 +1,168 @@
+---
+title: "Contains Items With Values"
+linkTitle: "Contains Items With Values"
+description: "Checks if a List contains at least one item matching each of the specified values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_ContainsItem_ContainsItemsWithValuesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [List][List Property] contains at least one item matching each of the specified [Values][Values Property].
+
+## Examples
+
+### List contains items with Values
+
+This example will check whether `[1, 2, 3, 3, 2, 1]` contains at least one item matching each of the values in `[1, 2, 3]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`[1, 2, 3, 3, 2, 1]` contains at least one item matching each of the values in `[1, 2, 3]`; it contains two items with the value `1`, two items with the value `2` and two items with the value `3`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### List does not contain items with Values
+
+This example will check whether `[1, 2, 3, 3, 2, 1]` contains at least one item matching each of the values in `[1, 2, 3, 10]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3, 10]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Contains Items][ContainsItems Property] | `($)ContainsItems`, with no value | `($)ContainsItems` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`[1, 2, 3, 3, 2, 1]` does not contain at least one item matching each of the values in `[1, 2, 3, 10]`; it contains two items with the value `1`, two items with the value `2` and two items with the value `3`, but no items with the value `10`. Therefore, the variable `($)ContainsItems` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to check whether it contains at least one item matching each of the specified [Values][Values Property].
+
+Items are considered matching if they have a value matching one of the specified [Values][Values Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Values
+
+The [Values][Values Property] to check for matching items.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Contains Items
+
+The result of the contains items check.
+
+If [List][List Property] contains at least one item matching each of the specified [Values][Values Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsItems` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] or [Values][Values Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`), the variable specified in the [Contains Items][ContainsItems Property] property is set to `false`.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Values Property]: {{< ref "#values" >}}
+[ContainsItems Property]: {{< ref "#contains-items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/_index.md
new file mode 100644
index 000000000..cb3bb09ff
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Item(s)"
+linkTitle: "Get Item(s)"
+description: "Get an item or multiple items from a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-beginning-block-2.md
new file mode 100644
index 000000000..23a5e294c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-beginning-block-2.md
@@ -0,0 +1,113 @@
+---
+title: "Get Item At Beginning"
+linkTitle: "Get Item At Beginning"
+description: "Gets the item at the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Item][Item Property] at the beginning of a [List][List Property].
+
+## Examples
+
+### Get the Item at the beginning of a List
+
+This example will get the item at the beginning of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [String]) |
+
+#### Result
+
+Getting the item at the beginning of `["Some Text", 1]` results in the variable `($)Item` being updated to the following:
+
+```json
+"Some Text"
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the item from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Item
+
+The [Item][Item Property] at the beginning of [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-end-block-2.md
new file mode 100644
index 000000000..97d639aaa
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-end-block-2.md
@@ -0,0 +1,113 @@
+---
+title: "Get Item At End"
+linkTitle: "Get Item At End"
+description: "Gets the item at the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Lists.GetItem.GetItemAtEndBlock`2)
+
+## Description
+
+Gets the [Item][Item Property] at the end of a [List][List Property].
+
+## Examples
+
+### Get the Item at the end of a List
+
+This example will get the item at the end of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [Int32]) |
+
+#### Result
+
+Getting the item at the end of `["Some Text", 1]` results in the variable `($)Item` being updated to the following:
+
+```json
+1
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the item from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Item
+
+The [Item][Item Property] at the end of [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-index-block-2.md
new file mode 100644
index 000000000..69d663f1b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-item-at-index-block-2.md
@@ -0,0 +1,157 @@
+---
+title: "Get Item At Index"
+linkTitle: "Get Item At Index"
+description: "Gets the item at the specified index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Item][Item Property] at the specified [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Get the Item at the first Index (i.e. `0`) of a List
+
+This example will get the item at index `0` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [String]) |
+
+#### Result
+
+Getting the item at index `0` of `["Some Text", 1]` results in the variable `($)Item` being updated to the following:
+
+```json
+"Some Text"
+```
+
+***
+
+### Get the Item at the last Index (i.e. Index equals count of items - `1`) of a List
+
+This example will get the item at index `1` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `1` | `($)Index` is a variable of type [Int32][] |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [Int32]) |
+
+#### Result
+
+Getting the item at index `1` of `["Some Text", 1]` results in the variable `($)Item` being updated to the following:
+
+```json
+1
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the item from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Index
+
+The [Index][Index Property] to get the item at.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Item
+
+The [Item][Item Property] at the specified [Index][Index Property] of [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Item` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [List][List Property] contains no items. |
+| | Thrown when [Index][Index Property] is out of the range of the list indexes. Valid indexes are between and including `0` and the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Index Property]: {{< ref "#index" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-beginning-block-2.md
new file mode 100644
index 000000000..75dc649e9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-beginning-block-2.md
@@ -0,0 +1,137 @@
+---
+title: "Get Items At Beginning"
+linkTitle: "Get Items At Beginning"
+description: "Gets a count of items at the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemsAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the specified [Count][Count Property] of [Items][Items Property] at the beginning of a [List][List Property].
+
+## Examples
+
+### Get Count of Items at the beginning of a List
+
+This example will get `2` items at the beginning of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[dynamic][]> value |
+
+#### Result
+
+Getting `2` items from the beginning of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)Items` being updated to the following:
+
+```json
+["Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Items][Items Property] from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Count
+
+The [Count][Count Property] of [Items][Items Property] to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Items
+
+The [Items][Items Property] at the beginning of [List][List Property].
+
+[Items][Items Property] will be in the same order they are defined in [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Negative Count
+
+If [Count][Count Property] is negative, [Items][Items Property] contains all items in the [List][List Property].
+
+### Zero Count
+
+If [Count][Count Property] is `0`, [Items][Items Property] is set to an empty list (i.e. `[]`).
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Count Property]: {{< ref "#count" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-end-block-2.md
new file mode 100644
index 000000000..5ee1c5db0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-end-block-2.md
@@ -0,0 +1,137 @@
+---
+title: "Get Items At End"
+linkTitle: "Get Items At End"
+description: "Gets a count of items at the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemsAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the specified [Count][Count Property] of [Items][Items Property] at the end of a [List][List Property].
+
+## Examples
+
+### Get Count of Items at the end of a List
+
+This example will get `2` items at the end of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[dynamic][]> value |
+
+#### Result
+
+Getting `2` items from the end of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)Items` being updated to the following:
+
+```json
+["Some More Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Items][Items Property] from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Count
+
+The [Count][Count Property] of [Items][Items Property] to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Items
+
+The [Items][Items Property] at the end of [List][List Property].
+
+[Items][Items Property] will be in the same order they are defined in [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Negative Count
+
+If [Count][Count Property] is negative, [Items][Items Property] contains all items in the [List][List Property].
+
+### Zero Count
+
+If [Count][Count Property] is `0`, [Items][Items Property] is set to an empty list (i.e. `[]`).
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Count Property]: {{< ref "#count" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-index-block-2.md
new file mode 100644
index 000000000..c48e83d76
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-index-block-2.md
@@ -0,0 +1,162 @@
+---
+title: "Get Items At Index"
+linkTitle: "Get Items At Index"
+description: "Gets a count of items starting at the specified index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemsAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the specified [Count][Count Property] of [Items][Items Property] starting at the given [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Get Count of Items at the first Index (i.e. `0`) of a List
+
+This example will get `2` items at index `0` of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[dynamic][]> value |
+
+#### Result
+
+Getting `2` items at index `0` of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)Items` being updated to the following:
+
+```json
+["Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Items][Items Property] from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Index
+
+The [Index][Index Property] to get the [Count][Count Property] of [Items][Items Property] at. This is an inclusive index, which means the item at the specified index will be included.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Count
+
+The [Count][Count Property] of [Items][Items Property] to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Items
+
+The [Items][Items Property] at the specified [Index][Index Property] of [List][List Property].
+
+[Items][Items Property] will be in the same order they are defined in [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+| | Thrown when [Index][Index Property] + [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Index is inclusive
+
+The [Index][Index Property] is an inclusive [index][Indexes], which means the item at the index will be included in [Items][Items Property].
+
+### Negative Count
+
+If [Count][Count Property] is negative, [Items][Items Property] contains all items after and including the item at the specified [Index][Index Property] in the [List][List Property].
+
+### Zero Count
+
+If [Count][Count Property] is `0`, [Items][Items Property] is set to an empty list (i.e. `[]`).
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Index Property]: {{< ref "#index" >}}
+[Count Property]: {{< ref "#count" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-indexes-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-indexes-block-2.md
new file mode 100644
index 000000000..9ae92f53e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/get-item/get-items-at-indexes-block-2.md
@@ -0,0 +1,139 @@
+---
+title: "Get Items At Indexes"
+linkTitle: "Get Items At Indexes"
+description: "Gets the items at each of the specified indexes of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_GetItem_GetItemsAtIndexesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Items][Items Property] at each of the specified [Indexes][Indexes Property] of a [List][List Property].
+
+## Examples
+
+### Get Items at the first and third Indexes (i.e. [`0`, `2`]) of a List
+
+This example will get items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Indexes][Indexes Property] | `($)Indexes`, with value [`0`, `2`] | `($)Indexes` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to an [IList][]<[dynamic][]> value |
+
+#### Result
+
+Getting items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)Items` being updated to the following:
+
+```json
+["Some Text", "Some More Text"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to get the [Items][Items Property] from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Indexes
+
+The [Indexes][Indexes Property] of the [Items][Items Property] to get.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[Int32][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+### Items
+
+The [Items][Items Property] at the specified [Indexes][Indexes Property] of [List][List Property].
+
+[Items][Items Property] will be in the order they are defined in [Indexes][Indexes Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [DuplicateValueException][] | Thrown when [Indexes][Indexes Property] contains duplicate values. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Indexes][Indexes Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Indexes][Indexes Property] contains no values. |
+| | Thrown when any index in [Indexes][Indexes Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Indexes Property]: {{< ref "#indexes" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[DuplicateValueException]: {{< url path="Cortex.Reference.Exceptions.Lists.DuplicateValueException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/_index.md
new file mode 100644
index 000000000..233ff40fb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Remove Item(s)"
+linkTitle: "Remove Item(s)"
+description: "Remove an item or multiple items from a list."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-all-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-all-items-block-2.md
new file mode 100644
index 000000000..de5db2ef2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-all-items-block-2.md
@@ -0,0 +1,121 @@
+---
+title: "Remove All Items"
+linkTitle: "Remove All Items"
+description: "Removes all items from a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveAllItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items from a [List][List Property].
+
+## Examples
+
+### Remove all items from an empty List
+
+This example will attempt to remove all items from `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Attempting to remove all items from `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove all items from a List
+
+This example will remove all items from `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Removing all items from `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where all items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-duplicate-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-duplicate-items-block-2.md
new file mode 100644
index 000000000..9763d5c85
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-duplicate-items-block-2.md
@@ -0,0 +1,153 @@
+---
+title: "Remove Duplicate Items"
+linkTitle: "Remove Duplicate Items"
+description: "Removes duplicate items from a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveDuplicateItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes duplicate items from a [List][List Property].
+
+## Examples
+
+### Remove duplicate items from an empty List
+
+This example will attempt to remove duplicate items from `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Attempting to remove duplicate items from `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove duplicate items from a List without duplicates
+
+This example will attempt to remove duplicate items from `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Attempting to remove duplicate items from `["Some Text", 1]` results in no operation, as there are no duplicates to remove. Therefore, the variable `($)List` remains:
+
+```json
+["Some Text", 1]
+```
+
+***
+
+### Remove duplicate items from a List containing duplicates
+
+This example will remove duplicate items from `["Some Text", 1, "Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Removing duplicate items from `["Some Text", 1, "Some Text", 1]` results in the second occurrences of `"Some Text"` and `1` being removed; with the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where duplicate items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+For information and examples of how it is determined whether two items are considered the same, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### List with no duplicates
+
+If [List][List Property] does not contain duplicates there is nothing to remove, so no operation is performed.
+
+### Which duplicates are removed?
+
+If [List][List Property] contains duplicates, the first occurrences of the duplicated items are kept; all other occurrences are removed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-beginning-block-2.md
new file mode 100644
index 000000000..f863a6ab9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-beginning-block-2.md
@@ -0,0 +1,121 @@
+---
+title: "Remove Item At Beginning"
+linkTitle: "Remove Item At Beginning"
+description: "Removes the item at the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the item at the beginning of a [List][List Property].
+
+## Examples
+
+### Remove the Item at the beginning of an empty List
+
+This example will attempt to remove the item at the beginning of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Attempting to remove the item at the beginning of `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove the Item at the beginning of a List
+
+This example will remove the item at the beginning of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Removing the item at the beginning of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the item is removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-end-block-2.md
new file mode 100644
index 000000000..96dc25d90
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-end-block-2.md
@@ -0,0 +1,121 @@
+---
+title: "Remove Item At End"
+linkTitle: "Remove Item At End"
+description: "Removes the item at the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the item at the end of a [List][List Property].
+
+## Examples
+
+### Remove the Item at the end of an empty List
+
+This example will attempt to remove the item at the end of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Attempting to remove the item at the end of `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove the Item at the end of a List
+
+This example will remove the item at the end of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+
+#### Result
+
+Removing the item at the end of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the item is removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-index-block-2.md
new file mode 100644
index 000000000..558e0390f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-at-index-block-2.md
@@ -0,0 +1,163 @@
+---
+title: "Remove Item At Index"
+linkTitle: "Remove Item At Index"
+description: "Removes the item at the specified index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the item at the specified [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Remove the Item at the first Index (i.e. `0`) of an empty List
+
+This example will attempt to remove the item at index `0` of `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove the item at index `0` of `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove the Item at the first Index (i.e. `0`) of a List
+
+This example will remove the item at index `0` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Removing the item at index `0` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[1]
+```
+
+***
+
+### Remove the Item at the last Index (i.e. Index equals count of items - `1`) of a List
+
+This example will remove the item at index `1` of `["Some Text", 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `1` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Remove the item at index `1` of `["Some Text", 1]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the item is removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Index
+
+The [Index][Index Property] to remove the item at.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is out of the range of the list indexes. Valid indexes are between and including `0` and the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-with-value-block-2.md
new file mode 100644
index 000000000..e63608b42
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-item-with-value-block-2.md
@@ -0,0 +1,207 @@
+---
+title: "Remove Item With Value"
+linkTitle: "Remove Item With Value"
+description: "Removes the specified occurrence of an item matching a value from a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Occurrence][Occurrence Property] of an item matching a [Value][Value Property] from a [List][List Property].
+
+## Examples
+
+### Remove the first Occurrence of an item matching a Value from an empty List
+
+This example will attempt to remove the first occurrence of an item matching the value `1` from `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove the first occurrence of an item matching the value `1` from `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove the first Occurrence of an item matching a Value from a List
+
+This example will attempt to remove the first occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means remove the first occurrence; `2` means second etc.
+
+Attempting to remove the first occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[2, 3, 3, 2, 1]
+```
+
+***
+
+### Remove the last Occurrence of an item matching a Value from a List
+
+This example will attempt to remove the last occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means remove the last occurrence; `-2` means second last etc.
+
+Attempting to remove the last occurrence of an item matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[1, 2, 3, 3, 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to remove the specified [Occurrence][Occurrence Property] of matching item from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the item to remove must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to remove from the [List][List Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Occurrences
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### No items matching Value, or Occurrence is not present
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property] or the specified [Occurrence][Occurrence Property] is not present, there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-beginning-block-2.md
new file mode 100644
index 000000000..9b06f2d6f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-beginning-block-2.md
@@ -0,0 +1,123 @@
+---
+title: "Remove Items At Beginning"
+linkTitle: "Remove Items At Beginning"
+description: "Removes a count of items from the beginning of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Count][Count Property] of items from the beginning of a [List][List Property].
+
+## Examples
+
+### Remove Count of items from the beginning of a List
+
+This example will remove `2` items from the beginning of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+
+#### Result
+
+Removing `2` items from the beginning of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some More Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Count
+
+The [Count][Count Property] of items to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Negative Count
+
+If [Count][Count Property] is negative all items in the [List][List Property] are removed.
+
+### Zero Count
+
+If [Count][Count Property] is `0` there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-end-block-2.md
new file mode 100644
index 000000000..7b1f535a6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-end-block-2.md
@@ -0,0 +1,123 @@
+---
+title: "Remove Items At End"
+linkTitle: "Remove Items At End"
+description: "Removes a count of items from the end of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Count][Count Property] of items from the end of a [List][List Property].
+
+## Examples
+
+### Remove Count of items from the end of a List
+
+This example will remove `2` items from the end of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+
+#### Result
+
+Removing `2` items from the end of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Count
+
+The [Count][Count Property] of items to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Negative Count
+
+If [Count][Count Property] is negative all items in the [List][List Property] are removed.
+
+### Zero Count
+
+If [Count][Count Property] is `0` there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-index-block-2.md
new file mode 100644
index 000000000..57e59601c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-index-block-2.md
@@ -0,0 +1,148 @@
+---
+title: "Remove Items At Index"
+linkTitle: "Remove Items At Index"
+description: "Removes a count of items starting at the specified index of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the specified [Count][Count Property] of items starting at the given [Index][Index Property] of a [List][List Property].
+
+## Examples
+
+### Remove Count of items at the first Index (i.e. `0`) of a List
+
+This example will remove `2` items at index `0` of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+
+#### Result
+
+Removing `2` items at index `0` of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)List` being updated to the following:
+
+```json
+["Some More Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Index
+
+The [Index][Index Property] to remove the [Count][Count Property] of items at. This is an inclusive index, which means the item at the specified index will be included.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Count
+
+The [Count][Count Property] of items to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+| | Thrown when [Index][Index Property] + [Count][Count Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Index is inclusive
+
+The [Index][Index Property] is an inclusive [index][Indexes], which means the item at the index will be included in the removed items.
+
+### Negative Count
+
+If [Count][Count Property] is negative all items after and including the specified [Index][Index property] in the [List][List Property] are removed.
+
+### Zero Count
+
+If [Count][Count Property] is `0` there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Index Property]: {{< ref "#index" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-indexes-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-indexes-block-2.md
new file mode 100644
index 000000000..5ae474585
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-at-indexes-block-2.md
@@ -0,0 +1,125 @@
+---
+title: "Remove Items At Indexes"
+linkTitle: "Remove Items At Indexes"
+description: "Removes the items at each of the specified indexes of a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsAtIndexesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes the items at each of the specified [Indexes][Indexes Property] of a [List][List Property].
+
+## Examples
+
+### Remove items at the first and third Indexes (i.e. [`0`, `2`]) of a List
+
+This example will remove items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Indexes][Indexes Property] | `($)Indexes`, with value [`0`, `2`] | `($)Indexes` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Removing items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]` results in the variable `($)List` being updated to the following:
+
+```json
+[1, 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] where the items are removed from.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Indexes
+
+The [Indexes][Indexes Property] of the items to remove.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[Int32][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [DuplicateValueException][] | Thrown when [Indexes][Indexes Property] contains duplicate values. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Indexes][Indexes Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Indexes][Indexes Property] contains no values. |
+| | Thrown when any index in [Indexes][Indexes Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Indexes Property]: {{< ref "#indexes" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[DuplicateValueException]: {{< url path="Cortex.Reference.Exceptions.Lists.DuplicateValueException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-value-block-2.md
new file mode 100644
index 000000000..f64d98740
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-value-block-2.md
@@ -0,0 +1,156 @@
+---
+title: "Remove Items With Value"
+linkTitle: "Remove Items With Value"
+description: "Removes all items matching a value from a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items matching a [Value][Value Property] from a [List][List Property].
+
+## Examples
+
+### Remove all items matching a Value from an empty List
+
+This example will attempt to remove all items matching the value `1` from `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove all items matching the value `1` from `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove all items matching a Value from a List
+
+This example will attempt to remove all items matching the value `1` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to remove all items matching the value `1` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[2, 3, 3, 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to remove all matching items from.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the items to remove must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### No items matching Value
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property], there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-values-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-values-block-2.md
new file mode 100644
index 000000000..407501cf9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/remove-item/remove-items-with-values-block-2.md
@@ -0,0 +1,161 @@
+---
+title: "Remove Items With Values"
+linkTitle: "Remove Items With Values"
+description: "Removes all items matching one of the specified values from a List."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_RemoveItem_RemoveItemsWithValuesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes all items matching one of the specified [Values][Values Property] from a [List][List Property].
+
+## Examples
+
+### Remove all items matching one of the specified Values from an empty List
+
+This example will attempt to remove all items matching one of the values `[1, 2]` from `[]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to remove all items matching one of the values `[1, 2]` from `[]` results in no operation, as there is nothing to remove. Therefore, the variable `($)List` remains:
+
+```json
+[]
+```
+
+***
+
+### Remove all items matching one of the specified Values from a List
+
+This example will attempt to remove all items matching one of the values `[1, 2]` from `[1, 2, 3, 3, 2, 1]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to remove all items matching one of the values `[1, 2]` from `[1, 2, 3, 3, 2, 1]` results in the variable `($)List` being updated to the following:
+
+```json
+[3, 3]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to remove all matching items from.
+
+Items are considered matching if they have one of the specified [Values][Values Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items that can be removed from the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Values
+
+The [Values][Values Property] the items to remove must match one of.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Values][Values Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to remove, so no operation is performed.
+
+### Empty Values
+
+If [Values][Values Property] is empty (i.e. `[]`) there are no values to match, therefore nothing can be removed and no operation is performed.
+
+### No items matching a specified value in Values
+
+If [List][List Property] does not contain items matching one of the specified [Values][Values Property], there is nothing to remove for that value.
+
+### No items matching Values
+
+If [List][List Property] does not contain items matching any of the specified [Values][Values Property], there is nothing to remove, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Values Property]: {{< ref "#values" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/_index.md
new file mode 100644
index 000000000..1a848c4be
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Set Item(s)"
+linkTitle: "Set Item(s)"
+description: "Set an item or multiple items in a list to a new value."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-all-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-all-items-block-2.md
new file mode 100644
index 000000000..0c6cde53a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-all-items-block-2.md
@@ -0,0 +1,122 @@
+---
+title: "Set All Items"
+linkTitle: "Set All Items"
+description: "Sets all items in a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetAllItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Lists.SetItem.SetAllItemsBlock`2)
+
+## Description
+
+Sets all items in a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set all items in a List to a New Value
+
+This example will set all items in `["Some Text", 1]` to `"New Value"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `"New Value"` | `($)NewValue` is a variable of type [String] |
+
+#### Result
+
+Setting all items in `["Some Text", 1]` to `"New Value"` results in the variable `($)List` being updated to the following:
+
+```json
+["New Value", "New Value"]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set all items in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Value
+
+The [New Value][NewValue Property] to set all items in [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-beginning-block-2.md
new file mode 100644
index 000000000..4dcfab374
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-beginning-block-2.md
@@ -0,0 +1,120 @@
+---
+title: "Set Item At Beginning"
+linkTitle: "Set Item At Beginning"
+description: "Sets the item at the beginning of a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the item at the beginning of a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the item at the beginning of a List to a New Value
+
+This example will set the item at the beginning of `["Some Text", 1]` to `"Some Modified Text"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `"Some Modified Text"` | `($)NewValue` is a variable of type [String] |
+
+#### Result
+
+Setting the item at the beginning of `["Some Text", 1]` to `"Some Modified Text"` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Modified Text", 1]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the item in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Value
+
+The [New Value][NewValue Property] to set the item at the beginning of [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-end-block-2.md
new file mode 100644
index 000000000..10c267ac4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-end-block-2.md
@@ -0,0 +1,120 @@
+---
+title: "Set Item At End"
+linkTitle: "Set Item At End"
+description: "Sets the item at the end of a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Lists.SetItem.SetItemAtEndBlock`2)
+
+## Description
+
+Sets the item at the end of a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the item at the end of a List to a New Value
+
+This example will set the item at the end of `["Some Text", 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32] |
+
+#### Result
+
+Setting the item at the end of `["Some Text", 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the item in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Value
+
+The [New Value][NewValue Property] to set the item at the end of [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-index-block-2.md
new file mode 100644
index 000000000..4aca09744
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-at-index-block-2.md
@@ -0,0 +1,163 @@
+---
+title: "Set Item At Index"
+linkTitle: "Set Item At Index"
+description: "Sets the item at the specified index of a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the item at the specified [Index][Index Property] of a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the Item at the first Index (i.e. `0`) of a List to a New Value
+
+This example will set the item at index `0` of `["Some Text", 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Setting the item at index `0` of `["Some Text", 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+[10, 1]
+```
+
+***
+
+### Set the Item at the last Index (i.e. Index equals count of items - `1`) of a List
+
+This example will set the item at index `1` of `["Some Text", 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32] |
+| [Index][Index Property] | `($)Index`, with value `1` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Setting the item at index `1` of `["Some Text", 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the item in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Value
+
+The [New Value][NewValue Property] to set the item at the specified [Index][Index Property] of [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Index
+
+The [Index][Index Property] to set the item at.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [New Value][NewValue Property] is `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [List][List Property] contains no items. |
+| | Thrown when [Index][Index Property] is out of the range of the list indexes. Valid indexes are between and including `0` and the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-with-value-block-2.md
new file mode 100644
index 000000000..f4f278cbd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-item-with-value-block-2.md
@@ -0,0 +1,200 @@
+---
+title: "Set Item With Value"
+linkTitle: "Set Item With Value"
+description: "Sets the specified occurrence of an item matching a value in a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the specified [Occurrence][Occurrence Property] of an item matching a [Value][Value Property] in a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set the first Occurrence of an item matching a Value in a List to a New Value
+
+This example will attempt to set the first occurrence of an item matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means set the first occurrence; `2` means second etc.
+
+Attempting to set the first occurrence of an item matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+[10, 2, 3, 3, 2, 1]
+```
+
+***
+
+### Set the last Occurrence of an item matching a Value in a List to a New Value
+
+This example will attempt to set the last occurrence of an item matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1`, means set the last occurrence; `-2` means second last etc.
+
+Attempting to set the last occurrence of an item matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+[1, 2, 3, 3, 2, 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the specified [Occurrence][Occurrence Property] of matching item in.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the item to set must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set the specified [Occurrence][Occurrence Property] of matching item in [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of matching item to set in the [List][List Property].
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] or [New Value][NewValue Property] are `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Occurrences
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### No items matching Value, or Occurrence is not present
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property] or the specified [Occurrence][Occurrence Property] is not present, there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-beginning-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-beginning-block-2.md
new file mode 100644
index 000000000..c7636b076
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-beginning-block-2.md
@@ -0,0 +1,123 @@
+---
+title: "Set Items At Beginning"
+linkTitle: "Set Items At Beginning"
+description: "Sets the items at the beginning of a List to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsAtBeginningBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the items at the beginning of a [List][List Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set the items at the beginning of a List to New Values
+
+This example will set the first and second items at the beginning of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Values][NewValues Property] | `($)NewValues`, with value `["Some Modified Text", 10]` | `($)NewValues` is a variable of type [IEnumerable][]<[dynamic][]> |
+
+#### Result
+
+Setting the first and second items at the beginning of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively, results in the variable `($)List` being updated to the following:
+
+```json
+["Some Modified Text", 10, "Some More Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the items in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items at the beginning of [List][List Property] to.
+
+The number of items in [New Values][NewValues Property] determines the number of items that will be set at the beginning of [List][List Property]. One item means only the first item is set, two items means the first and second items are set etc.
+
+The first item in [List][List Property] will be set to the first value in [New Values][NewValues Property]; the second item in [List][List Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [New Values][NewValues Property] is `null`. |
+
+## Remarks
+
+### Empty New Values
+
+If [New Values][NewValues Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-end-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-end-block-2.md
new file mode 100644
index 000000000..d9bb48327
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-end-block-2.md
@@ -0,0 +1,123 @@
+---
+title: "Set Items At End"
+linkTitle: "Set Items At End"
+description: "Sets the items at the end of a List to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsAtEndBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the items at the end of a [List][List Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set the items at the end of a List to New Values
+
+This example will set the second last and last items at the end of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Values][NewValues Property] | `($)NewValues`, with value `["Some Modified Text", 10]` | `($)NewValues` is a variable of type [IEnumerable][]<[dynamic][]> |
+
+#### Result
+
+Setting the second last and last items at the end of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively, results in the variable `($)List` being updated to the following:
+
+```json
+["Some Text", 1, "Some Modified Text", 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the items in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items at the end of [List][List Property] to.
+
+The number of items in [New Values][NewValues Property] determines the number of items that will be set at the end of [List][List Property]. One item means only the last item is set, two items means the second last and last items are set etc.
+
+The last item in [List][List Property] will be set to the last value in [New Values][NewValues Property]; the second last item in [List][List Property] will be set to the second last value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyEmptyException][] | Thrown when [List][List Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [New Values][NewValues Property] is `null`. |
+
+## Remarks
+
+### Empty New Values
+
+If [New Values][NewValues Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-index-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-index-block-2.md
new file mode 100644
index 000000000..ee33c69b4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-index-block-2.md
@@ -0,0 +1,146 @@
+---
+title: "Set Items At Index"
+linkTitle: "Set Items At Index"
+description: "Sets the items at the specified index of a List to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsAtIndexBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the items at the specified [Index][Index Property] of a [List][List Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set the Items at the first Index (i.e. `0`) of a List to New Values
+
+This example will set the 2 items starting at index `0` of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Values][NewValues Property] | `($)NewValues`, with value `["Some Modified Text", 10]` | `($)NewValues` is a variable of type [IEnumerable][]<[dynamic][]> |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Setting the two items at index `0` of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", 10]` respectively, results in the variable `($)List` being updated to the following:
+
+```json
+["Some Modified Text", 10, "Some More Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the items in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items at the specified [Index][Index Property] of [List][List Property] to.
+
+The number of items in [New Values][NewValues Property] determines the number of items that will be set at the end of [List][List Property]. One item means one item is set, two items means two items are set etc.
+
+The item at [Index][Index Property] of [List][List Property] will be set to the first value in [New Values][NewValues Property]; the item at [Index][Index Property] + `1` of [List][List Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Index
+
+The [Index][Index Property] to start setting the items at. This is an inclusive index, which means the item at the specified index will be included.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|-------------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [PropertyEmptyException][] | Thrown when [New Values][NewValues Property] contains no items. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [New Values][NewValues Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Index][Index Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+| | Thrown when [Index][Index Property] + count of items in [New Values][NewValues Property] is greater than the count of items in the [List][List Property] - `1`. |
+
+## Remarks
+
+### Index is inclusive
+
+The [Index][Index Property] is an inclusive [index][Indexes], which means the item at the index will be included in the set items.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-indexes-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-indexes-block-2.md
new file mode 100644
index 000000000..3de4ba4e9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-at-indexes-block-2.md
@@ -0,0 +1,146 @@
+---
+title: "Set Items At Indexes"
+linkTitle: "Set Items At Indexes"
+description: "Sets the items at each of the specified indexes of a List to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsAtIndexesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets the items at each of the specified [Indexes][Indexes Property] of a [List][List Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Sets items at the first and third Indexes (i.e. [`0`, `2`]) of a List to New Values
+
+This example will set items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", "Some More Modified Text"]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `["Some Text", 1, "Some More Text", 2]` | `($)List` is a variable of type [IList][]<[dynamic][]> |
+| [New Values][NewValues Property] | `($)NewValues`, with value `["Some Modified Text", "Some More Modified Text"]` | `($)NewValues` is a variable of type [IEnumerable][]<[String][]> |
+| [Indexes][Indexes Property] | `($)Indexes`, with value [`0`, `2`] | `($)Indexes` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Setting items at indexes `0` and `2` of `["Some Text", 1, "Some More Text", 2]` to `["Some Modified Text", "Some More Modified Text"]` respectively, results in the variable `($)List` being updated to the following:
+
+```json
+["Some Modified Text", 1, "Some More Modified Text", 2]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set the items in.
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items at the specified [Indexes][Indexes Property] of [List][List Property] to.
+
+The number of items in [New Values][NewValues Property] must match the number of items in [Indexes][Indexes Property].
+
+The [List][List Property] item at the first index in [Indexes][Indexes Property] will be set to the first value in [New Values][NewValues Property]; the [List][List Property] item at the second index in [Indexes][Indexes Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Indexes
+
+The [Indexes][Indexes Property] of the items to set.
+
+Valid values are between and including `0` and the total count of items in the [List][List Property] - `1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[Int32][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [DuplicateValueException][] | Thrown when [Indexes][Indexes Property] contains duplicate values. |
+| [PropertyItemCountException][] | Thrown when the count of items in [New Values][NewValues Property] and the count of items in [Indexes][Indexes Property] are not the same. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [New Values][NewValues Property] or [Indexes][Indexes Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Indexes][Indexes Property] contains no values. |
+| | Thrown when any index in [Indexes][Indexes Property] is less than `0` or greater than the count of items in [List][List Property] - `1`. |
+
+## Remarks
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+[Indexes Property]: {{< ref "#indexes" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[DuplicateValueException]: {{< url path="Cortex.Reference.Exceptions.Lists.DuplicateValueException.MainDoc" >}}
+[PropertyItemCountException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyItemCountException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-value-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-value-block-2.md
new file mode 100644
index 000000000..a7fb27054
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-value-block-2.md
@@ -0,0 +1,149 @@
+---
+title: "Set Items With Value"
+linkTitle: "Set Items With Value"
+description: "Sets all items matching a value in a List to a new value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsWithValueBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets all items matching a [Value][Value Property] in a [List][List Property] to a [New Value][NewValue Property].
+
+## Examples
+
+### Set all items matching a Value in a List to a New Value
+
+This example will attempt to set all items matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Value][Value Property] | `($)Value`, with value `1` | `($)Value` is a variable of type [Int32][] |
+| [New Value][NewValue Property] | `($)NewValue`, with value `10` | `($)NewValue` is a variable of type [Int32][] |
+
+#### Result
+
+Attempting to set all items matching the value `1` in `[1, 2, 3, 3, 2, 1]` to `10` results in the variable `($)List` being updated to the following:
+
+```json
+[10, 2, 3, 3, 2, 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set all matching items in.
+
+Items are considered matching if they have the specified [Value][Value Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Value
+
+The [Value][Value Property] the items to set must match.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Value
+
+The [New Value][NewValue Property] to set all matching items in [List][List Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [InvalidPropertyValueException][] | Thrown when [Value][Value Property] or [New Value][NewValue Property] are `null` and [List][List Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [List][List Property] is `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### No items matching Value
+
+If [List][List Property] does not contain items matching the specified [Value][Value Property], there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Value Property]: {{< ref "#value" >}}
+[NewValue Property]: {{< ref "#new-value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-values-block-2.md b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-values-block-2.md
new file mode 100644
index 000000000..8100b1aee
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Lists/set-item/set-items-with-values-block-2.md
@@ -0,0 +1,157 @@
+---
+title: "Set Items With Values"
+linkTitle: "Set Items With Values"
+description: "Sets all items matching one of the specified values in a List to new values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Lists_SetItem_SetItemsWithValuesBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Set all items matching one of the specified [Values][Values Property] in a [List][List Property] to [New Values][NewValues Property].
+
+## Examples
+
+### Set all items matching one of the specified Values in a List to New Values
+
+This example will attempt to set all items matching one of the values `[1, 2]` in `[1, 2, 3, 3, 2, 1]` to `[10, 20]` respectively.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [List][List Property] | `($)List`, with value `[1, 2, 3, 3, 2, 1]` | `($)List` is a variable of type [IList][]<[Int32][]> |
+| [Values][Values Property] | `($)Values`, with value `[1, 2]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [NewValues][NewValues Property] | `($)NewValues`, with value `[10, 20]` | `($)NewValues` is a variable of type [IEnumerable][]<[Int32][]> |
+
+#### Result
+
+Attempting to set all items matching one of the values `[1, 2]` in `[1, 2, 3, 3, 2, 1]` to `[10, 20]` respectively, results in the variable `($)List` being updated to the following:
+
+```json
+[10, 20, 3, 3, 20, 10]
+```
+
+***
+
+## Properties
+
+### List
+
+The [List][List Property] to set all matching items in.
+
+Items are considered matching if they have one of the specified [Values][Values Property].
+
+[List][List Property] can be any [IList][]<[TItem][]>, where [TItem][] represents the type of items in the [List][List Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)List` with no value |
+
+### Values
+
+The [Values][Values Property] the items to set must match one of.
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### New Values
+
+The [New Values][NewValues Property] to set the items matching the corresponding [Values][Values Property] in [List][List Property] to.
+
+The number of items in [New Values][NewValues Property] must match the number of items in [Values][Values Property].
+
+[List][List Property] items matching the first value in [Values][Values Property] will be set to the first value in [New Values][NewValues Property]; [List][List Property] items matching the second value in [Values][Values Property] will be set to the second value in [New Values][NewValues Property] etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TItem][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [CannotModifyReadOnlyListException][] | Thrown when [List][List Property] is read-only. |
+| [DuplicateValueException][] | Thrown when [Values][Values Property] contains duplicate values. |
+| [PropertyItemCountException][] | Thrown when the count of items in [Values][Values Property] and the count of items in [New Values][NewValues Property] are not the same, or neither contain any items. |
+| [PropertyNullException][] | Thrown when [List][List Property] or [Values][Values Property] or [New Values][NewValues Property] are `null`. |
+
+## Remarks
+
+### Item Equality
+
+For information and examples of how it is determined whether an item matches a specified value, please see [Object Equality][].
+
+### Empty List
+
+If [List][List Property] is empty (i.e. `[]`) there is nothing to set, so no operation is performed.
+
+### No items matching a specified value in Values
+
+If [List][List Property] does not contain items matching one of the specified [Values][Values Property], there is nothing to set for that value.
+
+### No items matching Values
+
+If [List][List Property] does not contain items matching any of the specified [Values][Values Property], there is nothing to set, so no operation is performed.
+
+### Defining lists using literal syntax
+
+For information about how to define lists using literal syntax, see [Create a List<TItem>][].
+
+### Defining lists using expression syntax
+
+For information about how to define lists using expression syntax, see [Create a List<TItem>][].
+
+### Lists containing items of a single data type vs multiple data types
+
+For information about the different types of lists, including those that can contain only a single type of item, and those that can contain multiple types of item, see [Lists][].
+
+[List Property]: {{< ref "#list" >}}
+[Values Property]: {{< ref "#values" >}}
+[NewValues Property]: {{< ref "#new-values" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Create a List<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Lists]: {{< url path="Cortex.Reference.DataTypes.MostCommon.Lists" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[DuplicateValueException]: {{< url path="Cortex.Reference.Exceptions.Lists.DuplicateValueException.MainDoc" >}}
+[PropertyItemCountException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyItemCountException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/PowerShell/_index.md b/content/en/docs/2026.3/Reference/Blocks/PowerShell/_index.md
new file mode 100644
index 000000000..7bb3eb21b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/PowerShell/_index.md
@@ -0,0 +1,5 @@
+---
+title: "PowerShell"
+linkTitle: "PowerShell"
+description: "Blocks related to working with Windows PowerShell and PowerShell Core."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/_index.md b/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/_index.md
new file mode 100644
index 000000000..abc8da99e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute PowerShell Script"
+linkTitle: "Execute PowerShell Script"
+description: "Blocks related to executing PowerShell scripts with Windows PowerShell and PowerShell Core."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/execute-powershell-script-block-1.md b/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/execute-powershell-script-block-1.md
new file mode 100644
index 000000000..710c76d7b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/PowerShell/execute-powershell-script/execute-powershell-script-block-1.md
@@ -0,0 +1,392 @@
+---
+title: "Execute PowerShell Script"
+linkTitle: "Execute PowerShell Script"
+description: "Executes a PowerShell script on the specified host."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_PowerShell_ExecutePowerShellScript_ExecutePowerShellScriptBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Connects to a host using the specified [PowerShell Session Details][PowerShell Session Details Property], and executes a [Script][Script Property], returning the [Outputs][Outputs Property] and [Records][Records Property].
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the host is closed or is kept open for use on subsequent Execute PowerShell Script blocks.
+
+## Examples
+
+### Execute a Script using PowerShellWinRMSessionDetails
+
+This example will execute a script on the server with the following details:
+
+- Host - `"host.domain.com"`
+- Port - `5986`
+- UseSsl - `true`
+
+The host can be connected to with the following credentials:
+
+- Domain - `"domain.com"`
+- Username - `"username"`
+- Password - `"password"`
+
+The server that the script will be executed on contains a text file in the following location `C:\Folder\Example.txt`, the file contains the following text before the script is executed:
+
+`"This is the content of the file located on the host the script is running on."`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Script][Script Property] | `($)Script` with value `"Get-Content \"C:\\Folder\\Example.txt\""` | `($)Script` is a variable of type [String][] |
+| [Parameters][Parameters Property] | `($)Parameters` with no value | `($)Parameters` is a variable of type [Dictionary][]<[String][], [dynamic][]> |
+| [PowerShell Session Details][PowerShell Session Details Property] | `($)PowerShellSessionDetails` with value `{"ServerDetails": {"Host": "host.domain.com", "Port": 5986, "UseSsl": "true"}, "Credentials": {"Domain": "domain.com", "Username": "username", "Password": "encryptedPassword"}}`
In this example `($)PowerShellSessionDetails` has been set up using the following [Expression][]:
`new PowerShellWinRMSessionDetails(serverDetails: new ServerDetails("host.domain.com", 5986, true), credentials: new UserCredentials("domain.com", "username", "encryptedPassword"))` | `($)Credentials` is a variable of type [PowerShellWinRMSessionDetails][]
The [Password][UserCredentials Password] property within [UserCredentials][] of the [PowerShellWinRMSessionDetails][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession`, with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` will be set to the type [IList][]<[dynamic][]> |
+| [Records][Records Property] | `($)Records`, with no value | `($)Records` will be set to the type [Records][] |
+
+#### Result
+
+Running the [Script][Script Property] results in the variable `($)Outputs` being updated to the following:
+
+```json
+[
+ "This is the content of the file located on the host the script is running on."
+]
+```
+
+It also results in the variable `($)Records` being updated to the following:
+
+```json
+{
+ "ErrorRecords": [],
+ "WarningRecords": [],
+ "DebugRecords": [],
+ "ProgressRecords": [],
+ "VerboseRecords": [],
+ "InformationRecords": []
+}
+```
+
+After the [Script][Script Property] has been executed, the session will be closed, for more information see [Closing Sessions][].
+
+***
+
+### Execute a Script with Parameters using PowerShellWinRMSessionDetails
+
+This example will execute a script on the server with the following details:
+
+- Host - `"host.domain.com"`
+- Port - `5986`
+- UseSsl - `true`
+
+The host can be connected to with the following credentials:
+
+- Domain - `"domain.com"`
+- Username - `"username"`
+- Password - `"password"`
+
+The server that the script will be executed on contains a text file in the following location `C:\Folder\Example.txt`, the file contains the following text before the script is executed:
+
+`"This is the content of the file located on the host the script is running on."`
+
+In this example assume the following variables have been set before the script has been executed:
+
+- `($)FilePath` with the value `"Get-Content \"C:\\Folder\\Example.txt\""`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Script][Script Property] | `($)Script` with value `"Get-Content $FilePath"` | `($)Script` is a variable of type [String][] |
+| [Parameters][Parameters Property] | `($)Parameters` with value `{"FilePath": ($)FilePath"}` | `($)Parameters` is a variable of type [Dictionary][]<[String][], [dynamic][]> |
+| [PowerShell Session Details][PowerShell Session Details Property] | `($)PowerShellSessionDetails` with value `{"ServerDetails": {"Host": "host.domain.com", "Port": 5986, "UseSsl": "true"}, "Credentials": {"Domain": "domain.com", "Username": "username", "Password": "encryptedPassword"}}`
In this example `($)PowerShellSessionDetails` has been set up using the following [Expression][]:
`new PowerShellWinRMSessionDetails(serverDetails: new ServerDetails("host.domain.com", 5986, true), credentials: new UserCredentials("domain.com", "username", "encryptedPassword"))` | `($)Credentials` is a variable of type [PowerShellWinRMSessionDetails][]
The [Password][UserCredentials Password] property within [UserCredentials][] of the [PowerShellWinRMSessionDetails][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession`, with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` will be set to the type [IList][]<[dynamic][]> |
+| [Records][Records Property] | `($)Records`, with no value | `($)Records` will be set to the type [Records][] |
+
+#### Result
+
+Running the [Script][Script Property] results in the variable `($)Outputs` being updated to the following:
+
+```json
+[
+ "This is the content of the file located on the host the script is running on."
+]
+```
+
+It also results in the variable `($)Records` being updated to the following:
+
+```json
+{
+ "ErrorRecords": [],
+ "WarningRecords": [],
+ "DebugRecords": [],
+ "ProgressRecords": [],
+ "VerboseRecords": [],
+ "InformationRecords": []
+}
+```
+
+After the [Script][Script Property] has been executed, the session will be closed, for more information see [Closing Sessions][].
+
+***
+
+### Execute a Script that returns Records using PowerShellWinRMSessionDetails
+
+This example will execute a script on the server with the following details:
+
+- Host - `"host.domain.com"`
+- Port - `5986`
+- UseSsl - `true`
+
+The host can be connected to with the following credentials:
+
+- Domain - `"domain.com"`
+- Username - `"username"`
+- Password - `"password"`
+
+The server that the script will be executed on contains a text file in the following location `C:\Folder\Example.txt`, the file contains the following text before the script is executed:
+
+`"This is the content of the file located on the host the script is running on."`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Script][Script Property] | `($)Script` with value `$@"Get-Content \"C:\\Folder\\Example.txt\"; $DebugPreference = 'Continue'; Write-Warning 'Warning'; Write-Debug 'Debug'; Write-Information 'Information'; Write-Verbose 'Verbose' -Verbose; Get-Error"` | `($)Script` is a variable of type [String][] |
+| [Parameters][Parameters Property] | `($)Parameters` with no value | `($)Parameters` is a variable of type [Dictionary][]<[String][], [dynamic][]> |
+| [PowerShell Session Details][PowerShell Session Details Property] | `($)PowerShellSessionDetails` with value `{"ServerDetails": {"Host": "host.domain.com", "Port": 5986, "UseSsl": "true"}, "Credentials": {"Domain": "domain.com", "Username": "username", "Password": "encryptedPassword"}}`
In this example `($)PowerShellSessionDetails` has been set up using the following [Expression][]:
`new PowerShellWinRMSessionDetails(serverDetails: new ServerDetails("host.domain.com", 5986, true), credentials: new UserCredentials("domain.com", "username", "encryptedPassword"))` | `($)Credentials` is a variable of type [PowerShellWinRMSessionDetails][]
The [Password][UserCredentials Password] property within [UserCredentials][] of the [PowerShellWinRMSessionDetails][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession`, with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` will be set to the type [IList][]<[dynamic][]> |
+| [Records][Records Property] | `($)Records`, with no value | `($)Records` will be set to the type [Records][] |
+
+#### Result
+
+Running the [Script][Script Property] results in the variable `($)Outputs` being updated to the following:
+
+```json
+[
+ "This is the content of the file located on the host the script is running on."
+]
+```
+
+It also results in the variable `($)Records` being updated to the following:
+
+```json
+{
+ "ErrorRecords": [
+ "The term 'Get-Error' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again."
+ ],
+ "WarningRecords": [
+ "Warning"
+ ],
+ "DebugRecords": [
+ "Debug"
+ ],
+ "ProgressRecords": [
+ "parent = -1 id = 0 act = Preparing modules for first use. stat = cur = pct = -1 sec = -1 type = Completed"
+ ],
+ "VerboseRecords": [
+ "Verbose"
+ ],
+ "InformationRecords": [
+ "Information"
+ ]
+}
+```
+
+After the [Script][Script Property] has been executed, the session will be closed, for more information see [Closing Sessions][].
+
+***
+
+## Properties
+
+### Script
+
+The [Script][Script Property] which will be executed on the [Host][ServerDetails Host] provided within the [PowerShell Session Details][PowerShell Session Details Property], this can be a script, a file path of a script on the host, or a cmdlet.
+
+Note that to execute a script using its file path, the file path must accessible to the [Host][ServerDetails Host].
+
+|||
+|----------|----------|
+| Data Type | [EncryptableText][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Parameters
+
+The parameters to be passed into the [Script][Script Property].
+
+|||
+|----------|----------|
+| Data Type | [IDictionary][]<[String][], [dynamic][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### PowerShell Session Details
+
+The [PowerShell Session Details][PowerShell Session Details Property] object that includes all of the information required to connect and maintain a PowerShell Session. This property contains all of the information in relation to the server the script will be executed on, these are:
+
+- [ServerDetails][PowerShellSessionDetails Server Details]
+- [Credentials][]
+- [PsConfiguration][]
+
+|||
+|----------|----------|
+| Data Type | [PowerShellSessionDetails][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)PowerShellSessionDetails` with no value |
+
+### Close Session
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the [Host][ServerDetails Host] is closed or is kept open for use on subsequent Execute PowerShell Script blocks, this defaults to `false` if left blank, please see [Closing Sessions][] for more information.
+
+|||
+|----------|----------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+### Outputs
+
+IList<dynamic> of outputs from the execution of the [Script][Script Property].
+
+|||
+|----------|----------|
+| Data Type | [IList][]<[dynamic][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Outputs` with no value |
+
+### Records
+
+The Records object that includes the error, warning, debug, progress, verbose, and information records from the execution of the script or cmdlet.
+
+|||
+|----------|----------|
+| Data Type | [Records][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Records` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [PSRemotingException][] | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] is invalid (e.g. host does not exist or invalid characters/whitespace). |
+| | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] does not have PSRemoting configured correctly. |
+| | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] is a host name; is being accessed through a private or domain network, and Kerberos authentication is disabled on the host's WinRM service or the server's WinRM client. |
+| | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] is a host name; is being accessed through a public network, and its name is not on the server's WinRM TrustedHosts list. |
+| | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] is an IP Address; is being accessed through any network (i.e. public, private or domain), and is not on the server's WinRM TrustedHosts list. |
+| | Thrown when the [Host][ServerDetails Host] within the [PowerShell Session Details][PowerShell Session Details Property] is an IP Address being accessed through any network (i.e. public, private or domain) or a host name being accessed through a public network, and Negotiate authentication is disabled on the host's WinRM service. |
+| | Thrown when the [Port][ServerDetails Port] within the [PowerShell Session Details][PowerShell Session Details Property] is invalid. |
+| | Thrown when the [UseSsl][ServerDetails UseSsl] is `false` and the specified [Port][ServerDetails Port] within the [PowerShell Session Details][PowerShell Session Details Property] is not configured for HTTP protocols. |
+| | Thrown when the [UseSsl][ServerDetails UseSsl] is `true` and the specified [Port][ServerDetails Port] within the [PowerShell Session Details][PowerShell Session Details Property] is not configured for HTTPS protocols. |
+| | Thrown when the [UseSsl][ServerDetails UseSsl] is `true` and the host does not have a valid certificate configured. |
+| | Thrown when the [Domain][UserCredentials Domain], [Username][UserCredentials Username], or [Password][UserCredentials Password] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is invalid. |
+| | Thrown when the [Domain][UserCredentials Domain] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null` or empty and is required. |
+| | Thrown when the user does not have the correct user permissions to execute PowerShell scripts or cmdlets on the [Host][ServerDetails Host]. |
+| | Thrown when the [PsConfiguration][] within the [PowerShell Session Details][PowerShell Session Details Property] is invalid or is not configured on the [Host][ServerDetails Host]. |
+| [PSException][] | Thrown when the [Script][Script Property] contains any unexpected or invalid tokens. |
+| | Thrown when the [Script][Script Property] is missing any necessary tokens. |
+| [PropertyNullException][] | Thrown when the [Script][Script Property] is `null`. |
+| | Thrown when [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| | Thrown when the [ServerDetails][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| | Thrown when the [Host][ServerDetails Host] within the [ServerDetails][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| | Thrown when the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| | Thrown when the [Username][UserCredentials Username] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| | Thrown when the [Password][UserCredentials Password] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when [Script][Script Property] is empty. |
+| | Thrown when the [Host][ServerDetails Host] within the [ServerDetails][] within the [PowerShell Session Details][PowerShell Session Details Property] is empty. |
+| | Thrown when the [Username][UserCredentials Username] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is empty. |
+| | Thrown when the [Password][UserCredentials Password] in the [Credentials][] within the [PowerShell Session Details][PowerShell Session Details Property] is empty. |
+| [PropertyValueOutOfRangeException][] | Thrown when the [Port][ServerDetails Port] within the [ServerDetails][] within the [PowerShell Session Details][PowerShell Session Details Property] is below `1` or above `65535`. |
+
+## Remarks
+
+### Opening Sessions
+
+The Execute PowerShell Script block automatically handles creating and opening session for the specified [PowerShell Session Details][PowerShell Session Details Property] using the following rules:
+
+- If a session does not exist, a new session will be created, opened and used when the block runs.
+- If a session already exists but is closed, the session will be opened and used when the block runs.
+- If a session already exists and is open, the session will used the block runs.
+
+For information on how to explicitly close a session, please see [Closing Sessions][].
+
+### Closing Sessions
+
+Sessions can be explicitly closed by setting [Close Session][Close Session Property] to `true`. This causes the session to be closed after the [Script][Script Property] has been executed.
+
+For information on how to open a session, please see [Opening Sessions][].
+
+### Known Limitations
+
+None
+
+[Script Property]: {{< ref "#script" >}}
+[PowerShell Session Details Property]: {{< ref "#powershell-session-details" >}}
+[Parameters Property]: {{< ref "#parameters" >}}
+[Close Session Property]: {{< ref "#close-session" >}}
+[Outputs Property]: {{< ref "#outputs" >}}
+[Records Property]: {{< ref "#records" >}}
+
+[Opening Sessions]: {{< ref "#opening-sessions" >}}
+[Closing Sessions]: {{< ref "#closing-sessions" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[EncryptableText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptableText.MainDoc" >}}
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[ServerDetails]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.MainDoc" >}}
+[ServerDetails Host]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Host" >}}
+[ServerDetails Port]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Port" >}}
+[ServerDetails UseSsl]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.UseSsl" >}}
+
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[UserCredentials Domain]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Domain" >}}
+[UserCredentials Username]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Username" >}}
+[UserCredentials Password]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Password" >}}
+
+[PowerShellWinRMSessionDetails]: {{< url path="Cortex.Reference.DataTypes.PowerShell.PowerShellWinRMSessionDetails.MainDoc" >}}
+[Records]: {{< url path="Cortex.Reference.DataTypes.PowerShell.Records.MainDoc" >}}
+
+[PowerShellSessionDetails]: {{< url path="Cortex.Reference.DataTypes.PowerShell.PowerShellSessionDetails.MainDoc" >}}
+[PowerShellSessionDetails Server Details]: {{< url path="Cortex.Reference.DataTypes.PowerShell.PowerShellSessionDetails.ServerDetails" >}}
+[Credentials]: {{< url path="Cortex.Reference.DataTypes.PowerShell.PowerShellSessionDetails.Credentials" >}}
+[PsConfiguration]: {{< url path="Cortex.Reference.DataTypes.PowerShell.PowerShellSessionDetails.PsConfiguration" >}}
+
+[PSException]: {{< url path="Cortex.Reference.Exceptions.PowerShell.PSException.MainDoc" >}}
+[PSRemotingException]: {{< url path="Cortex.Reference.Exceptions.PowerShell.PSRemotingException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/_index.md
new file mode 100644
index 000000000..414eb632e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Convert To"
+linkTitle: "Convert To"
+description: "Convert text to a different format (e.g. `\"lowercase\"`, `\"UPPERCASE\"`, `\"Title Case\"`, `\"camelCase\"`, `\"PascalCase\"`)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-camel-case-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-camel-case-block.md
new file mode 100644
index 000000000..d63ef328a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-camel-case-block.md
@@ -0,0 +1,120 @@
+---
+title: "Convert To Camel Case"
+linkTitle: "Convert To Camel Case"
+description: "Converts text to camel case (e.g. `\"camelCase\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ConvertTo_ConvertToCamelCaseBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to camel case.
+
+Converting to camel case will result in all words (except the first) having their first letter capitalized, all other letters lower cased, and all spaces and punctuation being removed (e.g. `"TEXT to convert to camel-case!"` will be converted to `"textToConvertToCamelCase"`).
+
+## Examples
+
+### Text converted to camel case
+
+This example will convert `"The quick brown fox jumps over the lazy dog"` to camel case.
+
+It performs a [culture-insensitive][InvariantCulture] conversion of the text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Culture Info][CultureInfo Property] | `($)CultureInfo`, with value `CultureInfo.InvariantCulture` | `($)CultureInfo` is a variable of type [CultureInfo][] |
+
+#### Result
+
+Converting `"The quick brown fox jumps over the lazy dog"` to camel case will result in the variable `($)Text` being updated to the following:
+
+```json
+"theQuickBrownFoxJumpsOverTheLazyDog"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to camel case.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Culture Info
+
+The [Culture Info][CultureInfo Property] used to perform the conversion of the [Text][Text Property].
+
+For information about the [supported values][CultureInfos] for the [Culture Info][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [CultureInfo][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when the culture identifier of the [Culture Info][CultureInfo Property] is invalid (e.g. `new CultureInfo("InvalidCultureIdentifier")`). See [Value Is Invalid][]. |
+
+## Remarks
+
+### Culture Info
+
+For information about the [supported values][CultureInfos] for the [CultureInfo][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+### Null Culture Info
+
+If [Culture Info][CultureInfo Property] is `null`, it will be set to `CultureInfo.InvariantCulture`.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] converted to camel case and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[CultureInfo Property]: {{< ref "#culture-info" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Casing]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.MainDoc" >}}
+[CultureInfos]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.CultureInfo.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[CultureInfo]: {{< url path="Cortex.Reference.DataTypes.Text.CultureInfo.MainDoc" >}}
+[InvariantCulture]: {{< url path="Cortex.Reference.DataTypes.MostCommon.InvariantCulture" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-lower-case-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-lower-case-block.md
new file mode 100644
index 000000000..f9eb6e2d0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-lower-case-block.md
@@ -0,0 +1,120 @@
+---
+title: "Convert To Lower Case"
+linkTitle: "Convert To Lower Case"
+description: "Converts text to lower case (e.g. `\"lowercase\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ConvertTo_ConvertToLowerCaseBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to lower case.
+
+Converting to lower case will result in all letters being lower cased; spaces and punctuation will be preserved (e.g. `"TEXT to convert to lower-case!"` will be converted to `"text to convert to lower-case!"`).
+
+## Examples
+
+### Text converted to lower case
+
+This example will convert `"The quick brown fox jumps over the lazy dog"` to lower case.
+
+It performs a [culture-insensitive][InvariantCulture] conversion of the text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Culture Info][CultureInfo Property] | `($)CultureInfo`, with value `CultureInfo.InvariantCulture` | `($)CultureInfo` is a variable of type [CultureInfo][] |
+
+#### Result
+
+Converting `"The quick brown fox jumps over the lazy dog"` to lower case will result in the variable `($)Text` being updated to the following:
+
+```json
+"the quick brown fox jumps over the lazy dog"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to lower case.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Culture Info
+
+The [Culture Info][CultureInfo Property] used to perform the conversion of the [Text][Text Property].
+
+For information about the [supported values][CultureInfos] for the [Culture Info][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [CultureInfo][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when the culture identifier of the [Culture Info][CultureInfo Property] is invalid (e.g. `new CultureInfo("InvalidCultureIdentifier")`). See [Value Is Invalid][]. |
+
+## Remarks
+
+### Culture Info
+
+For information about the [supported values][CultureInfos] for the [CultureInfo][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+### Null Culture Info
+
+If [Culture Info][CultureInfo Property] is `null`, it will be set to `CultureInfo.InvariantCulture`.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] converted to lower case and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[CultureInfo Property]: {{< ref "#culture-info" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Casing]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.MainDoc" >}}
+[CultureInfos]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.CultureInfo.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[CultureInfo]: {{< url path="Cortex.Reference.DataTypes.Text.CultureInfo.MainDoc" >}}
+[InvariantCulture]: {{< url path="Cortex.Reference.DataTypes.MostCommon.InvariantCulture" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-pascal-case-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-pascal-case-block.md
new file mode 100644
index 000000000..cce527f40
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-pascal-case-block.md
@@ -0,0 +1,120 @@
+---
+title: "Convert To Pascal Case"
+linkTitle: "Convert To Pascal Case"
+description: "Converts text to pascal case (e.g. `\"PascalCase\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ConvertTo_ConvertToPascalCaseBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to pascal case.
+
+Converting to pascal case will result in all words having their first letter capitalized, all other letters lower cased, and all spaces and punctuation being removed (e.g. `"TEXT to convert to pascal-case!"` will be converted to `"TextToConvertToPascalCase"`).
+
+## Examples
+
+### Text converted to pascal case
+
+This example will convert `"The quick brown fox jumps over the lazy dog"` to pascal case.
+
+It performs a [culture-insensitive][InvariantCulture] conversion of the text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Culture Info][CultureInfo Property] | `($)CultureInfo`, with value `CultureInfo.InvariantCulture` | `($)CultureInfo` is a variable of type [CultureInfo][] |
+
+#### Result
+
+Converting `"The quick brown fox jumps over the lazy dog"` to pascal case will result in the variable `($)Text` being updated to the following:
+
+```json
+"TheQuickBrownFoxJumpsOverTheLazyDog"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to pascal case.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Culture Info
+
+The [Culture Info][CultureInfo Property] used to perform the conversion of the [Text][Text Property].
+
+For information about the [supported values][CultureInfos] for the [Culture Info][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [CultureInfo][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when the culture identifier of the [Culture Info][CultureInfo Property] is invalid (e.g. `new CultureInfo("InvalidCultureIdentifier")`). See [Value Is Invalid][]. |
+
+## Remarks
+
+### Culture Info
+
+For information about the [supported values][CultureInfos] for the [CultureInfo][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+### Null Culture Info
+
+If [Culture Info][CultureInfo Property] is `null`, it will be set to `CultureInfo.InvariantCulture`.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] converted to pascal case and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[CultureInfo Property]: {{< ref "#culture-info" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Casing]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.MainDoc" >}}
+[CultureInfos]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.CultureInfo.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[CultureInfo]: {{< url path="Cortex.Reference.DataTypes.Text.CultureInfo.MainDoc" >}}
+[InvariantCulture]: {{< url path="Cortex.Reference.DataTypes.MostCommon.InvariantCulture" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-title-case-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-title-case-block.md
new file mode 100644
index 000000000..b3d013e36
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-title-case-block.md
@@ -0,0 +1,120 @@
+---
+title: "Convert To Title Case"
+linkTitle: "Convert To Title Case"
+description: "Converts text to title case (e.g. `\"Title Case\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ConvertTo_ConvertToTitleCaseBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to title case.
+
+Converting to title case will result in all words having their first letter capitalized and all other letters lower cased; except for words that are entirely upper cased, such as acronyms, which remain upper cased; spaces and punctuation will be preserved (e.g. `"TEXT to convert to title-case!"` will be converted to `"TEXT To Convert To Title-Case!"`).
+
+## Examples
+
+### Text converted to title case
+
+This example will convert `"The quick brown fox jumps over the lazy dog"` to title case.
+
+It performs a [culture-insensitive][InvariantCulture] conversion of the text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Culture Info][CultureInfo Property] | `($)CultureInfo`, with value `CultureInfo.InvariantCulture` | `($)CultureInfo` is a variable of type [CultureInfo][] |
+
+#### Result
+
+Converting `"The quick brown fox jumps over the lazy dog"` to title case will result in the variable `($)Text` being updated to the following:
+
+```json
+"The Quick Brown Fox Jumps Over The Lazy Dog"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to title case.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Culture Info
+
+The [Culture Info][CultureInfo Property] used to perform the conversion of the [Text][Text Property].
+
+For information about the [supported values][CultureInfos] for the [Culture Info][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [CultureInfo][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when the culture identifier of the [Culture Info][CultureInfo Property] is invalid (e.g. `new CultureInfo("InvalidCultureIdentifier")`). See [Value Is Invalid][]. |
+
+## Remarks
+
+### Culture Info
+
+For information about the [supported values][CultureInfos] for the [CultureInfo][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+### Null Culture Info
+
+If [Culture Info][CultureInfo Property] is `null`, it will be set to `CultureInfo.InvariantCulture`.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] converted to title case and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[CultureInfo Property]: {{< ref "#culture-info" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Casing]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.MainDoc" >}}
+[CultureInfos]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.CultureInfo.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[CultureInfo]: {{< url path="Cortex.Reference.DataTypes.Text.CultureInfo.MainDoc" >}}
+[InvariantCulture]: {{< url path="Cortex.Reference.DataTypes.MostCommon.InvariantCulture" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-upper-case-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-upper-case-block.md
new file mode 100644
index 000000000..3f1effcb6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Convert-To/convert-to-upper-case-block.md
@@ -0,0 +1,120 @@
+---
+title: "Convert To Upper Case"
+linkTitle: "Convert To Upper Case"
+description: "Converts text to upper case (e.g. `\"UPPERCASE\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ConvertTo_ConvertToUpperCaseBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to upper case.
+
+Converting to upper case will result in all letters being upper cased; spaces and punctuation will be preserved (e.g. `"TEXT to convert to upper-case!"` will be converted to `"TEXT TO CONVERT TO UPPER-CASE!"`).
+
+## Examples
+
+### Text converted to upper case
+
+This example will convert `"The quick brown fox jumps over the lazy dog"` to upper case.
+
+It performs a [culture-insensitive][InvariantCulture] conversion of the text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Culture Info][CultureInfo Property] | `($)CultureInfo`, with value `CultureInfo.InvariantCulture` | `($)CultureInfo` is a variable of type [CultureInfo][] |
+
+#### Result
+
+Converting `"The quick brown fox jumps over the lazy dog"` to upper case will result in the variable `($)Text` being updated to the following:
+
+```json
+"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to upper case.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Culture Info
+
+The [Culture Info][CultureInfo Property] used to perform the conversion of the [Text][Text Property].
+
+For information about the [supported values][CultureInfos] for the [Culture Info][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [CultureInfo][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when the culture identifier of the [Culture Info][CultureInfo Property] is invalid (e.g. `new CultureInfo("InvalidCultureIdentifier")`). See [Value Is Invalid][]. |
+
+## Remarks
+
+### Culture Info
+
+For information about the [supported values][CultureInfos] for the [CultureInfo][CultureInfo Property] property and examples of how it affects casing rules, please see [Casing][].
+
+### Null Culture Info
+
+If [Culture Info][CultureInfo Property] is `null`, it will be set to `CultureInfo.InvariantCulture`.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] converted to upper case and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[CultureInfo Property]: {{< ref "#culture-info" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Casing]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.MainDoc" >}}
+[CultureInfos]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Casing.CultureInfo.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[CultureInfo]: {{< url path="Cortex.Reference.DataTypes.Text.CultureInfo.MainDoc" >}}
+[InvariantCulture]: {{< url path="Cortex.Reference.DataTypes.MostCommon.InvariantCulture" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/_index.md
new file mode 100644
index 000000000..b1f69b98a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Index(es) of Text"
+linkTitle: "Get Index(es) of Text"
+description: "Get the index for the specified occurrence of text, or the indexes of all occurrences of text contained in another text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-index-of-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-index-of-text-block.md
new file mode 100644
index 000000000..8b860d2ee
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-index-of-text-block.md
@@ -0,0 +1,335 @@
+---
+title: "Get Index Of Text"
+linkTitle: "Get Index Of Text"
+description: "Gets the index of the specified occurrence of a text in another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetIndex_GetIndexOfTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.GetIndex.GetIndexOfTextBlock)
+
+## Description
+
+Gets the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Get the Index of the first Occurrence of Text To Find (Ordinal)
+
+This example will get the index of the first occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"The"` | `($)TextToFind` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means get the index of the first occurrence; `2` means second etc.
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text, `"The quick brown fox jumps over the lazy dog"` only contains the text `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Index` will be updated to the following:
+
+```json
+0
+```
+
+where `0` indicates the index of the first character of the first and only occurrence matching `"The"`.
+
+***
+
+### Get the Index of the last Occurrence of Text To Find (Ordinal Ignore Case)
+
+This example will get the index of the last occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"The"` | `($)TextToFind` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1` means get the index of the last occurrence; `2` means second last etc.
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text, `"The quick brown fox jumps over the lazy dog"` contains the text `"The"` twice; the first occurrence is `"The"` and the second and last occurrence is `"the"`. Therefore, the variable `($)Index` will be updated to the following:
+
+```json
+31
+```
+
+where `31` indicates the index of the first character of the last matching occurrence, `"the"`.
+
+***
+
+### Text does not contain Text To Find
+
+This example will attempt to get the index of the first occurrence of `"slow"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"slow"` | `($)TextToFind` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` does not contain the text `"slow"`, so the index cannot be found. Therefore, the variable `($)Index` will be updated to the following:
+
+```json
+-1
+```
+
+where `-1` indicates that there are no matching occurrences.
+
+***
+
+### Get the Index of the first Occurrence matching the pattern in Text To Find
+
+This example will get the index of the first occurrence of text matching the pattern `"?he"` from `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"?he"` | `($)TextToFind` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `1` means get the index of the first occurrence; `2` means second etc.
+
+`"The quick brown fox jumps over the lazy dog"` contains two occurrences that match the pattern `"?he"`; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Index` will be updated to the following:
+
+```json
+0
+```
+
+where `0` indicates the index of the first character of the first occurrence matching the pattern `"?he"`.
+
+***
+
+### Get the Index of the last Occurrence matching the regex in Text To Remove
+
+This example will get the index of the last occurrence of text matching the regex `"(fox|dog)"` from `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"(fox\|dog)"` | `($)TextToFind` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Index][Index Property] | `($)Index`, with no value | `($)Index` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+An [Occurrence][Occurrence Property] of `-1` means get the index of the last occurrence; `2` means second last etc.
+
+`"The quick brown fox jumps over the lazy dog"` contains two occurrences that match the regex `"(fox|dog)"`; the first occurrence is `"fox"` and the second and last occurrence is `"dog"`. Therefore, the variable `($)Index` will be updated to the following:
+
+```json
+40
+```
+
+where `0` indicates the index of the first character of the last occurrence matching the regex `"(fox|dog)"`.
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] the [Index][Index Property] of the specified [Occurrence][Occurrence Property] of, in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Occurrence
+
+The specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Index
+
+[Int32][] indicating the [Index][Index Property] of the first character of the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+If there is no specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property], the specified variable will be set to `-1`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Index` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [Text To Find][TextToFind Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Null or empty Text To Find
+
+If [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Occurrence is zero
+
+If the [Occurrence][Occurrence Property] is set to `0`, the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Occurrence of Text To Find not found
+
+If the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] is not found in [Text][Text Property], the variable specified in the [Index][Index Property] property is set to `-1`.
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+[Occurrence Property]: {{< ref "#occurrence" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-indexes-of-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-indexes-of-text-block.md
new file mode 100644
index 000000000..a973e520d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Index/get-indexes-of-text-block.md
@@ -0,0 +1,303 @@
+---
+title: "Get Indexes Of Text"
+linkTitle: "Get Indexes Of Text"
+description: "Gets the indexes of all occurrences of a text in another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetIndex_GetIndexesOfTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Indexes][Indexes Property] of all occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Get Indexes of all occurrences of Text To Find (Ordinal)
+
+This example will get the indexes of all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"The"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text, `"The quick brown fox jumps over the lazy dog"` only contains the text `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Indexes` will be updated to the following:
+
+```json
+[0]
+```
+
+where `0` indicates the index of the first character of the matching `"The"` occurrence.
+
+***
+
+### Get Indexes of all occurrences of Text To Find (Ordinal Ignore Case)
+
+This example will get the indexes of all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"The"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text, `"The quick brown fox jumps over the lazy dog"` contains the text `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Indexes` will be updated to the following:
+
+```json
+[0, 31]
+```
+
+where `0` indicates the index of the first character of the matching `"The"` occurrence, and `31` indicates the index of the first character of the matching `"the"` occurrence.
+
+***
+
+### Text does not contain Text To Find
+
+This example will attempt to get the indexes of all occurrences of `"slow"` in `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"slow"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` does not contain the text `"slow"`, so the index cannot be found. Therefore, the variable `($)Indexes` will be updated to the following:
+
+```json
+[-1]
+```
+
+where `-1` indicates that there are no matching occurrences.
+
+***
+
+### Get Indexes of all occurrences matching the pattern in Text To Find
+
+This example will get the indexes of all occurrences of text matching the pattern `"?he"` from `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"?he"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains two occurrences that match the pattern `"?he"`; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Indexes` will be updated to the following:
+
+```json
+[0, 31]
+```
+
+where `0` indicates the index of the first character of the matching `"The"` occurrence, and `31` indicates the index of the first character of the matching `"the"` occurrence.
+
+***
+
+### Get Indexes of all occurrences matching the regex in Text To Remove
+
+This example will get the indexes of all occurrences of text matching the regex `"(fox|dog)"` from `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"(fox\|dog)"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Indexes][Indexes Property] | `($)Indexes`, with no value | `($)Indexes` is a variable that will be set to an [IList][]<[Int32][]> value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains two occurrences that match the regex `"(fox|dog)"`; the first occurrence is `"fox"` and the second and last occurrence is `"dog"`. Therefore, the variable `($)Indexes` will be updated to the following:
+
+```json
+[16, 40]
+```
+
+where `16` indicates the index of the first character of the matching `"fox"` occurrence, and `40` indicates the index of the first character of the matching `"dog"` occurrence.
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Indexes][Indexes Property] of all occurrences of [Text To Find][TextToFind Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] the [Indexes][Indexes Property] of all occurrences of, in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Indexes
+
+[IList][]<[Int32][]> containing the [Indexes][Indexes Property] of the first character of each occurrence of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+If there are no occurrences of [Text To Find][TextToFind Property] in [Text][Text Property], the specified variable will be set to `[-1]`.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[Int32][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Indexes` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [Text To Find][TextToFind Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), the variable specified in the [Indexes][Indexes Property] property is set to `[-1]`.
+
+### Null or empty Text To Find
+
+If [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), the variable specified in the [Indexes][Indexes Property] property is set to `[-1]`.
+
+### Text To Find not found
+
+If [Text To Find][TextToFind Property] is not found in [Text][Text Property], the variable specified in the [Indexes][Indexes Property] property is set to `[-1]`.
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Indexes Property]: {{< ref "#indexes" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/_index.md
new file mode 100644
index 000000000..0602a8e34
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Length"
+linkTitle: "Get Length"
+description: "Get the length of a text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/get-length-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/get-length-block.md
new file mode 100644
index 000000000..216193d6a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/Get-Length/get-length-block.md
@@ -0,0 +1,89 @@
+---
+title: "Get Length"
+linkTitle: "Get Length"
+description: "Gets the length of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetLength_GetLengthBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.GetLength.GetLengthBlock)
+
+## Description
+
+Gets the [Length][Length Property] of a given [Text][Text Property].
+
+## Examples
+
+### Get the Length of a given Text
+
+This example will get the length of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Length][Length Property] | `($)Length`, with no value | `($)Length` is a variable that will be set to an [Int32][] |
+
+#### Result
+
+Getting the length of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)Length` being updated to the following:
+
+```json
+26
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Length][Length Property] of.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Length
+
+The [Length][Length Property] of the [Text][Text Property] (i.e. the number of characters it contains).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Length` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) the variable specified in the [Length][Length Property] property will be set to `0`.
+
+[Text Property]: {{< ref "#text" >}}
+[Length Property]: {{< ref "#length" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/_index.md
new file mode 100644
index 000000000..cfd3af806
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Text"
+linkTitle: "Text"
+description: "Blocks related to working with Text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/add-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/_index.md
new file mode 100644
index 000000000..bafeeb0f4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Add Text"
+linkTitle: "Add Text"
+description: "Add text to another text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-after-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-after-index-block.md
new file mode 100644
index 000000000..01aff80cf
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-after-index-block.md
@@ -0,0 +1,142 @@
+---
+title: "Add Text After Index"
+linkTitle: "Add Text After Index"
+description: "Adds text to another text after a given index."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_AddText_AddTextAfterIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Text To Add][TextToAdd Property] to another [Text][Text Property] after the given [Index][Index Property].
+
+## Examples
+
+### Add Text To Add to another Text after the given Index
+
+This example will add `"|"` after `"A"` (which is at index `0`) in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+`"A"` is at index `0` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, adding `"|"` after index `0` results in the variable `($)Text` being updated to the following:
+
+```json
+"A|BCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+### Add null or empty Text To Add to another Text after the given Index
+
+This example will try to add `null` or `""` after `"A"` (which is at index `0`) in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `null` or `""` | `($)TextToAdd` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `null` or `""` performs no operation as there is nothing to add, so the variable `($)Text` will remain as follows:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] where the [Text To Add][TextToAdd Property] is added.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Add
+
+The [Text To Add][TextToAdd Property] to the [Text][Text Property] after the given [Index][Index Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Index
+
+The [Index][Index Property] to add the [Text To Add][TextToAdd Property] after.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Null or empty Text To Add
+
+If [Text To Add][TextToAdd Property] is `null` or empty (i.e. `""`) nothing is added to [Text][Text Property]. See [Example][NullOrEmptyTextToAdd Example] above.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text To Add][TextToAdd Property] added in the correct place and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToAdd Property]: {{< ref "#text-to-add" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[NullOrEmptyTextToAdd Example]: {{< ref "#add-null-or-empty-text-to-add-to-another-text-after-the-given-index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-beginning-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-beginning-block.md
new file mode 100644
index 000000000..9bc8f3ed2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-beginning-block.md
@@ -0,0 +1,143 @@
+---
+title: "Add Text At Beginning"
+linkTitle: "Add Text At Beginning"
+description: "Adds text at the beginning of another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_AddText_AddTextAtBeginningBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Text To Add][TextToAdd Property] at the beginning of another [Text][Text Property].
+
+## Examples
+
+### Add Text To Add at the beginning of another Text
+
+This example will add `"|"` at the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `"|"` at the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)Text` being updated to the following:
+
+```json
+"|ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+### Add Text To Add at the beginning of a null or empty Text
+
+This example will try to add `"|"` at the beginning of `null` or `""`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` or `""` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `"|"` to `null` or `""` results in the variable `($)Text` being updated to the following:
+
+```json
+"|"
+```
+
+***
+
+### Add null or empty Text To Add at the beginning of another Text
+
+This example will try to add `null` or `""` at the beginnning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `null` or `""` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `null` or `""` performs no operation as there is nothing to add, so the variable `($)Text` will remain as follows:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] where the [Text To Add][TextToAdd Property] is added.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Add
+
+The [Text To Add][TextToAdd Property] at the beginning of the [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) it is replaced with the [Text To Add][TextToAdd Property]. See [Example][NullOrEmptyText Example] above.
+
+### Null or empty Text To Add
+
+If [Text To Add][TextToAdd Property] is `null` or empty (i.e. `""`) nothing is added to [Text][Text Property]. See [Example][NullOrEmptyTextToAdd Example] above.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text To Add][TextToAdd Property] added in the correct place and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToAdd Property]: {{< ref "#text-to-add" >}}
+
+[NullOrEmptyText Example]: {{< ref "#add-text-to-add-at-the-beginning-of-a-null-or-empty-text" >}}
+[NullOrEmptyTextToAdd Example]: {{< ref "#add-null-or-empty-text-to-add-at-the-beginning-of-another-text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-end-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-end-block.md
new file mode 100644
index 000000000..604cd2d67
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-at-end-block.md
@@ -0,0 +1,143 @@
+---
+title: "Add Text At End"
+linkTitle: "Add Text At End"
+description: "Adds text at the end of another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_AddText_AddTextAtEndBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.AddText.AddTextAtEndBlock)
+
+## Description
+
+Adds [Text To Add][TextToAdd Property] at the end of another [Text][Text Property].
+
+## Examples
+
+### Add Text To Add at the end of another Text
+
+This example will add `"|"` at the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `"|"` at the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)Text` being updated to the following:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ|"
+```
+
+***
+
+### Add Text To Add at the end of a null or empty Text
+
+This example will try to add `"|"` at the end of `null` or `""`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` or `""` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `"|"` to `null` or `""` results in the variable `($)Text` being updated to the following:
+
+```json
+"|"
+```
+
+***
+
+### Add null or empty Text To Add at the end of another Text
+
+This example will try to add `null` or `""` at the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `null` or `""` | `($)TextToAdd` is a variable of type [String][] |
+
+#### Result
+
+Adding `null` or `""` performs no operation as there is nothing to add, so the variable `($)Text` will remain as follows:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] where the [Text To Add][TextToAdd Property] is added.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Add
+
+The [Text To Add][TextToAdd Property] at the end of the [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) it is replaced with the [Text To Add][TextToAdd Property]. See [Example][NullOrEmptyText Example] above.
+
+### Null or empty Text To Add
+
+If [Text To Add][TextToAdd Property] is `null` or empty (i.e. `""`) nothing is added to [Text][Text Property]. See [Example][NullOrEmptyTextToAdd Example] above.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text To Add][TextToAdd Property] added in the correct place and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToAdd Property]: {{< ref "#text-to-add" >}}
+
+[NullOrEmptyText Example]: {{< ref "#add-text-to-add-at-the-end-of-a-null-or-empty-text" >}}
+[NullOrEmptyTextToAdd Example]: {{< ref "#add-null-or-empty-text-to-add-at-the-end-of-another-text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-before-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-before-index-block.md
new file mode 100644
index 000000000..03f569a5f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/add-text/add-text-before-index-block.md
@@ -0,0 +1,144 @@
+---
+title: "Add Text Before Index"
+linkTitle: "Add Text Before Index"
+description: "Adds text to another text before the specified index."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_AddText_AddTextBeforeIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Text To Add][TextToAdd Property] to another [Text][Text Property] before the specified [Index][Index Property].
+
+## Examples
+
+### Add Text To Add to another Text before the given Index
+
+This example will add `"|"` before `"A"` (which is at index `0`) in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `"\|"` | `($)TextToAdd` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+`"A"` is at index `0` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, adding `"|"` before index `0` results in the variable `($)Text` being updated to the following:
+
+```json
+"|ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+### Add null or empty Text To Add to another Text before the given Index
+
+This example will try to add `null` or `""` before `"A"` (which is at index `0`) in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Text To Add][TextToAdd Property] | `($)TextToAdd`, with value `null` or `""` | `($)TextToAdd` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `0` | `($)Index` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `null` or `""` performs no operation as there is nothing to add, so the variable `($)Text` will remain as follows:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] where the [Text To Add][TextToAdd Property] is added.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Add
+
+The [Text To Add][TextToAdd Property] to the [Text][Text Property] before the given [Index][Index Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Index
+
+The [Index][Index Property] to add the [Text To Add][TextToAdd Property] before.
+
+For information about what an index is, please see [Indexes].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Null or empty Text To Add
+
+If [Text To Add][TextToAdd Property] is `null` or empty (i.e. `""`) nothing is added to [Text][Text Property]. See [Example][NullOrEmptyTextToAdd Example] above.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text To Add][TextToAdd Property] added in the correct place and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToAdd Property]: {{< ref "#text-to-add" >}}
+[Index Property]: {{< ref "#index" >}}
+
+[NullOrEmptyTextToAdd Example]: {{< ref "#add-null-or-empty-text-to-add-to-another-text-before-the-given-index" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/_index.md
new file mode 100644
index 000000000..a39909591
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Contains Text"
+linkTitle: "Contains Text"
+description: "Check if text is contained in another text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-all-text-block.md
new file mode 100644
index 000000000..e369d9766
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-all-text-block.md
@@ -0,0 +1,261 @@
+---
+title: "Contains All Text"
+linkTitle: "Contains All Text"
+description: "Checks if text contains all of the texts in a given set of texts."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ContainsText_ContainsAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] contains all of the texts in a given set of [Texts To Find][TextsToFind Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to perform the check.
+
+## Examples
+
+### Text contains all of the texts in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains all of the texts in `["The", "quick", "brown", "fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["The", "quick", "brown", "fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains All Text][ContainsAllText Property] | `($)ContainsAllText`, with no value | `($)ContainsAllText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains all of the texts in `["The", "quick", "brown", "fox"]`. Therefore, the variable `($)ContainsAllText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text does not contain all of the texts in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains all of the texts in `["the", "slow", "brown", "fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["the", "slow", "brown", "fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains All Text][ContainsAllText Property] | `($)ContainsAllText`, with no value | `($)ContainsAllText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` does not contain all of the texts in `["the", "slow", "brown", "fox"]`; `"slow"` is missing, and `"the"` does not match `"The"` as the specified [Comparison Type][ComparisonType Property] uses case-sensitive matching. Therefore, the variable `($)ContainsAllText` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text contains text that matches all of the patterns in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches all of the patterns in `["?he", "?uick", "*?own", "fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["?he", "?uick", "*?own", "fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains All Text][ContainsAllText Property] | `($)ContainsAllText`, with no value | `($)ContainsAllText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains text that matches all of the patterns in `["?he", "?uick", "*?own", "fox"]`. Therefore, the variable `($)ContainsAllText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text contains text that matches all of the regexes in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches all of the regexes in `["^The", "(quick|fast)", "b.* ", "(fox|Fox)"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["^The", "(quick\|fast)", "b.* ", "(fox\|Fox)"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains All Text][ContainsAllText Property] | `($)ContainsAllText`, with no value | `($)ContainsAllText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains text that matches all of the regexes in `["^The", "(quick|fast)", "b.* ", "(fox|Fox)"]`. Therefore, the variable `($)ContainsAllText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check whether it contains all of the texts in the given set of [Texts To Find][TextsToFind Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Texts To Find
+
+The set of [Texts To Find][TextsToFind Property] to check are all contained in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether items in [Texts To Find][TextsToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Texts To Find][TextsToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether each text in [Texts To Find][TextsToFind Property] is contained in [Text][Text Property]
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Contains All Text
+
+The result of the contains all text check.
+
+If all of the texts in [Texts To Find][TextsToFind Property] are contained in [Text][Text Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsAllText` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [PropertyNullException][] | Thrown when [Texts To Find][TextsToFind Property] is `null`. |
+| [RegexMatchTimeoutException][] | Thrown when [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and one or more items in [Texts To Find][TextsToFind Property] are not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), the variable specified in the [Contains All Text][ContainsAllText Property] property is set to `false`.
+
+### Null or empty Texts To Find
+
+If [Texts To Find][TextsToFind Property] is empty or contains any `null` or empty (i.e. `""`) text, the variable specified in the [Contains All Text][ContainsAllText Property] property is set to `false`.
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextsToFind Property]: {{< ref "#texts-to-find" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[ContainsAllText Property]: {{< ref "#contains-all-text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-any-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-any-text-block.md
new file mode 100644
index 000000000..4c4704b42
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-any-text-block.md
@@ -0,0 +1,261 @@
+---
+title: "Contains Any Text"
+linkTitle: "Contains Any Text"
+description: "Checks if text contains any of the texts in a given set of texts."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ContainsText_ContainsAnyTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] contains any of the texts in a given set of [Texts To Find][TextsToFind Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to perform the check.
+
+## Examples
+
+### Text contains any of the texts in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains at least one of the texts in `["The", "fast", "red", "fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["The", "fast", "red", "fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Any Text][ContainsAnyText Property] | `($)ContainsAnyText`, with no value | `($)ContainsAnyText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains the text `"The"` and `"fox"` in `["The", "fast", "red", "fox"]`. Therefore, the variable `($)ContainsAnyText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text does not contain any of the texts in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains at least one of the texts in `["the", "slow", "red", "Fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["the", "slow", "red", "Fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Any Text][ContainsAnyText Property] | `($)ContainsAnyText`, with no value | `($)ContainsAnyText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` does not contain any of the texts in `["the", "slow", "red", "Flow"]`; `"slow"` and `"red"` are both missing, and `"the"` and `"Fox"` do not match `"The"` and `"fox"` respectively as the specified [Comparison Type][ComparisonType Property] uses case-sensitive matching. Therefore, the variable `($)ContainsAnyText` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text contains text that matches any of the patterns in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches any of the patterns in `["?he", "Q?ick", "B*?wn", "Fox"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["?he", "Q?ick", "B*?wn", "Fox"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Any Text][ContainsAnyText Property] | `($)ContainsAnyText`, with no value | `($)ContainsAnyText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains text that matches one of the patterns in `["?he", "Q?ick", "B*?wn", "Fox"]`; `"?he"` matches `"The"` and `"the"`. Therefore, the variable `($)ContainsAnyText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text contains text that matches any of the regexes in Texts To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches any of the regexes in `["^The", "(Quick|Fast)", "b.* ", "(fox|Fox)$"]`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Texts To Find][TextsToFind Property] | `($)TextsToFind`, with value `["^The", "(Quick\|Fast)", "b.* ", "(fox\|Fox)$"]` | `($)TextsToFind` is a variable of type [IEnumerable][]<[String][]> |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Any Text][ContainsAnyText Property] | `($)ContainsAnyText`, with no value | `($)ContainsAnyText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains text that matches any of the regexes in `["^The", "(Quick|Fast)", "b.* ", "(fox|Fox)$"]`; `"^The"` matches `"The"` at the start of the sentence. Therefore, the variable `($)ContainsAnyText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check whether it contains any of the texts in the given set of [Texts To Find][TextsToFind Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Texts To Find
+
+The set of [Texts To Find][TextsToFind Property] to check any are contained in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[String][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {}` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether items in [Texts To Find][TextsToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Texts To Find][TextsToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether each text in [Texts To Find][TextsToFind Property] is contained in [Text][Text Property]
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Contains Any Text
+
+The result of the contains any text check.
+
+If any of the texts in [Texts To Find][TextsToFind Property] is contained in [Text][Text Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsAnyText` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [PropertyNullException][] | Thrown when [Texts To Find][TextsToFind Property] is `null`. |
+| [RegexMatchTimeoutException][] | Thrown when [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and one or more items in [Texts To Find][TextsToFind Property] are not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), the variable specified in the [Contains Any Text][ContainsAnyText Property] property is set to `false`.
+
+### Null or empty Texts To Find
+
+If [Texts To Find][TextsToFind Property] is empty or only contains `null` or empty (i.e. `""`) text, the variable specified in the [Contains Any Text][ContainsAnyText Property] property is set to `false`.
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextsToFind Property]: {{< ref "#texts-to-find" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[ContainsAnyText Property]: {{< ref "#contains-any-text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-text-block.md
new file mode 100644
index 000000000..be03f530b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/contains-text/contains-text-block.md
@@ -0,0 +1,258 @@
+---
+title: "Contains Text"
+linkTitle: "Contains Text"
+description: "Checks if text contains another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_ContainsText_ContainsTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] contains [Text To Find][TextToFind Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to perform the check.
+
+## Examples
+
+### Text contains Text To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains the text `"quick brown fox"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"quick brown fox"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Text][ContainsText Property] | `($)ContainsText`, with no value | `($)ContainsText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains the text `"quick brown fox"`. Therefore, the variable `($)ContainsText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text does not contain Text To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains the text `"quick red fox"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"quick red fox"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Text][ContainsText Property] | `($)ContainsText`, with no value | `($)ContainsText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` does not contain `"quick red fox"`. Therefore, the variable `($)ContainsText` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text contains text that matches the pattern in Text To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches the pattern `"*?he"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"?he"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.PatternMatching` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Text][ContainsText Property] | `($)ContainsText`, with no value | `($)ContainsText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains `"The"` and `"the"` that matches the pattern `"?he"`. Therefore, the variable `($)ContainsText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text contains text that matches the regex in Text To Find
+
+This example will check whether `"The quick brown fox jumps over the lazy dog"` contains text that matches the regex `"^The"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `"^The"` | `($)TextToFind` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.Regex` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Contains Text][ContainsText Property] | `($)ContainsText`, with no value | `($)ContainsText` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` contains `"The"` at the start of the sentence that matches the regex `"^The"`. Therefore, the variable `($)ContainsText` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check whether it contains [Text To Find][TextToFind Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that with `SearchOptions.LiteralText` overlapping matches are detected (e.g. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` and `"aa"` at index `1`). With `SearchOptions.Regex` only `"aa"` at index `0` will be matched.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to determine whether [Text To Find][TextToFind Property] is contained in [Text][Text Property]
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Contains Text
+
+The result of the contains text check.
+
+If [Text To Find][TextToFind Property] is contained in [Text][Text Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)ContainsText` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when [Search Options][SearchOptions Property] is either `SearchOptions.Regex` or `SearchOptions.PatternMatching` and the execution time of the search exceeds `30` seconds. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [Text To Find][TextToFind Property] is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), the variable specified in the [Contains Text][ContainsText Property] property is set to `false`.
+
+### Null or empty Text To Find
+
+If [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), the variable specified in the [Contains Text][ContainsText Property] property is set to `false`.
+
+### Known Limitations
+
+If [Search Options][SearchOptions Property] is set to `SearchOptions.Regex` or `SearchOptions.PatternMatching` and [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[ContainsText Property]: {{< ref "#contains-text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/_index.md
new file mode 100644
index 000000000..fc6653945
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Decode Text"
+linkTitle: "Decode Text"
+description: "Decode text from a specified format (e.g. `\"Base64\"`)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/decode-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/decode-text-block.md
new file mode 100644
index 000000000..afde31ce1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/decode-text/decode-text-block.md
@@ -0,0 +1,227 @@
+---
+title: "Decode Text"
+linkTitle: "Decode Text"
+description: "Decodes text from a specified format (e.g. `\"Base64\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_DecodeText_DecodeTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.DecodeText.DecodeTextBlock)
+
+## Description
+
+Decodes [Text][Text Property] from the specified [Format][Format Property].
+
+## Examples
+
+### Text decoded from Base64
+
+This example will decode the [Base64][] encoded text `"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw=="` to `"The quick brown fox jumps over the lazy dog"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw=="` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Base64"` | `($)Format` is a variable of type [TextEncodingFormat][]
+
+#### Result
+
+Decoding `"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw=="` with the [Format][Format Property] [Base64] will result in the variable `($)Text` being updated to the following:
+
+```json
+"The quick brown fox jumps over the lazy dog"
+```
+
+***
+
+### Text decoded from Url
+
+This example will decode the [Url][] encoded text `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"` to `"The quick brown fox jumps over the lazy dog!"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Url"` | `($)Format` is a variable of type [TextEncodingFormat][]
+
+#### Result
+
+Decoding `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"` with the [Format][Format Property] [Url] will result in the variable `($)Text` being updated to the following:
+
+```json
+"The quick brown fox jumps over the lazy dog!"
+```
+
+***
+
+### Text decoded from Hex
+
+This example will decode the [Hex][] encoded text `"54686520717569636B2062726F776E20666F78206A756D7073206F76657220746865206C617A7920646F67"` to `"The quick brown fox jumps over the lazy dog"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"54686520717569636B2062726F776E20666F78206A756D7073206F76657220746865206C617A7920646F67"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Hex"` | `($)Format` is a variable of type [TextEncodingFormat][]
+
+#### Result
+
+Decoding `"54686520717569636B2062726F776E20666F78206A756D7073206F76657220746865206C617A7920646F67"` with the [Format][Format Property] [Hex] will result in the variable `($)Text` being updated to the following:
+
+```json
+"The quick brown fox jumps over the lazy dog"
+```
+
+***
+
+### Text decoded from Html
+
+This example will decode the [Html][] encoded text `"<p>The quick brown fox jumps over the lazy dog!</p>"` to `"
The quick brown fox jumps over the lazy dog!
"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"<p>The quick brown fox jumps over the lazy dog!</p>"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Html"` | `($)Format` is a variable of type [TextEncodingFormat][]
+
+#### Result
+
+Decoding `"<p>The quick brown fox jumps over the lazy dog!</p>"` with the [Format][Format Property] [Html] will result in the variable `($)Text` being updated to the following:
+
+```json
+"
The quick brown fox jumps over the lazy dog!
"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to decode from the specified [Format][Format Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Format
+
+The [Format][Format Property] used to decode the given [Text][Text Property].
+
+[Format][Format Property] can be any of the predefined values:
+
+* `TextEncodingFormat.Base64`
+* `TextEncodingFormat.Url`
+* `TextEncodingFormat.Hex`
+* `TextEncodingFormat.Html`
+* `TextEncodingFormat.Utf8`
+* `TextEncodingFormat.Base64Url`
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextEncodingFormat][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `Base64` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Format][Format Property] is not one of the specified [TextEncodingFormat][] types (e.g. `(TextEncodingFormat)10`). |
+| [TextDecodingException][] | Thrown when [Text][Text Property] contains an invalid character for [Base64] decoding. For more information, see [Invalid Base64 Character][InvalidBase64]. |
+||Thrown when [Text][Text Property] contains an odd number of characters for [Hex] decoding. For more information, see [Odd number of characters using Hex][InvalidHex]. |
+|| Thrown when [Text][Text Property] contains an invalid character for [Base64Url] decoding. For more information, see [Invalid Base64Url Character][InvalidBase64Url]. |
+
+## Remarks
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) there is nothing to decode, so no operation is performed.
+
+### Decoding out of range URL characters
+
+When decoding using the [Url][] [Format][Format Property], characters not in the valid range (i.e.`%00` to `%ff`) will be treated as literal characters (e.g. `"%zzExample%21"` will decode to `"%zzExample!"`).
+
+### Decoding invalid Hex values
+
+When decoding using the [Hex] [Format][Format Property], characters not in the valid set (i.e. `0-9` and `A-F`) will overflow (e.g. `G` overflows to `0`), further examples are shown below:
+| Encoded Text | Overflows To | Decoded Text |
+|--------------|--------------|--------------|
+| 4G | 40 | @ |
+| 4H | 41 | A |
+| 4I | 42 | B |
+| J1 | 31 | 1 |
+| K1 | 41 | A |
+| L1 | 51 | Q |
+
+### Decoding invalid HTML entities
+
+When decoding using the [Html] [Format][Format Property], invalid [HTML Entities][HTMLEntity] will be removed (e.g. `"Example&InvalidEntity;"` will decode to `"Example"`).
+
+### Decoding HTML ampersand
+
+When decoding using the [Html] [Format][Format Property], any ampersand that is not part of an [HTML Entity][HTMLEntity] will be removed (e.g. `"Example&Something"` will decode to `"ExampleSomething"`).
+
+### Decoding HTML semicolon
+
+When decoding using the [Html] [Format][Format Property], any semicolon that is not part of an [HTML Entity][HTMLEntity] will be treated as a literal character (e.g. `"ExampleSomething;"` will decode to `"ExampleSomething;"`).
+
+### Round-Tripping
+
+It should be possible to pass the text created by an [Encode Text block][Encode Text] to this block, and then pass the text created by this block back to an [Encode Text block][Encode Text]; this is called round-tripping.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property] decoded from the specified format and reassigns it to the specified [Text][Text Property] property.
+
+### Known Limitations
+
+When decoding using the [Html] [Format][Format Property], any HTML5 named [entities][HTMLEntity] (e.g. `"φ"`) will be removed.
+
+This limitation may be removed in the future.
+
+[Text Property]: {{< ref "#text" >}}
+[Format Property]: {{< ref "#format" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[TextEncodingFormat]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[TextDecodingException]: {{< url path="Cortex.Reference.Exceptions.Text.Encoding.TextDecodingException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Html]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Html" >}}
+[Base64]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Base64" >}}
+[Hex]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Hex" >}}
+[Base64Url]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Base64Url" >}}
+[Url]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Url" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+
+[InvalidBase64]: {{< url path="Cortex.Reference.Exceptions.Text.Encoding.TextDecodingException.InvalidBase64" >}}
+[InvalidHex]: {{< url path="Cortex.Reference.Exceptions.Text.Encoding.TextDecodingException.InvalidHex" >}}
+[InvalidBase64Url]: {{< url path="Cortex.Reference.Exceptions.Text.Encoding.TextDecodingException.InvalidBase64Url" >}}
+
+[Encode Text]: {{< url path="Cortex.Reference.Blocks.Text.EncodeText.EncodeText.MainDoc" >}}
+[HTMLEntity]: {{< url path="Cortex.Reference.Glossary.F-J.HTMLEntity" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/_index.md
new file mode 100644
index 000000000..38ce0b2f7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Encode Text"
+linkTitle: "Encode Text"
+description: "Encode text to a specified format (e.g. `\"Base64\"`)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/encode-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/encode-text-block.md
new file mode 100644
index 000000000..1b5d720a1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/encode-text/encode-text-block.md
@@ -0,0 +1,177 @@
+---
+title: "Encode Text"
+linkTitle: "Encode Text"
+description: "Encodes text to a specified format (e.g. `\"Base64\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_EncodeText_EncodeTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.EncodeText.EncodeTextBlock)
+
+## Description
+
+Encodes [Text][Text Property] to a specified [Format][Format Property].
+
+## Examples
+
+### Text encoded to Base64
+
+This example will encode the text `"The quick brown fox jumps over the lazy dog"` to `"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw=="`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Base64"` | `($)Format` is a variable of type [TextEncodingFormat][] |
+
+#### Result
+
+Encoding `"The quick brown fox jumps over the lazy dog"` to the [Format][Format Property] [Base64][] will result in the variable `($)Text` being updated to the following:
+
+```json
+"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw=="
+```
+
+***
+
+### Text encoded to Url
+
+This example will encode the text `"The quick brown fox jumps over the lazy dog!"` to `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Url"` | `($)Format` is a variable of type [TextEncodingFormat][]
+
+#### Result
+
+Encoding `"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"` to the [Format][Format Property] [Url] will result in the variable `($)Text` being updated to the following:
+
+```json
+"The%20quick%20brown%20fox%20jumps%20over%20the%20lazy%20dog%21"
+```
+
+***
+
+### Text encoded to Hex
+
+This example will encode the text `"The quick brown fox jumps over the lazy dog"` to `"54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Hex"` | `($)Format` is a variable of type [TextEncodingFormat][] |
+
+#### Result
+
+Encoding `"The quick brown fox jumps over the lazy dog"` to the [Format][Format Property] [Hex][] will result in the variable `($)Text` being updated to the following:
+
+```json
+"54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67"
+```
+
+***
+
+### Text encoded to Html
+
+This example will encode the text `"
The quick brown fox jumps over the lazy dog!
"` to `"<p>The quick brown fox jumps over the lazy dog!</p>"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"
The quick brown fox jumps over the lazy dog!
"` | `($)Text` is a variable of type [String][] |
+| [Format][Format Property] | `($)Format`, with value `"TextEncodingFormat.Html"` | `($)Format` is a variable of type [TextEncodingFormat][] |
+
+#### Result
+
+Encoding `"
The quick brown fox jumps over the lazy dog!
"` to the [Format][Format Property] [Html][] will result in the variable `($)Text` being updated to the following:
+
+```json
+"<p>The quick brown fox jumps over the lazy dog!</p>"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to encode to the specified [Format][Format Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Format
+
+The [Format][Format Property] used to encode the given [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextEncodingFormat][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `Base64` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when the format is not one of the specified [Format][Format Property] types (e.g. `(TextEncodingFormat)10`). |
+
+## Remarks
+
+### Encoding to Base64
+
+When encoding to [Base64][] a new line character is added every 76 characters.
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), no operation is performed.
+
+### Round-Tripping
+
+It should be possible to pass the text created by a [Decode Text][] block to this block, and then pass the text created by this block back to an [Decode Text][] block; this is called round-tripping.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Text][Text Property], encodes to [Format][Format Property] and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[Format Property]: {{< ref "#format" >}}
+[Decode Text]: {{< url path="Cortex.Reference.Blocks.Text.DecodeText.DecodeText.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[TextEncodingFormat]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.MainDoc" >}}
+[Html]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Html" >}}
+[Base64]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Base64" >}}
+[Hex]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Hex" >}}
+[Base64Url]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Base64Url" >}}
+[Url]: {{< url path="Cortex.Reference.DataTypes.Text.Encoding.TextEncodingFormat.Url" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/_index.md
new file mode 100644
index 000000000..f11296cc6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Find And Remove Text"
+linkTitle: "Find And Remove Text"
+description: "Find text in another text, and remove it."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-all-text-block.md
new file mode 100644
index 000000000..2086bbac2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-all-text-block.md
@@ -0,0 +1,349 @@
+---
+title: "Find And Remove All Text"
+linkTitle: "Find And Remove All Text"
+description: "Finds and removes all occurrences of text from a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FindAndRemoveText_FindAndRemoveAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Finds and removes all occurrences of [Text To Find][TextToFind Property] from a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Remove all occurrences when there are multiple matches
+
+This example will find and remove all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Text` will be updated to `" quick brown fox jumps over{{% nbsp %}}{{% nbsp %}}lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Remove all occurrences when there is a single match
+
+This example will find and remove all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Text` will be updated to `" quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Remove all occurrences when there are no matches
+
+This example will find and remove all occurrences of `"cat"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "cat", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "cat", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Results
+
+`"The quick brown fox jumps over the lazy dog."` does not contain an occurrence of `"cat"`. Therefore, `($)Text` is not updated and remains as `"The quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find and remove all occurrences of [Text To Find][TextToFind Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find and remove all matching occurrences from [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find all occurrences of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Output Text | The value of the [Text][Text Property] after executing the block. \* |
+\* *DEFAULT* indicates that nothing has been found and removed in [Text][Text Property], and that [Text][Text Property] is the same as was initially provided.
+
+Please note that these examples all perform a search which has at most one valid match in the text.
+
+#### SearchOptions.LiteralText
+
+These examples find and remove all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+
+#### SearchOptions.PatternMatching
+
+These examples find and remove all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `"*"` | `""` |
+| `"The"` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"*"` | `""` |
+| `"The"` | `"*"` | `""` | `""` |
+| `"The"` | `""` | `"*"` | `""` |
+| `"*"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"*"` | `""` |
+| `"*"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `""` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"*"` | `""` |
+| `"*"` | `"*"` | `""` | `""` |
+| `"*"` | `""` | `"*"` | `""` |
+| `"*"` | `""` | `""` | `""` |
+| `""` | `"quick"` | `"*"` | `"The "` |
+| `""` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"*"` | `""` |
+| `""` | `"*"` | `""` | `""` |
+| `""` | `""` | `"*"` | `""` |
+
+#### SearchOptions.Regex
+
+These examples find and remove all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `".*"` | `""` |
+| `"The"` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `".*"` | `""` |
+| `"The"` | `".*"` | `""` | `""` |
+| `"The"` | `""` | `".*"` | `""` |
+| `".*"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `".*"` | `""` |
+| `".*"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `""` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `".*"` | `""` |
+| `".*"` | `".*"` | `""` | `""` |
+| `".*"` | `""` | `".*"` | `""` |
+| `".*"` | `""` | `""` | `""` |
+| `""` | `"quick"` | `".*"` | `"The "` |
+| `""` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `""` | `".*"` | `".*"` | `""` |
+| `""` | `".*"` | `""` | `""` |
+| `""` | `""` | `".*"` | `""` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) there is nothing to remove from, so no operation is performed.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`), or [Text To Find][TextToFind Property] is `null`; no operation is performed and the [Text][Text Property] remains unchanged.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not considered as part of the matches for [Text to Find][TextToFind Property] when determining what to remove; see [Advanced Examples][].
+
+### Text To Find is not present
+
+If [Text To Find][TextToFind Property] is not present there is nothing to remove, so no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] with all occurrences of [Text To Find][TextToFind Property] removed and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[ComparisonType Property]: {{}}
+[SearchOptions Property]: {{}}
+[Text Property]: {{}}
+[TextToFind Property]: {{}}
+
+[Input]: {{}}
+[InputOutput]: {{}}
+
+[Equality]: {{}}
+[ComparisonTypes]: {{}}
+[Ordinal]: {{}}
+[OrdinalIgnoreCase]: {{}}
+[Pattern Matching Syntax]: {{}}
+[Regex Syntax]: {{}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-text-block.md
new file mode 100644
index 000000000..d4f941c7c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-remove-text/find-and-remove-text-block.md
@@ -0,0 +1,394 @@
+---
+title: "Find And Remove Text"
+linkTitle: "Find And Remove Text"
+description: "Finds and removes the specified occurrence of text from a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FindAndRemoveText_FindAndRemoveTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Finds and removes the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] from a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Remove the first Occurrence of text
+
+This example will find and remove the first occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Text` will be updated to `" quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Remove the second Occurrence of text
+
+This example will find and remove the second occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `2` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence `"the"`. Therefore, the variable `($)Text` will be updated to `"The quick brown fox jumps over{{% nbsp %}}{{% nbsp %}}lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Remove the last Occurrence of text
+
+This example will find and remove the last occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence `"the"`. The second occurrence is also the last occurrence, and therefore, the variable `($)Text` will be updated to `"The quick brown fox jumps over{{% nbsp %}}{{% nbsp %}}lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Remove an invalid Occurrence of text
+
+This example will find and remove the third occurrence of `"The"`, which is not present, in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `3` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of the text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. There is no match for the third occurrence. Therefore, the variable `($)Text` will be not be updated and remains as `"The quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find and remove the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find and remove the specified matching occurrence from [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find the specific occurrence of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Occurrence][Occurrence Property] | `1` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Output Text | The value of the [Text][Text Property] after executing the block. \* |
+\* *DEFAULT* indicates that nothing has been found and removed in [Text][Text Property], and that [Text][Text Property] is the same as was initially provided.
+
+Please note that these examples all perform a search which has at most one valid match in the text.
+
+#### SearchOptions.LiteralText
+
+These examples find and remove the first occurrence from [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+
+#### SearchOptions.PatternMatching
+
+These examples find and remove the first occurrence from [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `"*"` | `""` |
+| `"The"` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"*"` | `""` |
+| `"The"` | `"*"` | `""` | `""` |
+| `"The"` | `""` | `"*"` | `""` |
+| `"*"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"*"` | `""` |
+| `"*"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `""` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"*"` | `""` |
+| `"*"` | `"*"` | `""` | `""` |
+| `"*"` | `""` | `"*"` | `""` |
+| `"*"` | `""` | `""` | `""` |
+| `""` | `"quick"` | `"*"` | `"The "` |
+| `""` | `"*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"*"` | `""` |
+| `""` | `"*"` | `""` | `""` |
+| `""` | `""` | `"*"` | `""` |
+
+#### SearchOptions.Regex
+
+These examples find and remove the first occurrence from [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `" quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The{{% nbsp %}}{{% nbsp %}}brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick{{% nbsp %}}{{% nbsp %}}fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `".*"` | `""` |
+| `"The"` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `".*"` | `""` |
+| `"The"` | `".*"` | `""` | `""` |
+| `"The"` | `""` | `".*"` | `""` |
+| `".*"` | `"quick"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `".*"` | `""` |
+| `".*"` | `"quick"` | `""` | `" brown fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `""` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `".*"` | `""` |
+| `".*"` | `".*"` | `""` | `""` |
+| `".*"` | `""` | `".*"` | `""` |
+| `".*"` | `""` | `""` | `""` |
+| `""` | `"quick"` | `".*"` | `"The "` |
+| `""` | `".*"` | `"brown"` | `" fox jumps over the lazy dog."` |
+| `""` | `".*"` | `".*"` | `""` |
+| `""` | `".*"` | `""` | `""` |
+| `""` | `""` | `".*"` | `""` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) there is nothing to remove from, so no operation is performed.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`), or [Text To Find][TextToFind Property] is `null`; no operation is performed and the [Text][Text Property] remains unchanged.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not considered as part of the matches for [Text to Find][TextToFind Property] when determining what to remove; see [Advanced Examples][].
+
+### Text To Find is not present
+
+If [Text To Find][TextToFind Property] is not present there is nothing to remove, so no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] with all occurrences of [Text To Find][TextToFind Property] removed and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[Text Property]: {{}}
+[TextToFind Property]: {{}}
+[Occurrence Property]: {{}}
+[SearchOptions Property]: {{}}
+[ComparisonType Property]: {{}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/_index.md
new file mode 100644
index 000000000..f9038379b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Find And Replace Text"
+linkTitle: "Find And Replace Text"
+description: "Find text in another text, and replace it."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-all-text-block.md
new file mode 100644
index 000000000..c498f9338
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-all-text-block.md
@@ -0,0 +1,370 @@
+---
+title: "Find And Replace All Text"
+linkTitle: "Find And Replace All Text"
+description: "Finds and replaces all occurrences of a text in a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FindAndReplaceText_FindAndReplaceAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Finds and replaces all occurrences of [Text To Find][TextToFind Property] with the specified [Replacement Text][ReplacementText Property] in a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Replace all occurrences when there are multiple matches
+
+This example will find and replace all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Text` will be updated to `"a quick brown fox jumps over a lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Replace all occurrences when there is a single match
+
+This example will find and replace all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Text` will be updated to `"a quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Replace all occurrences when there are no matches
+
+This example will find and replace all occurrences of `"cat"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "cat", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "cat", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Results
+
+`"The quick brown fox jumps over the lazy dog."` does not contain an occurrence of `"cat"`. Therefore, `($)Text` is not updated and remains as `"The quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find and replace all occurrences of [Text To Find][TextToFind Property] in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find and replace all matching occurrences in [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Replacement Text
+
+The [Replacement Text][ReplacementText Property] used to replace all occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find all occurrences of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+| [Replacement Text][ReplacementText Property] | `"ReplacementText"` |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Output Text | The value of the [Text][Text Property] after executing the block. \* |
+\* *DEFAULT* indicates that nothing has been found and replaced in [Text][Text Property], and that [Text][Text Property] is the same as was initially provided.
+
+Please note that these examples all perform a search which has at most one valid match in the text.
+
+#### SearchOptions.LiteralText
+
+These examples find and replace all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+
+#### SearchOptions.PatternMatching
+
+These examples find and replace all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `"*"` | `"ReplacementText"` |
+| `"The"` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"*"` | `"ReplacementText"` |
+| `"The"` | `"*"` | `""` | `"ReplacementText"` |
+| `"The"` | `""` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `""` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"*"` | `""` | `"ReplacementText"` |
+| `"*"` | `""` | `"*"` | `"ReplacementText"` |
+| `"*"` | `""` | `""` | `"ReplacementText"` |
+| `""` | `"quick"` | `"*"` | `"The ReplacementText"` |
+| `""` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"*"` | `"ReplacementText"` |
+| `""` | `"*"` | `""` | `"ReplacementText"` |
+| `""` | `""` | `"*"` | `"ReplacementText"` |
+
+#### SearchOptions.Regex
+
+These examples find and replace all occurrences in [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `".*"` | `"ReplacementText"` |
+| `"The"` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `".*"` | `"ReplacementText"` |
+| `"The"` | `".*"` | `""` | `"ReplacementText"` |
+| `"The"` | `""` | `".*"` | `"ReplacementText"` |
+| `".*"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `".*"` | `"ReplacementText"` |
+| `".*"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `""` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `".*"` | `"ReplacementText"` |
+| `".*"` | `".*"` | `""` | `"ReplacementText"` |
+| `".*"` | `""` | `".*"` | `"ReplacementText"` |
+| `".*"` | `""` | `""` | `"ReplacementText"` |
+| `""` | `"quick"` | `".*"` | `"The ReplacementText"` |
+| `""` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `""` | `".*"` | `".*"` | `"ReplacementText"` |
+| `""` | `".*"` | `""` | `"ReplacementText"` |
+| `""` | `""` | `".*"` | `"ReplacementText"` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) there is nothing to replace in, so no operation is performed.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`), or [Text To Find][TextToFind Property] is `null`; no operation is performed and the [Text][Text Property] remains unchanged.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not considered as part of the matches for [Text to Find][TextToFind Property] when determining what to replace; see [Advanced Examples][].
+
+### Null or empty Replacement Text
+
+If [Replacement Text][ReplacementText Property] is `null` or empty (i.e. `""`) all occurrences of [Text To Find][TextToFind Property] are replaced with an empty text (i.e. `""`).
+
+### Text To Find is not present
+
+If [Text To Find][TextToFind Property] is not present there is nothing to replace, so no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] with all occurrences of [Text To Find][TextToFind Property] replaced and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[ReplacementText Property]: {{< ref "#replacement-text" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-text-block.md
new file mode 100644
index 000000000..74cde5de1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-and-replace-text/find-and-replace-text-block.md
@@ -0,0 +1,416 @@
+---
+title: "Find And Replace Text"
+linkTitle: "Find And Replace Text"
+description: "Finds and replaces the specified occurrence of text in a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FindAndReplaceText_FindAndReplaceTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Finds and replaces the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] with the specified [Replacement Text][ReplacementText Property] in a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to find the [Text To Find][TextToFind Property].
+
+## Examples
+
+### Replace the first Occurrence of text
+
+This example will find and replace the first occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Text` will be updated to `"a quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Replace the second Occurrence of text
+
+This example will find and replace the second occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `2` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence `"the"`. Therefore, the variable `($)Text` will be updated to `"The quick brown fox jumps over a lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Replace the last Occurrence of text
+
+This example will find and replace the last occurrence of `"The"` in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence `"the"`. The second occurrence is also the last occurrence, and therefore, the variable `($)Text` will be updated to `"The quick brown fox jumps over a lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Replace an invalid Occurrence of text
+
+This example will find and replace the third occurrence of `"The"`, which is not present, in `"The quick brown fox jumps over the lazy dog."` with `"a"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Replacement Text][ReplacementText Property] | `($)ReplacementText` with value `"a"`| `($)ReplacementText` is a variable of type [String][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `3` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of the text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. There is no match for the third occurrence. Therefore, the variable `($)Text` will be not be updated and remains as `"The quick brown fox jumps over the lazy dog."`.
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find and replace the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find and replace the specified matching occurrence in [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Replacement Text
+
+The [Replacement Text][ReplacementText Property] used to replace the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.Net Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find the specific occurrence of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Occurrence][Occurrence Property] | `1` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+| [Replacement Text][ReplacementText Property] | `"ReplacementText"` |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Output Text | The value of the [Text][Text Property] after executing the block. \* |
+\* *DEFAULT* indicates that nothing has been found and replaced in [Text][Text Property], and that [Text][Text Property] is the same as was initially provided.
+
+Please note that these examples all perform a search which has at most one valid match in the text.
+
+#### SearchOptions.LiteralText
+
+These examples find and replace the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+
+#### SearchOptions.PatternMatching
+
+These examples find and replace the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `"*"` | `"ReplacementText"` |
+| `"The"` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"*"` | `"ReplacementText"` |
+| `"The"` | `"*"` | `""` | `"ReplacementText"` |
+| `"The"` | `""` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `""` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"*"` | `"*"` | `"*"` | `"ReplacementText"` |
+| `"*"` | `"*"` | `""` | `"ReplacementText"` |
+| `"*"` | `""` | `"*"` | `"ReplacementText"` |
+| `"*"` | `""` | `""` | `"ReplacementText"` |
+| `""` | `"quick"` | `"*"` | `"The ReplacementText"` |
+| `""` | `"*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"*"` | `"ReplacementText"` |
+| `""` | `"*"` | `""` | `"ReplacementText"` |
+| `""` | `""` | `"*"` | `"ReplacementText"` |
+
+#### SearchOptions.Regex
+
+These examples find and replace the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Output Text |
+|-----------------------|---------------------|---------------------|-------------|
+| `"The"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `"The"` | `""` | `"brown"` | *DEFAULT* |
+| `"The"` | `""` | `""` | `"ReplacementText quick brown fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `"brown"` | `"The ReplacementText fox jumps over the lazy dog."` |
+| `""` | `"quick"` | `""` | `"The ReplacementText brown fox jumps over the lazy dog."` |
+| `""` | `""` | `"brown"` | `"The quick ReplacementText fox jumps over the lazy dog."` |
+| `""` | `""` | `""` | *DEFAULT* |
+| `"The"` | `"quick"` | `".*"` | `"ReplacementText"` |
+| `"The"` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `".*"` | `"ReplacementText"` |
+| `"The"` | `".*"` | `""` | `"ReplacementText"` |
+| `"The"` | `""` | `".*"` | `"ReplacementText"` |
+| `".*"` | `"quick"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `".*"` | `"ReplacementText"` |
+| `".*"` | `"quick"` | `""` | `"ReplacementText brown fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `""` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `".*"` | `".*"` | `".*"` | `"ReplacementText"` |
+| `".*"` | `".*"` | `""` | `"ReplacementText"` |
+| `".*"` | `""` | `".*"` | `"ReplacementText"` |
+| `".*"` | `""` | `""` | `"ReplacementText"` |
+| `""` | `"quick"` | `".*"` | `"The ReplacementText"` |
+| `""` | `".*"` | `"brown"` | `"ReplacementText fox jumps over the lazy dog."` |
+| `""` | `".*"` | `".*"` | `"ReplacementText"` |
+| `""` | `".*"` | `""` | `"ReplacementText"` |
+| `""` | `""` | `".*"` | `"ReplacementText"` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) there is nothing to replace in, so no operation is performed.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`), or [Text To Find][TextToFind Property] is `null`; no operation is performed and the [Text][Text Property] remains unchanged.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not considered as part of the matches for [Text to Find][TextToFind Property] when determining what to replace; see [Advanced Examples][].
+
+### Null or empty Replacement Text
+
+If [Replacement Text][ReplacementText Property] is `null` or empty (i.e. `""`) all occurrences of [Text To Find][TextToFind Property] are replaced with an empty text (i.e. `""`).
+
+### Text To Find is not present
+
+If [Text To Find][TextToFind Property] is not present there is nothing to replace, so no operation is performed.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] with all occurrences of [Text To Find][TextToFind Property] replaced and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[Text Property]: {{}}
+[TextToFind Property]: {{}}
+[ReplacementText Property]: {{}}
+[Occurrence Property]: {{}}
+[SearchOptions Property]: {{}}
+[ComparisonType Property]: {{}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/_index.md
new file mode 100644
index 000000000..e04585aac
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Find Text"
+linkTitle: "Find Text"
+description: "Find text in another text"
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-all-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-all-text-block.md
new file mode 100644
index 000000000..65d013756
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-all-text-block.md
@@ -0,0 +1,470 @@
+---
+title: "Find All Text"
+linkTitle: "Find All Text"
+description: "Finds all occurrences of a text in a given text."
+---
+{{< figure src="/blocks/Cortex_Blocks_Text_FindText_FindAllTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.FindText.FindAllTextBlock)
+
+## Description
+
+Finds all occurrences of [Text To Find][TextToFind Property] in a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to match the [Text To Find][TextToFind Property] input.
+
+## Examples
+
+### Find all occurrences when there are multiple matches
+
+This example will find all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [List][]<[Match][]> value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Matches` will be updated to the following:
+
+```json
+[
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ }
+ }
+ },
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ }
+ }
+ }
+]
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Find all occurrences when there is a single match
+
+This example will find all occurrences of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [List][]<[Match][]> value |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Matches` will be set to the following:
+
+```json
+[
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ }
+ }
+ }
+]
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Find all occurrences when there are no matches
+
+This example will find all occurrences of `"cat"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "cat", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "cat", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Matches][Matches Property] | `($)Matches`, with no value | `($)Matches` is a variable that will be set to an [List][]<[Match][]> value |
+
+#### Results
+
+`"The quick brown fox jumps over the lazy dog."` does not contain an occurrence of `"cat"`. Therefore, `($)Matches` will be set to the following:
+
+```json
+[]
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find all occurrences of [Text To Find][TextToFind Property] in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find all matching occurrences in [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.NET Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Matches
+
+The [List][]<[Match][]> containing all valid matches found for the [Text To Find][TextToFind Property] search query.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [List][]<[Match][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Matches` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find all occurrences of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+| [Matches][Matches Property] | `($)Matches` with no value |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Matches[0].Value | The Value property of the first match of the [Matches][Matches Property] returned. \* |
+| Matches[0].Groups["startsWith"].Value | The value of the "startsWith" Group within the first match of the [Matches][Matches Property]. \* |
+| Matches[0].Groups["contains"].Value | The value of the "contains" Group within the first match of the [Matches][Matches Property]. \* |
+| Matches[0].Groups["endsWith"].Value | The value of the "endsWith" Group within the first match of the [Matches][Matches Property]. \* |
+
+\* *No Match* indicates that no match was found and *N/A* indicates that the group is not returned as part of the [Matches][Matches Property].
+
+Please note that these examples all perform a search which has at most one valid match in the text.
+
+#### SearchOptions.LiteralText
+
+These examples find the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Matches[0].Value | Matches[0].Groups["startsWith"].Value | Matches[0].Groups["contains"].Value | Matches[0].Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+
+#### SearchOptions.PatternMatching
+
+These examples find the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Matches[0].Value | Matches[0].Groups["startsWith"].Value | Matches[0].Groups["contains"].Value | Matches[0].Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+| `"The"` | `"quick"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"brown"` | `"The quick brown"` | `"The"` | `" quick "` | `"brown"` |
+| `"The"` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | `""` |
+| `"The"` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | *N/A* |
+| `"The"` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | *N/A* | `" quick brown fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The "` | `"quick"` | `"brown"` |
+| `"*"` | `"quick"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The "` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `""` | `"The quick"` | `"The "` | `"quick"` | *N/A* |
+| `"*"` | `"*"` | `"brown"` | `"The quick brown"` | `"The quick "` | `""` | `"brown"` |
+| `"*"` | `""` | `"brown"` | `"The quick brown"` | `"The quick "` | *N/A* | `"brown"` |
+| `"*"` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | `""` |
+| `"*"` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | *N/A* |
+| `"*"` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `""` |
+| `"*"` | `""` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"*"` | `"quick brown fox jumps over the lazy dog."` | *N/A* | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"brown"` | `"The quick brown"` | *N/A* | `"The quick "` | `"brown"` |
+| `""` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | `""` |
+| `""` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | *N/A* |
+| `""` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* | `"The quick brown fox jumps over the lazy dog."` |
+
+#### SearchOptions.Regex
+
+These examples find the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex` using a [case-sensitive, culture-insensitive][Ordinal] search.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Matches[0].Value | Matches[0].Groups["startsWith"].Value | Matches[0].Groups["contains"].Value | Matches[0].Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+| `"The"` | `"quick"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `"brown"` | `"The quick brown"` | `"The"` | `" quick "` | `"brown"` |
+| `"The"` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | `""` |
+| `"The"` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | *N/A* |
+| `"The"` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | *N/A* | `" quick brown fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The "` | `"quick"` | `"brown"` |
+| `".*"` | `"quick"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The "` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `""` | `"The quick"` | `"The "` | `"quick"` | *N/A* |
+| `".*"` | `".*"` | `"brown"` | `"The quick brown"` | `"The quick "` | `""` | `"brown"` |
+| `".*"` | `""` | `"brown"` | `"The quick brown"` | `"The quick "` | *N/A* | `"brown"` |
+| `".*"` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | `""` |
+| `".*"` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | *N/A* |
+| `".*"` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `""` |
+| `".*"` | `""` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* |
+| `""` | `"quick"` | `".*"` | `"quick brown fox jumps over the lazy dog."` | *N/A* | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `""` | `".*"` | `"brown"` | `"The quick brown"` | *N/A* | `"The quick "` | `"brown"` |
+| `""` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | `""` |
+| `""` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | *N/A* |
+| `""` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* | `"The quick brown fox jumps over the lazy dog."` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) no operation is performed and [Matches][Matches Property] is set to an empty [List][]<[Match][]>.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`), or [Text To Find][TextToFind Property] is `null`; no operation is performed and [Matches][Matches Property] is set to an empty [List][]<[Match][]>.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not included as a specific [Group][] for any [Match][] within the returned [Matches][Matches Property]; see [Advanced Examples][].
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that are equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[Matches Property]: {{< ref "#matches" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Match]: {{< url path="Cortex.Reference.DataTypes.Text.Regex.Match.MainDoc" >}}
+[Group]: {{< url path="Cortex.Reference.DataTypes.Text.Regex.Group.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-text-block.md
new file mode 100644
index 000000000..d9927c071
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/find-text/find-text-block.md
@@ -0,0 +1,513 @@
+---
+title: "Find Text"
+linkTitle: "Find Text"
+description: "Finds the specified occurrence of a text in a given text."
+---
+{{< figure src="/blocks/Cortex_Blocks_Text_FindText_FindTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.FindText.FindTextBlock)
+
+## Description
+
+Finds the specified [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in a given [Text][Text Property].
+
+[Search Options][SearchOptions Property] can be specified to choose whether to use a LiteralText, PatternMatching or Regex search to match the [Text To Find][TextToFind Property] input.
+
+## Examples
+
+### Find the first Occurrence of text
+
+This example will find the first [occurrence][Occurrence Property] of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Match][Match Property] | `($)Match`, with no value | `($)Match` is a variable that will be set to a [Match][] value |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` once; `"the"` has a different case so does not match. Therefore, the variable `($)Match` will be set to the following:
+
+```json
+{
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "The",
+ "Index": 0,
+ "Length": 3
+ }
+ ]
+ }
+ }
+}
+```
+
+For more information on using [Search Options][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Find the second Occurrence of text
+
+This example will find the second [occurrence][Occurrence Property] of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `2` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Match][Match Property] | `($)Match`, with no value | `($)Match` is a variable that will be set to a [Match][] value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of the text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. Therefore, the variable `($)Match` will be set to the following:
+
+```json
+{
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ }
+ }
+}
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Find the last Occurrence of text
+
+This example will find the last [occurrence][Occurrence Property] of `"The"` in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `-1` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Match][Match Property] | `($)Match`, with no value | `($)Match` is a variable that will be set to a [Match][] value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of the text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. The second occurrence is also the last occurrence, and therefore, the variable `($)Match` will be set to the following:
+
+```json
+{
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Groups": {
+ "0": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ },
+ "contains": {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3,
+ "Captures": [
+ {
+ "Value": "the",
+ "Index": 31,
+ "Length": 3
+ }
+ ]
+ }
+ }
+}
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+### Find an invalid Occurrence of text
+
+This example will find the third [occurrence][Occurrence Property] of `"The"`, which is not present, in `"The quick brown fox jumps over the lazy dog."`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog."` | `($)Text` is a variable of type [String][] |
+| [Text To Find][TextToFind Property] | `($)TextToFind`, with value `{"startsWith": "", "contains": "The", "endsWith": ""}`
In this example `($)TextToFind` has been set up using the following [Expression][]:
`new TextToFind(startsWith: "", contains: "The", endsWith: "")` | `($)TextToFind` is a variable of type [TextToFind][] |
+| [Occurrence][Occurrence Property] | `($)Occurrence`, with value `3` | `($)Occurrence` is a variable of type [Int32][] |
+| [Search Options][SearchOptions Property] | `($)SearchOptions`, with value `SearchOptions.LiteralText` | `($)SearchOptions` is a variable of type [SearchOptions][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Match][Match Property] | `($)Match`, with no value | `($)Match` is a variable that will be set to a [Match][] value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of the text (`"The quick brown fox jumps over the lazy dog."`), the text contains `"The"` twice; the first occurrence is `"The"` and the second occurrence is `"the"`. There is no match for the third occurrence. Therefore, the variable `($)Match` will be set to the following:
+
+```json
+null
+```
+
+For more information on using [SearchOptions][SearchOptions Property] and [Text To Find][TextToFind Property] see [Advanced Examples][].
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to find the specified occurrence of [Text To Find][TextToFind Property] in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Find
+
+The [Text To Find][TextToFind Property] search query used to find the specified matching occurrence in [Text][Text Property]. This property contains the following sub-properties:
+
+* [Starts With][StartsWith]
+* [Contains][Contains]
+* [Ends With][EndsWith]
+
+See [Advanced Examples][] for more information on how to use these sub-properties.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TextToFind][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `TextToFind` with the value shown below: |
+
+```json
+{
+ "StartsWith":"",
+ "Contains":"",
+ "EndsWith":"",
+}
+```
+
+### Occurrence
+
+The [Occurrence][Occurrence Property] of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about [supported values][Occurrences] for the [Occurrence][Occurrence Property] property and examples of how it can be used, please see [Occurrences][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Search Options
+
+[Search Options][SearchOptions Property] can be specified to choose whether [Text To Find][TextToFind Property] should be interpreted as a LiteralText, PatternMatching or Regex search:
+
+* `SearchOptions.LiteralText` matches text exactly; as long as the [Text][Text Property] contains the text specified in [Text To Find][TextToFind Property] it will be considered a match.
+* `SearchOptions.PatternMatching` allows wildcard text matching using [Pattern Matching Syntax][]:
+ * `*` wildcard character can be used to match `0` or more characters.
+ * `?` wildcard character can be used to match `0` or `1` character.
+ * All other characters are treated as a literal character.
+* `SearchOptions.Regex` allows regex text matching using [.NET Regex Syntax][Regex Syntax].
+
+Please note that overlapping matches are not detected (i.e. searching for `"aa"` in `"aaa"` matches `"aa"` at index `0` but not `"aa"` at index `1`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [SearchOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `LiteralText` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to match occurrences of [Text To Find][TextToFind Property] in [Text][Text Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Match
+
+The [Match][] containing the valid match found for the [Text To Find][TextToFind Property] search query.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Match][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Match` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+| | Thrown when [Search Options][SearchOptions Property] is not one of the specified [SearchOptions][] types (e.g. `(SearchOptions)10`). |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of any search done to find the specific occurrence of [Text to Find][TextToFind Property] exceeds the [BlockTimeout][], or `60` seconds if that is undefined. |
+| [RegexParsingFailedException][] | Thrown when [Search Options][SearchOptions Property] is `SearchOptions.Regex` and [TextToFind][TextToFind Property] has a property which is not a valid regex (e.g. `(`). |
+
+## Remarks
+
+### Advanced Examples
+
+The following sections will show examples for each possible value of [Search Options][SearchOptions Property].
+
+In these examples, the following properties are common:
+
+| Property | Value |
+|----------|-------|
+| [Text][Text Property] | `"The quick brown fox jumps over the lazy dog."` |
+| [Occurrence][Occurrence Property] | `1` |
+| [Comparison Type][ComparisonType Property] | `Ordinal` |
+| [Match][] | `($)Match` with no value |
+
+These sections contain tables for the examples. The columns of these tables are explained below:
+
+| Column Name | Explanation |
+|-------------|-------------|
+| TextToFind.StartsWith | Value used to define the StartsWith property of [Text To Find][TextToFind Property]. |
+| TextToFind.Contains | Value used to define the Contains property of [Text To Find][TextToFind Property]. |
+| TextToFind.EndsWith | Value used to define the EndsWith property of [Text To Find][TextToFind Property]. |
+| Match.Value | The Value property of the [Match][Match Property] returned. \* |
+| Match.Groups["startsWith"].Value | The value of the "startsWith" Group within the [Match][Match Property]. \* |
+| Match.Groups["contains"].Value | The value of the "contains" Group within the [Match][Match Property]. \* |
+| Match.Groups["endsWith"].Value | The value of the "endsWith" Group within the [Match][Match Property]. \* |
+
+\* *No Match* indicates that no match was found and *N/A* indicates that the group is not returned as part of the [Match][Match Property].
+
+#### SearchOptions.LiteralText
+
+These examples find and remove the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `LiteralText`.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Match.Value | Match.Groups["startsWith"].Value | Match.Groups["contains"].Value | Match.Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+
+#### SearchOptions.PatternMatching
+
+These examples find and remove the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `PatternMatching`.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Match.Value | Match.Groups["startsWith"].Value | Match.Groups["contains"].Value | Match.Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+| `"The"` | `"quick"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `"*"` | `"brown"` | `"The quick brown"` | `"The"` | `" quick "` | `"brown"` |
+| `"The"` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | `""` |
+| `"The"` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | *N/A* |
+| `"The"` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | *N/A* | `" quick brown fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The "` | `"quick"` | `"brown"` |
+| `"*"` | `"quick"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The "` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"*"` | `"quick"` | `""` | `"The quick"` | `"The "` | `"quick"` | *N/A* |
+| `"*"` | `"*"` | `"brown"` | `"The quick brown"` | `"The quick "` | `""` | `"brown"` |
+| `"*"` | `""` | `"brown"` | `"The quick brown"` | `"The quick "` | *N/A* | `"brown"` |
+| `"*"` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | `""` |
+| `"*"` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | *N/A* |
+| `"*"` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `""` |
+| `"*"` | `""` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"*"` | `"quick brown fox jumps over the lazy dog."` | *N/A* | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `""` | `"*"` | `"brown"` | `"The quick brown"` | *N/A* | `"The quick "` | `"brown"` |
+| `""` | `"*"` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | `""` |
+| `""` | `"*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | *N/A* |
+| `""` | `""` | `"*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* | `"The quick brown fox jumps over the lazy dog."` |
+
+#### SearchOptions.Regex
+
+These examples find and remove the first occurrence in [Text][Text Property] with [Search Options][SearchOptions Property] set to `Regex`.
+
+| TextToFind.StartsWith | TextToFind.Contains | TextToFind.EndsWith | Match.Value | Match.Groups["startsWith"].Value | Match.Groups["contains"].Value | Match.Groups["endsWith"].Value |
+|------------|----------|----------|--------------|------------------|----------------|----------------|
+| `"The"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The"` | `"quick"` | `"brown"` |
+| `"The"` | `"quick"` | `""` | `"The quick"` | `"The"` | `"quick"` | *N/A* |
+| `"The"` | `""` | `"brown"` | *No Match* | *No Match* | *N/A* | *No Match* |
+| `"The"` | `""` | `""` | `"The"` | `"The"` | *N/A* | *N/A* |
+| `""` | `"quick"` | `"brown"` | `"quick brown"` | *N/A* | `"quick"` | `"brown"` |
+| `""` | `"quick"` | `""` | `"quick"` | *N/A* | `"quick"` | *N/A* |
+| `""` | `""` | `"brown"` | `"brown"` | *N/A* | *N/A* | `"brown"` |
+| `""` | `""` | `""` | *No Match* | *N/A* | *N/A* | *N/A* |
+| `"The"` | `"quick"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `"The"` | `".*"` | `"brown"` | `"The quick brown"` | `"The"` | `" quick "` | `"brown"` |
+| `"The"` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | `""` |
+| `"The"` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | `" quick brown fox jumps over the lazy dog."` | *N/A* |
+| `"The"` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The"` | *N/A* | `" quick brown fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `"brown"` | `"The quick brown"` | `"The "` | `"quick"` | `"brown"` |
+| `".*"` | `"quick"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The "` | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `".*"` | `"quick"` | `""` | `"The quick"` | `"The "` | `"quick"` | *N/A* |
+| `".*"` | `".*"` | `"brown"` | `"The quick brown"` | `"The quick "` | `""` | `"brown"` |
+| `".*"` | `""` | `"brown"` | `"The quick brown"` | `"The quick "` | *N/A* | `"brown"` |
+| `".*"` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | `""` |
+| `".*"` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | `""` | *N/A* |
+| `".*"` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `""` |
+| `".*"` | `""` | `""` | `"The quick brown fox jumps over the lazy dog."` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* |
+| `""` | `"quick"` | `".*"` | `"quick brown fox jumps over the lazy dog."` | *N/A* | `"quick"` | `" brown fox jumps over the lazy dog."` |
+| `""` | `".*"` | `"brown"` | `"The quick brown"` | *N/A* | `"The quick "` | `"brown"` |
+| `""` | `".*"` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | `""` |
+| `""` | `".*"` | `""` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | `"The quick brown fox jumps over the lazy dog."` | *N/A* |
+| `""` | `""` | `".*"` | `"The quick brown fox jumps over the lazy dog."` | *N/A* | *N/A* | `"The quick brown fox jumps over the lazy dog."` |
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`) no operation is performed and [Match][Match Property] is set to `null`.
+
+### Null or empty Text To Find
+
+If all properties of [Text To Find][TextToFind Property] are `null` or empty (i.e. `""`) no operation is performed and [Match][Match Property] is set to `null`.
+
+### Null or empty property of Text To Find
+
+If a property of [Text To Find][TextToFind Property] is `null` or empty (i.e. `""`), then it is not included as a specified [Group][] in the returned [Match][Match Property]; see [Advanced Examples][].
+
+### Known Limitations
+
+If [Comparison Type][ComparisonType Property] is set to `StringComparison.CurrentCulture`, some characters such as `æ` that is equivalent to `ae` may not evaluate as equal.
+
+[Advanced Examples]: {{}}
+[Match Property]: {{< ref "#match" >}}
+[Occurrence Property]:{{}}
+[Text Property]: {{< ref "#text" >}}
+[TextToFind Property]: {{< ref "#text-to-find" >}}
+[SearchOptions Property]: {{< ref "#search-options" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Occurrences]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Occurrences.MainDoc" >}}
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+[Pattern Matching Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.PatternMatchingSyntax.MainDoc" >}}
+[Regex Syntax]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.RegexSyntax.MainDoc" >}}
+
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+
+[Group]: {{< url path="Cortex.Reference.DataTypes.Text.Regex.Group.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Match]: {{< url path="Cortex.Reference.DataTypes.Text.Regex.Match.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+[SearchOptions]: {{< url path="Cortex.Reference.DataTypes.Text.SearchOptions.MainDoc" >}}
+
+[TextToFind]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.MainDoc">}}
+[StartsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.StartsWith">}}
+[Contains]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.Contains">}}
+[EndsWith]: {{< url path="Cortex.Reference.DataTypes.Text.TextToFind.EndsWith">}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[BlockTimeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/format-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/_index.md
new file mode 100644
index 000000000..3510eb0bb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Format Text"
+linkTitle: "Format Text"
+description: "Format text containing format parameters (i.e. {0}) by replacing them with other values."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-value-block-1.md b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-value-block-1.md
new file mode 100644
index 000000000..ef3e20562
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-value-block-1.md
@@ -0,0 +1,186 @@
+---
+title: "Format Text With Value"
+linkTitle: "Format Text With Value"
+description: "Formats text by replacing all `{0}` format parameters in a specified format template with a given value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FormatText_FormatTextWithValueBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Replaces all `{0}` format parameters in the specified [Format Template][FormatTemplate Property] with the given [Value][Value Property], saving the result as [Text][Text Property].
+
+An additional [Format Provider][FormatProvider Property] option can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting).
+
+## Examples
+
+### Text Value
+
+This example will format `"Hello {0}"` with `"world!"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"Hello {0}"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value`, with value `"world!"` | `($)Value` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `null` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Formatting `"Hello {0}"` with `"world!"` results in the variable `($)Text` being updated to the following:
+
+```json
+"Hello world!"
+```
+
+***
+
+### Double Value using American English ("en-US")
+
+This example will format `"Your final bill is {0:C2}"` with `99.99`.
+
+The format parameter `{0:C2}` will display the double value as U.S currency to two decimal places (i.e. `$99.99`):
+
+* `0` - is replaced by the double value.
+* `C` - indicates to include the currency symbol for the specified culture (i.e. `$`).
+* `2` - indicates the number of decimal places to format the double value to.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"Your final bill is {0:C2}"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value`, with value `99.99` | `($)Value` is a variable of type [Double][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Formatting `"Your final bill is {0:C2}"` with `99.99` results in the variable `($)Text` being updated to the following:
+
+```json
+"Your final bill is $99.99"
+```
+
+***
+
+## Properties
+
+### Format Template
+
+[Format Template][FormatTemplate Property] can be specified to define the format of the resultant [Text][Text Property].
+
+All `{0}` format parameters in [Format Template][FormatTemplate Property] will be replaced with [Value][Value Property].
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), or does not contain any `{0}` format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `@"{0}"` |
+
+### Value
+
+The [Value][Value Property] to replace all `{0}` format parameters with.
+
+[Value][Value Property] does not have to be text, it can be any data type. Any non-text value will be converted to its text representation when it is replaced.
+
+For information about how types are converted to their text representation please see [Converting Objects To Text][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TValue][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Format Provider
+
+[Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting.).
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IFormatProvider][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+### Text
+
+The formatted [Text][Text Property] that results from replacing all `{0}` format parameters in [Format Template][FormatTemplate Property] with [Value][Value Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [FormatException][] | Thrown when [Format Template][FormatTemplate Property] contains a format parameter not equal to zero (e.g. `"Hello {1}"`). |
+| | Thrown when [Format Template][FormatTemplate Property] contains a format parameter that is invalid or not well-formed (e.g. `"Cost is {0:Q2}`, as `"Q"` is not a [valid format parameter][]). |
+
+## Remarks
+
+### Text Formatting
+
+Please note that changes to operating system settings, could result in some of the examples above displaying different results.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+### Null or Empty Format Template
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), or does not contain any `{0}` format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+### Null Format Provider
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+[FormatTemplate Property]: {{< ref "#format-template" >}}
+[Value Property]: {{< ref "#value" >}}
+[FormatProvider Property]: {{< ref "#format-provider" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+
+[Converting Objects To Text]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.ConvertingObjectsToText.MainDoc" >}}
+[Invariant Culture rules]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Culture.InvariantCulture.MainDoc" >}}
+[Text Formatting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.MainDoc" >}}
+[Valid Format Parameter]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.FormatTemplates" >}}
+
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Double]: {{< url path="Cortex.Reference.DataTypes.Numbers.Double.MainDoc" >}}
+[IFormatProvider]: {{< url path="Cortex.Reference.DataTypes.Text.IFormatProvider.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-values-block-1.md b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-values-block-1.md
new file mode 100644
index 000000000..1fe075c97
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/format-text/format-text-with-values-block-1.md
@@ -0,0 +1,209 @@
+---
+title: "Format Text With Values"
+linkTitle: "Format Text With Values"
+description: "Formats text by replacing all format parameters (e.g. `{0}` or `{1}` or `{2}`) in a specified format template with given values."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_FormatText_FormatTextWithValuesBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Replaces all format parameters (e.g. `{0}` or `{1}` or `{2}`) in the given [Format Template][FormatTemplate Property] with the specified [Values][Values Property], saving the result as [Text][Text Property].
+
+An additional [Format Provider][FormatProvider Property] option can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting).
+
+## Examples
+
+### Text Values
+
+This example will format `"Hello {0} {1}"` with `["Mr", "Smith"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"Hello {0} {1}"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Values][Values Property] | `($)Values`, with value `["Mr", "Smith"]` | `($)Values` is a variable of type [IEnumerable][]<[String][]> |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `null` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Formatting `"Hello {0} {1}"` with `["Mr", "Smith"]` results in the variable `($)Text` being updated to the following:
+
+```json
+"Hello Mr Smith"
+```
+
+***
+
+### Multiple non-text values using American English ("en-US")
+
+This example will format `"Your latest payment of {0:C2} has been received. You have paid {1:P0} of your total and have {2:C2} outstanding."` with `[99.99, 0.8, 40]`.
+
+The format parameter `{0:C2}` will display the `99.99` as U.S currency to two decimal places (i.e. `$99.99`):
+
+* `0` - is replaced by the double value `99.99`.
+* `C` - indicates to include the currency symbol for the specified culture (i.e. `$`).
+* `2` - indicates to format the double value to two decimal places.
+
+The format parameter `{1:P0}` will display the `0.8` as a percentage to zero decimal places (i.e. `80 %`):
+
+* `1` - is replaced by the double value `0.8`.
+* `P` - indicates the value should be formatted as a percentage.
+* `0` - indicates to format the percentage value to zero decimal places.
+
+The format parameter `{2:C2}` will display the `40` as U.S currency to two decimal places (i.e. `$40.00`):
+
+* `2` - is replaced by the double value `40`.
+* `C` - indicates to include the currency symbol for the specified culture (i.e. `$`).
+* `2` - indicates to format the double value to two decimal places.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"Your latest payment of {0:C2} has been received. You have paid {1:P0} of your total and have {2:C2} outstanding."` | `($)FormatTemplate` is a variable of type [String][] |
+| [Values][Values Property] | `($)Values`, with value `[99.99, 0.8, 40]` | `($)Values` is a variable of type [IEnumerable][]<[Double][]> |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+`"Your latest payment of {0:C2} has been received. You have paid {1:P0} of your total and have {2:C2} outstanding."` with `[99.99, 0.8, 40]` results in the variable `($)Text` being updated to the following:
+
+```json
+"Your latest payment of $99.99 has been received. You have paid 80 % of your total and have $40.00 outstanding."
+```
+
+***
+
+## Properties
+
+### Format Template
+
+[Format Template][FormatTemplate Property] can be specified to define the format of the resultant [Text][Text Property].
+
+All format parameters (e.g. `{0}` or `{1}` or `{2}`) in [Format Template][FormatTemplate Property] will be replaced with the corresponding value in [Values][Values Property]. Format parameter `{0}` will be replaced with the first value in [Values][Values Property]; `{1}` will be replaced with the second value in [Values][Values Property] etc.
+
+The number of unique format parameters must be equal to or less than the number of items in [Values][Values Property].
+
+The index of each format parameter must be equal to or less than the number of items in [Values][Values Property] - `1`.
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), or does not contain any format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `@"{0} {1}"` |
+
+### Values
+
+The [Values][Values Property] to replace all format parameters with.
+
+If a value does not have a corresponding format parameter, it is ignored.
+
+[Values][Values Property] does not have to contain all text values, it can contain any data types. Any non-text values will be converted to their text representation when they are replaced.
+
+If any value is `null` or empty (i.e. `""`), an empty text (i.e. `""`) will replace the corresponding format parameter.
+
+For information about how types are converted to their text representation please see [Converting Objects To Text][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TValue][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `new List() {0, "1"}` |
+
+### Format Provider
+
+[Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting.).
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IFormatProvider][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+### Text
+
+The formatted [Text][Text Property] that results from replacing all format parameters in [Format Template][FormatTemplate Property] with corresponding [Values][Values Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [FormatException][] | Thrown when [Format Template][FormatTemplate Property] contains a format parameter less than zero (e.g. `"Hello {-1}"`) or greater than the count of [Values][Values Property] - `1`. |
+| | Thrown when [Format Template][FormatTemplate Property] contains a format parameter that is invalid or not well-formed (e.g. `"Cost is {0:Q2}`, as `"Q"` is not a [valid format parameter][]). |
+| [PropertyNullException][] | Thrown when [Values][Values Property] is `null`. |
+
+## Remarks
+
+### Text Formatting
+
+Please note that changes to operating system settings, could result in some of the examples above displaying different results.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+### Null or Empty Format Template
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), or does not contain any format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+### Null Format Provider
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+[FormatTemplate Property]: {{< ref "#format-template" >}}
+[Values Property]: {{< ref "#values" >}}
+[FormatProvider Property]: {{< ref "#format-provider" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[Converting Objects To Text]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.ConvertingObjectsToText.MainDoc" >}}
+[Invariant Culture rules]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Culture.InvariantCulture.MainDoc" >}}
+[Text Formatting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.MainDoc" >}}
+[Valid Format Parameter]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.FormatTemplates" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Double]: {{< url path="Cortex.Reference.DataTypes.Numbers.Double.MainDoc" >}}
+[IFormatProvider]: {{< url path="Cortex.Reference.DataTypes.Text.IFormatProvider.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/_index.md
new file mode 100644
index 000000000..c3a9c2e87
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Text"
+linkTitle: "Get Text"
+description: "Get text from a given text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-beginning-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-beginning-block.md
new file mode 100644
index 000000000..197e0541f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-beginning-block.md
@@ -0,0 +1,114 @@
+---
+title: "Get Text At Beginning"
+linkTitle: "Get Text At Beginning"
+description: "Gets a length of text from the beginning of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetText_GetTextAtBeginningBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets a [Length][Length Property] of [text][TextAtBeginning Property] from the beginning of a given [Text][Text Property].
+
+## Examples
+
+### Get a Length of text from the beginning of a given Text
+
+This example will get the first `3` characters from the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+| [Text At Beginning][TextAtBeginning Property] | `($)TextAtBeginning`, with no value | `($)TextAtBeginning` is a variable that will be set to a [String][] |
+
+#### Result
+
+Getting the first `3` characters from the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)TextAtBeginning` being updated to the following:
+
+```json
+"ABC"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Text At Beginning][TextAtBeginning Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Length
+
+The [Length][Length Property] of text to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Text At Beginning
+
+The [Length][Length Property] of text at the beginning of [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextAtBeginning` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Length][Length Property] is greater than the length of [Text][Text Property]. |
+
+## Remarks
+
+### Negative Length
+
+If [Length][Length Property] is negative, the variable specified in the [Text At Beginning][TextAtBeginning Property] property will be set to the value of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, the variable specified in the [Text At Beginning][TextAtBeginning Property] property will be set to empty (i.e. `""`).
+
+[Text Property]: {{< ref "#text" >}}
+[Length Property]: {{< ref "#length" >}}
+[TextAtBeginning Property]: {{< ref "#text-at-beginning" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-end-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-end-block.md
new file mode 100644
index 000000000..4f822d37c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-end-block.md
@@ -0,0 +1,114 @@
+---
+title: "Get Text At End"
+linkTitle: "Get Text At End"
+description: "Gets a length of text from the end of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetText_GetTextAtEndBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.GetText.GetTextAtEndBlock)
+
+## Description
+
+Gets a [Length][Length Property] of [text][TextAtEnd Property] from the end of a given [Text][Text Property].
+
+## Examples
+
+### Get a Length of text from the end of a given Text
+
+This example will get the last `3` characters from the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+| [Text At End][TextAtEnd Property] | `($)TextAtEnd`, with no value | `($)TextAtEnd` is a variable that will be set to a [String][] |
+
+#### Result
+
+Getting the last `3` characters from the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)TextAtEnd` being updated to the following:
+
+```json
+"XYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Text At End][TextAtEnd Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Length
+
+The [Length][Length Property] of text to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Text At End
+
+The [Length][Length Property] of text at the end of [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextAtEnd` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Length][Length Property] is greater than the length of [Text][Text Property]. |
+
+## Remarks
+
+### Negative Length
+
+If [Length][Length Property] is negative, the variable specified in the [Text At End][TextAtEnd Property] property will be set to the value of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, the variable specified in the [Text At End][TextAtEnd Property] property will be set to empty (i.e. `""`).
+
+[Text Property]: {{< ref "#text" >}}
+[Length Property]: {{< ref "#length" >}}
+[TextAtEnd Property]: {{< ref "#text-at-end" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-index-block.md
new file mode 100644
index 000000000..b4a4b80cb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-at-index-block.md
@@ -0,0 +1,136 @@
+---
+title: "Get Text At Index"
+linkTitle: "Get Text At Index"
+description: "Gets a length of text at the specified index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetText_GetTextAtIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.GetText.GetTextAtIndexBlock)
+
+## Description
+
+Gets a [Length][Length Property] of [text][TextAtIndex Property] at the specified [Index][Index Property] of a given [Text][Text Property].
+
+## Examples
+
+### Get a Length of text at the specified Index of a given Text
+
+This example will get `3` characters at index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `3` | `($)Index` is a variable of type [Int32][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+| [Text At Index][TextAtIndex Property] | `($)TextAtIndex`, with no value | `($)TextAtIndex` is a variable that will be set to a [String][] |
+
+#### Result
+
+`"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, getting `3` characters at (and including) index `3` results in the variable `($)TextAtIndex` being updated to the following:
+
+```json
+"DEF"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Text At Index][TextAtIndex Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Index
+
+The [Index][Index Property] to get the text from. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Length
+
+The [Length][Length Property] of text to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Text At Index
+
+The [Length][Length Property] of text at the [Index][Index Property] of [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextAtIndex` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property]is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+| | Thrown when [Index][Index Property] + a positive [Length][Length Property] is greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Negative Length
+
+A negative [Length][Length Property] can be used to get all text at and after the [Index][Index Property] of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, the variable specified in the [Text At Index][TextAtIndex Property] property will be set to empty (i.e. `""`).
+
+### Index is inclusive
+
+The [Index][Index Property] property is an inclusive [index][Indexes], which means the character at the index will be included in the retrieved [text][TextAtIndex Property].
+
+[Text Property]: {{< ref "#text" >}}
+[Index Property]: {{< ref "#index" >}}
+[Length Property]: {{< ref "#length" >}}
+[TextAtIndex Property]: {{< ref "#text-at-index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-before-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-before-index-block.md
new file mode 100644
index 000000000..ec7e18142
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-before-index-block.md
@@ -0,0 +1,136 @@
+---
+title: "Get Text Before Index"
+linkTitle: "Get Text Before Index"
+description: "Gets a length of text before the specified index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetText_GetTextBeforeIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets a [Length][Length Property] of [text][TextBeforeIndex Property] before the specified [Index][Index Property] of a given [Text][Text Property].
+
+## Examples
+
+### Get a Length of text before the specified Index of a given Text
+
+This example will get `3` characters before index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `3` | `($)Index` is a variable of type [Int32][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+| [Text Before Index][TextBeforeIndex Property] | `($)TextBeforeIndex`, with no value | `($)TextBeforeIndex` is a variable that will be set to a [String][] |
+
+#### Result
+
+`"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, getting `3` characters before index `3` results in the variable `($)TextBeforeIndex` being updated to the following:
+
+```json
+"ABC"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Text Before Index][TextBeforeIndex Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Index
+
+The [Index][Index Property] to get the text before. This is an exclusive index, which means the character at the specified index won't be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Length
+
+The [Length][Length Property] of text to get.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+### Text Before Index
+
+The [Length][Length Property] of text before the [Index][Index Property] of [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextBeforeIndex` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than `1` or greater than the length of [Text][Text Property] - `1`. |
+| | Thrown when [Index][Index Property] - a positive [Length][Length Property] is less than `1`. |
+
+## Remarks
+
+### Negative Length
+
+A negative [Length][Length Property] can be used to get all text before the [Index][Index Property] of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, the variable specified in the [Text Before Index][TextBeforeIndex Property] property will be set to empty (i.e. `""`).
+
+### Index is exclusive
+
+The [Index][Index Property] property is an exclusive [index][Indexes], which means the character at the index will not be included in the retrieved [text][TextBeforeIndex Property].
+
+[Text Property]: {{< ref "#text" >}}
+[Index Property]: {{< ref "#index" >}}
+[Length Property]: {{< ref "#length" >}}
+[TextBeforeIndex Property]: {{< ref "#text-before-index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-between-indexes-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-between-indexes-block.md
new file mode 100644
index 000000000..30d78b689
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/get-text/get-text-between-indexes-block.md
@@ -0,0 +1,164 @@
+---
+title: "Get Text Between Indexes"
+linkTitle: "Get Text Between Indexes"
+description: "Gets text between the specified start index and end index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_GetText_GetTextBetweenIndexesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets [text][TextBetweenIndexes Property] between the specified [Start Index][StartIndex Property] and [End Index][EndIndex Property] of a given [Text][Text Property].
+
+## Examples
+
+### Get text between the specified Start Index and End Index of a given Text
+
+This example will get all characters between start index `0` and end index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `0` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `3` | `($)EndIndex` is a variable of type [Int32][] |
+| [Text Between Indexes][TextBetweenIndexes Property] | `($)TextBetweenIndexes`, with no value | `($)TextBetweenIndexes` is a variable that will be set to a [String][] |
+
+#### Result
+
+`"A"` is at index `0` and `"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, getting all characters between (and including) start index `0` and end index `3` results in the variable `($)TextBetweenIndexes` being updated to the following:
+
+```json
+"ABCD"
+```
+
+***
+
+### Get text where Start Index is greater than End Index
+
+This example will get all characters between start index `3` and end index `0` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `3` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `0` | `($)EndIndex` is a variable of type [Int32][] |
+| [Text Between Indexes][TextBetweenIndexes Property] | `($)TextBetweenIndexes`, with no value | `($)TextBetweenIndexes` is a variable that will be set to a [String][] |
+
+#### Result
+
+In this example the start index `3` is greater than the end index `0`. When this occurs, the block simply swaps the indexes before it processes the text.
+
+Therefore, having start index `3` and end index `0` is the same as having start index `0` and end index `3`.
+
+`"A"` is at index `0` and `"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+Therefore, getting all characters between (and including) start index `3` and end index `0`, or start index `0` and end index `3`, results in the variable `($)TextBetweenIndexes` being updated to the following:
+
+```json
+"ABCD"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to get the [Text Between Indexes][TextBetweenIndexes Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Start Index
+
+The [Start Index][StartIndex Property] used to get the text. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### End Index
+
+The [End Index][EndIndex Property] used to get the text. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Text Between Indexes
+
+The text between (and including) the [Start Index][StartIndex Property] and [End Index][EndIndex Property] of [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextBetweenIndexes` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Start Index][StartIndex Property] or [End Index][EndIndex Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Start Index and End Index are inclusive
+
+The [Start Index][StartIndex Property] and [End Index][EndIndex Property] properties are both inclusive [indexes][], which means the characters at those indexes will be included in the retrieved [text][TextBetweenIndexes Property].
+
+### Start Index greater than End Index
+
+[Start Index][StartIndex Property] can be greater than [End Index][EndIndex Property]. If this is the case, the values of the indexes will be swapped. See [Example][StartIndexGreaterThanEndIndex Example] above.
+
+[Text Property]: {{< ref "#text" >}}
+[StartIndex Property]: {{< ref "#start-index" >}}
+[EndIndex Property]: {{< ref "#end-index" >}}
+[TextBetweenIndexes Property]: {{< ref "#text-between-indexes" >}}
+
+[StartIndexGreaterThanEndIndex Example]: {{< ref "#get-text-where-start-index-is-greater-than-end-index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/_index.md
new file mode 100644
index 000000000..1b1f9d50d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Is Text"
+linkTitle: "Is Text"
+description: "Check if text is equal to another text, `null`, empty (i.e. `\"\"`), or whitespace (e.g. `\" \"`)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-block.md
new file mode 100644
index 000000000..35898d82e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-block.md
@@ -0,0 +1,165 @@
+---
+title: "Is Text Empty"
+linkTitle: "Is Text Empty"
+description: "Checks if text is empty (i.e. `\"\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextEmptyBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.IsText.IsTextEmptyBlock)
+
+## Description
+
+Checks if [Text][Text Property] is empty (i.e. `""`) .
+
+For information about empty, please see [Empty Text and Whitespace][].
+
+## Examples
+
+### Text is empty
+
+This example will check if `""` is empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `""` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty][TextIsEmpty Property] | `($)TextIsEmpty`, with no value | `($)TextIsEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`""` is empty (i.e. `""`), resulting in the variable `($)TextIsEmpty` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is null
+
+This example will check if `null` is empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty][TextIsEmpty Property] | `($)TextIsEmpty`, with no value | `($)TextIsEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`null` is not empty (i.e. `""`), resulting in the variable `($)TextIsEmpty` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is whitespace
+
+This example will check if `" "` is empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" "` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty][TextIsEmpty Property] | `($)TextIsEmpty`, with no value | `($)TextIsEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`" "` is not empty (i.e. `""`), resulting in the variable `($)TextIsEmpty` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is not empty
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty][TextIsEmpty Property] | `($)TextIsEmpty`, with no value | `($)TextIsEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not empty (i.e. `""`), resulting in the variable `($)TextIsEmpty` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is empty (i.e. `""`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text Is Empty
+
+The result of the is empty check.
+
+If the [Text][Text Property] is empty (i.e. `""`), the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsEmpty` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null Text
+
+If [Text][Text Property] is `null` the variable specified in the [Text Is Empty][TextIsEmpty Property] property will be set to `false`. See [Example][NullText Example] above.
+
+### Whitespace Text
+
+If [Text][Text Property] is whitespace (e.g. `" "`) the variable specified in the [Text Is Empty][TextIsEmpty Property] property will be set to `false`. See [Example][WhitespaceText Example] above.
+
+[Text Property]: {{< ref "#text" >}}
+[TextIsEmpty Property]: {{< ref "#text-is-empty-1" >}}
+
+[NullText Example]: {{< ref "#text-is-null" >}}
+[WhitespaceText Example]: {{< ref "#text-is-whitespace" >}}
+
+[Empty Text and Whitespace]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.EmptyTextAndWhitespace.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-or-whitespace-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-or-whitespace-block.md
new file mode 100644
index 000000000..0e23dcfa8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-empty-or-whitespace-block.md
@@ -0,0 +1,160 @@
+---
+title: "Is Text Empty Or Whitespace"
+linkTitle: "Is Text Empty Or Whitespace"
+description: "Checks if text is empty (i.e. `\"\"`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextEmptyOrWhitespaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+For information about empty and whitespace, please see [Empty Text and Whitespace][].
+
+## Examples
+
+### Text is empty
+
+This example will check if `""` is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `""` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty Or Whitespace][TextIsEmptyOrWhitespace Property] | `($)TextIsEmptyOrWhitespace`, with no value | `($)TextIsEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`""` is empty (i.e. `""`), resulting in the variable `($)TextIsEmptyOrWhitespace` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is whitespace
+
+This example will check if `" "` is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" "` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty Or Whitespace][TextIsEmptyOrWhitespace Property] | `($)TextIsEmptyOrWhitespace`, with no value | `($)TextIsEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`" "` is whitespace, resulting in the variable `($)TextIsEmptyOrWhitespace` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is null
+
+This example will check if `null` is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty Or Whitespace][TextIsEmptyOrWhitespace Property] | `($)TextIsEmptyOrWhitespace`, with no value | `($)TextIsEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`null` is not empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), resulting in the variable `($)TextIsEmptyOrWhitespace` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is not empty or whitespace
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text Is Empty Or Whitespace][TextIsEmptyOrWhitespace Property] | `($)TextIsEmptyOrWhitespace`, with no value | `($)TextIsEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), resulting in the variable `($)TextIsEmptyOrWhitespace` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text Is Empty Or Whitespace
+
+The result of the is empty or whitespace check.
+
+If the [Text][Text Property] is empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsEmptyOrWhitespace` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null Text
+
+If [Text][Text Property] is `null` the variable specified in the [Text Is Empty Or Whitespace][TextIsEmptyOrWhitespace Property] property will be set to `false`. See [Example][NullText Example] above.
+
+[Text Property]: {{< ref "#text" >}}
+[TextIsEmptyOrWhitespace Property]: {{< ref "#text-is-empty-or-whitespace" >}}
+
+[NullText Example]: {{< ref "#text-is-null" >}}
+
+[Empty Text and Whitespace]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.EmptyTextAndWhitespace.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-equal-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-equal-block.md
new file mode 100644
index 000000000..9474ebb9f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-equal-block.md
@@ -0,0 +1,189 @@
+---
+title: "Is Text Equal"
+linkTitle: "Is Text Equal"
+description: "Checks if a text is equal to another text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextEqualBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.IsText.IsTextEqualBlock)
+
+## Description
+
+Checks if [Text][Text Property] is equal to [Text To Compare][TextToCompare Property].
+
+## Examples
+
+### Text is equal to Text To Compare (Ordinal)
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is equal to `"The quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Compare][TextToCompare Property] | `($)TextToCompare`, with value `"The quick brown fox jumps over the lazy dog"` | `($)TextToCompare` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Text Is Equal][TextIsEqual Property] | `($)TextIsEqual`, with no value | `($)TextIsEqual` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text, `"The quick brown fox jumps over the lazy dog"` is equal to `"The quick brown fox jumps over the lazy dog"`, as they match exactly, including casing. Therefore, the variable `($)TextIsEqual` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is not equal to Text To Compare (Ordinal)
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is equal to `"the quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-sensitive, culture-insensitive][Ordinal] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Compare][TextToCompare Property] | `($)TextToCompare`, with value `"the quick brown fox jumps over the lazy dog"` | `($)TextToCompare` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.Ordinal` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Text Is Equal][TextIsEqual Property] | `($)TextIsEqual`, with no value | `($)TextIsEqual` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+As this example is performing a [case-sensitive, culture-insensitive][Ordinal] comparison of text, `"The quick brown fox jumps over the lazy dog"` is not equal to `"the quick brown fox jumps over the lazy dog"`, as whilst the characters match exactly, the casing of the first `"T"` differs. Therefore, the variable `($)TextIsEqual` will be updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is equal to Text To Compare (Ordinal Ignore Case)
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is equal to `"the quick brown fox jumps over the lazy dog"`.
+
+It performs a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text To Compare][TextToCompare Property] | `($)TextToCompare`, with value `"the quick brown fox jumps over the lazy dog"` | `($)TextToCompare` is a variable of type [String][] |
+| [Comparison Type][ComparisonType Property] | `($)ComparisonType`, with value `StringComparison.OrdinalIgnoreCase` | `($)ComparisonType` is a variable of type [StringComparison][] |
+| [Text Is Equal][TextIsEqual Property] | `($)TextIsEqual`, with no value | `($)TextIsEqual` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+As this example is performing a [case-insensitive, culture-insensitive][OrdinalIgnoreCase] comparison of text, `"The quick brown fox jumps over the lazy dog"` is equal to `"the quick brown fox jumps over the lazy dog"`, as the characters match exactly, and casing is not considered. Therefore, the variable `($)TextIsEqual` will be updated to the following:
+
+```json
+true
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is equal to [Text To Compare][TextToCompare Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text To Compare
+
+The [Text To Compare][TextToCompare Property] if [Text][Text Property] is equal to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Comparison Type
+
+The [Comparison Type][ComparisonType Property] specifying the rules used to compare if [Text][Text Property] is equal to [Text To Compare][TextToCompare Property].
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringComparison][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `Ordinal` |
+
+### Text Is Equal
+
+[Boolean][] indicating whether [Text][Text Property] is equal to [Text To Compare][TextToCompare Property].
+
+If they are equal the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsEqual` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Comparison Type][ComparisonType Property] is not one of the specified [StringComparison][] types (e.g. `(StringComparison)10`). |
+
+## Remarks
+
+### Comparison Types
+
+For information about the [supported values][ComparisonTypes] for the [Comparison Type][ComparisonType Property] property and examples of how it is determined whether two pieces of text match, please see [Equality][].
+
+### Null vs empty
+
+If [Text][Text Property] is `null` and [Text To Compare][TextToCompare Property] is empty (i.e. `""`), or vice versa, the variable specified in the [Text Is Equal][TextIsEqual Property] property is set to `false`, as `null` and `""` are not equal.
+
+[Text Property]: {{< ref "#text" >}}
+[TextToCompare Property]: {{< ref "#text-to-compare" >}}
+[ComparisonType Property]: {{< ref "#comparison-type" >}}
+[TextIsEqual Property]: {{< ref "#text-is-equal" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.MainDoc" >}}
+[ComparisonTypes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.MainDoc" >}}
+[Ordinal]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.Ordinal" >}}
+[OrdinalIgnoreCase]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Equality.ComparisonTypes.OrdinalIgnoreCase" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[StringComparison]: {{< url path="Cortex.Reference.DataTypes.Text.StringComparison.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-block.md
new file mode 100644
index 000000000..f4a7bb7dc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-block.md
@@ -0,0 +1,165 @@
+---
+title: "Is Text Null"
+linkTitle: "Is Text Null"
+description: "Checks if text is `null`."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextNullBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.IsText.IsTextNullBlock)
+
+## Description
+
+Checks if [Text][Text Property] is `null`.
+
+For information about `null`, please see [Null and Nullable Types][].
+
+## Examples
+
+### Text is null
+
+This example will check if `null` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` | `($)Text` is a variable of type [String][] |
+| [Text Is Null][TextIsNull Property] | `($)TextIsNull`, with no value | `($)TextIsNull` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`null` is `null`, resulting in the variable `($)TextIsNull` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is empty
+
+This example will check if empty (i.e. `""`) is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `""` | `($)Text` is a variable of type [String][] |
+| [Text Is Null][TextIsNull Property] | `($)TextIsNull`, with no value | `($)TextIsNull` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Empty (i.e. `""`) is not `null`, resulting in the variable `($)TextIsNull` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is whitespace
+
+This example will check if `" "` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" "` | `($)Text` is a variable of type [String][] |
+| [Text Is Null][TextIsNull Property] | `($)TextIsNull`, with no value | `($)TextIsNull` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`" "` is not `null`, resulting in the variable `($)TextIsNull` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is not null
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text Is Null][TextIsNull Property] | `($)TextIsNull`, with no value | `($)TextIsNull` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not `null`, resulting in the variable `($)TextIsNull` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is `null`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text Is Null
+
+The result of the is null check.
+
+If the [Text][Text Property] is `null`, the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsNull` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Empty Text
+
+If [Text][Text Property] is empty (i.e.. `""`) the variable specified in the [Text Is Null][TextIsNull Property] property will be set to `false`. See [Example][EmptyText Example] above.
+
+### Whitespace Text
+
+If [Text][Text Property] is whitespace (e.g. `" "`) the variable specified in the [Text Is Null][TextIsNull Property] property will be set to `false`. See [Example][WhitespaceText Example] above.
+
+[Text Property]: {{< ref "#text" >}}
+[TextIsNull Property]: {{< ref "#text-is-null-1" >}}
+
+[EmptyText Example]: {{< ref "#text-is-empty" >}}
+[WhitespaceText Example]: {{< ref "#text-is-whitespace" >}}
+
+[Null and Nullable Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.NullAndNullableTypes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-empty-or-whitespace-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-empty-or-whitespace-block.md
new file mode 100644
index 000000000..e53183a46
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-empty-or-whitespace-block.md
@@ -0,0 +1,160 @@
+---
+title: "Is Text Null, Empty Or Whitespace"
+linkTitle: "Is Text Null, Empty Or Whitespace"
+description: "Checks if text is `null`, empty (i.e. `\"\"`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextNullEmptyOrWhitespaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+For information about `null`, please see [Null and Nullable Types][].
+
+For information about empty and whitespace, please see [Empty Text and Whitespace][].
+
+## Examples
+
+### Text is null
+
+This example will check if `null` is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Empty Or Whitespace][TextIsNullEmptyOrWhitespace Property] | `($)TextIsNullEmptyOrWhitespace`, with no value | `($)TextIsNullEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`null` is `null`, resulting in the variable `($)TextIsNullEmptyOrWhitespace` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is empty
+
+This example will check if `""` is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `""` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Empty Or Whitespace][TextIsNullEmptyOrWhitespace Property] | `($)TextIsNullEmptyOrWhitespace`, with no value | `($)TextIsNullEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`""` is empty (i.e. `""`), resulting in the variable `($)TextIsNullEmptyOrWhitespace` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is whitespace
+
+This example will check if `" "` is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" "` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Empty Or Whitespace][TextIsNullEmptyOrWhitespace Property] | `($)TextIsNullEmptyOrWhitespace`, with no value | `($)TextIsNullEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`" "` is whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), resulting in the variable `($)TextIsNullEmptyOrWhitespace` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is not null, empty or whitespace
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Empty Or Whitespace][TextIsNullEmptyOrWhitespace Property] | `($)TextIsNullEmptyOrWhitespace`, with no value | `($)TextIsNullEmptyOrWhitespace` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), resulting in the variable `($)TextIsNullEmptyOrWhitespace` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text Is Null Empty Or Whitespace
+
+The result of the is null, empty or whitespace check.
+
+If the [Text][Text Property] is `null`, empty (i.e. `""`) or whitespace (i.e. `space`, `tab`, `carriage return`, `line feed` characters), the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsNullEmptyOrWhitespace` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+None
+
+[Text Property]: {{< ref "#text" >}}
+[TextIsNullEmptyOrWhitespace Property]: {{< ref "#text-is-null-empty-or-whitespace" >}}
+
+[Null and Nullable Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.NullAndNullableTypes.MainDoc" >}}
+
+[Empty Text and Whitespace]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.EmptyTextAndWhitespace.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-or-empty-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-or-empty-block.md
new file mode 100644
index 000000000..2228fbcfe
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/is-text/is-text-null-or-empty-block.md
@@ -0,0 +1,164 @@
+---
+title: "Is Text Null Or Empty"
+linkTitle: "Is Text Null Or Empty"
+description: "Checks if text is `null` or empty (i.e. `\"\"`)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_IsText_IsTextNullOrEmptyBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if [Text][Text Property] is `null` or empty (i.e. `""`).
+
+For information about `null`, please see [Null and Nullable Types][].
+
+For information about empty, please see [Empty Text and Whitespace][].
+
+## Examples
+
+### Text is null
+
+This example will check if `null` is `null` or empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `null` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Or Empty][TextIsNullOrEmpty Property] | `($)TextIsNullOrEmpty`, with no value | `($)TextIsNullOrEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`null` is `null`, resulting in the variable `($)TextIsNullOrEmpty` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is empty
+
+This example will check if `""` is `null` or empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `""` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Or Empty][TextIsNullOrEmpty Property] | `($)TextIsNullOrEmpty`, with no value | `($)TextIsNullOrEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`""` is empty (i.e. `""`), resulting in the variable `($)TextIsNullOrEmpty` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Text is whitespace
+
+This example will check if `" "` is `null` or empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" "` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Or Empty][TextIsNullOrEmpty Property] | `($)TextIsNullOrEmpty`, with no value | `($)TextIsNullOrEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`" "` is not `null` or empty (i.e. `""`), resulting in the variable `($)TextIsNullOrEmpty` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Text is not null or empty
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is `null` or empty (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Text` is a variable of type [String][] |
+| [Text Is Null Or Empty][TextIsNullOrEmpty Property] | `($)TextIsNullOrEmpty`, with no value | `($)TextIsNullOrEmpty` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not `null` or empty (i.e. `""`), resulting in the variable `($)TextIsNullOrEmpty` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to check is `null` or empty (i.e. `""`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Text Is Null Or Empty
+
+The result of the is null or empty check.
+
+If the [Text][Text Property] is `null` or empty (i.e. `""`), the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TextIsNullOrEmpty` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Whitespace Text
+
+If [Text][Text Property] is whitespace (e.g. `" "`) the variable specified in the [Text Is Null Or Empty][TextIsNullOrEmpty Property] property will be set to `false`. See [Example][WhitespaceText Example] above.
+
+[Text Property]: {{< ref "#text" >}}
+[TextIsNullOrEmpty Property]: {{< ref "#text-is-null-or-empty" >}}
+
+[WhitespaceText Example]: {{< ref "#text-is-whitespace" >}}
+
+[Null and Nullable Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.NullAndNullableTypes.MainDoc" >}}
+
+[Empty Text and Whitespace]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.EmptyTextAndWhitespace.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/join-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/join-text/_index.md
new file mode 100644
index 000000000..60c7d1193
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/join-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Join Text"
+linkTitle: "Join Text"
+description: "Join a set of values together (using a separator) to create text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/join-text/join-text-block-1.md b/content/en/docs/2026.3/Reference/Blocks/Text/join-text/join-text-block-1.md
new file mode 100644
index 000000000..8296d6f30
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/join-text/join-text-block-1.md
@@ -0,0 +1,154 @@
+---
+title: "Join Text"
+linkTitle: "Join Text"
+description: "Joins a set of values together as text, using the given separator between each value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_JoinText_JoinTextBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.JoinText.JoinTextBlock`1)
+
+## Description
+
+Joins a set of [Values][Values Property] together as [Text][Text Property], using the given [Separator][Separator Property] between each value.
+
+## Examples
+
+### Join a set of String Values together with a pipe Separator
+
+This example will join the set of [String][] values, `["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]`, together with a pipe separator (i.e. `"|"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Values][Values Property] | `($)Values`, with value `["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]` | `($)Values` is a variable of type [IEnumerable][]<[String][]> |
+| [Separator][Separator Property] | `($)Separator`, with value `"\|"` | `($)Separator` is a variable of type [String][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] |
+
+#### Result
+
+Joining `["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]` together as text with a pipe separator (i.e. `"|"`), results in the variable `($)Text` being updated to the following:
+
+```json
+"Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday"
+```
+
+***
+
+### Join a set of Int32 Values together with a comma Separator
+
+This example will join the set of [Int32][] values, `[1, 2, 3]`, together with a comma separator (i.e. `","`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Values][Values Property] | `($)Values`, with value `[1, 2, 3]` | `($)Values` is a variable of type [IEnumerable][]<[Int32][]> |
+| [Separator][Separator Property] | `($)Separator`, with value `","` | `($)Separator` is a variable of type [String][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] |
+
+#### Result
+
+Each [Int32][] value will be converted to its text representation, by calling its [ToString][] method (i.e. `value.ToString()`).
+
+Joining `[1, 2, 3]` together as text with a comma separator (i.e. `","`), results in the variable `($)Text` being updated to the following:
+
+```json
+"1,2,3"
+```
+
+***
+
+## Properties
+
+### Values
+
+The set of [Values][Values Property] to join together as [Text][Text Property].
+
+[Values][Values Property] will be joined together in the order they are defined.
+
+[Values][Values Property] can be any [IEnumerable][]<[TValue][]>, where [TValue][] represents the type of values.
+
+Each non-text value will be converted to its text representation, by calling its [ToString][] method (i.e. `value.ToString()`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][]<[TValue][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Values` with no value |
+
+### Separator
+
+The text to use as a [Separator][Separator Property] between each of the [Values][Values Property].
+
+[Separator][Separator Property] can contain zero or more characters.
+
+The [Separator][Separator Property] is only included in the resultant [Text][Text Property] if [Values][Values Property] has more than `1` item.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `,` |
+
+### Text
+
+The resultant [Text][Text Property] containing the specified [Values][Values Property] converted to their text representation and separated by the given [Separator][Separator Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Values][Values Property] is `null`. |
+| [OutOfMemoryException][] | Thrown when the length of the resultant [Text][Text Property] is longer than the maximum allowed length (`2,147,483,647`). |
+
+## Remarks
+
+### Null or empty Separator
+
+If [Separator][Separator Property] is `null` or empty (i.e. `""`), an empty text (i.e. `""`) will be used as the separator.
+
+### Null or empty Value in Values
+
+If any value in [Values][Values Property] is `null` or empty (i.e. `""`), an empty text (i.e. `""`) will be used as the value.
+
+[Values Property]: {{< ref "#values" >}}
+[Separator Property]: {{< ref "#separator" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[OutOfMemoryException]: {{< url path="MSDocs.DotNet.Api.System.OutOfMemoryException" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[ToString]: {{< url path="MSDocs.DotNet.Api.System.Object.ToString" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/_index.md
new file mode 100644
index 000000000..73ba8925c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Remove Text"
+linkTitle: "Remove Text"
+description: "Remove a length of text from a given text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-beginning-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-beginning-block.md
new file mode 100644
index 000000000..faad3bab9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-beginning-block.md
@@ -0,0 +1,106 @@
+---
+title: "Remove Text At Beginning"
+linkTitle: "Remove Text At Beginning"
+description: "Removes a length of text from the beginning of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_RemoveText_RemoveTextAtBeginningBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes a [Length][Length Property] of text from the beginning of a given [Text][Text Property].
+
+## Examples
+
+### Remove a Length of text from the beginning of a given Text
+
+This example will remove the first `3` characters from the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+
+#### Result
+
+Removing the first `3` characters from the beginning of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)Text` being updated to the following:
+
+```json
+"DEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to remove the [Length][Length Property] of text from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Length
+
+The [Length][Length Property] of text to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Length][Length Property] is greater than the length of [Text][Text Property]. |
+
+## Remarks
+
+### Negative Length
+
+If [Length][Length Property] is negative, all text will be removed and the variable specified in the [Text][Text Property] property will be set to empty (i.e. `""`).
+
+### Zero Length
+
+If [Length][Length Property] is `0`, no text will be removed and the variable specified in the [Text][Text Property] property will remain unchanged.
+
+[Text Property]: {{< ref "#text" >}}
+[Length Property]: {{< ref "#length" >}}
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Length][Length Property] of text removed at the beginning and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-end-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-end-block.md
new file mode 100644
index 000000000..932ea0f2a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-end-block.md
@@ -0,0 +1,106 @@
+---
+title: "Remove Text At End"
+linkTitle: "Remove Text At End"
+description: "Removes a length of text from the end of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_RemoveText_RemoveTextAtEndBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes a [Length][Length Property] of text from the end of a given [Text][Text Property].
+
+## Examples
+
+### Remove a Length of text from the end of a given Text
+
+This example will remove the last `3` characters from the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+
+#### Result
+
+Removing the last `3` characters from the end of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` results in the variable `($)Text` being updated to the following:
+
+```json
+"ABCDEFGHIJKLMNOPQRSTUVW"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to remove the [Length][Length Property] of text from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Length
+
+The [Length][Length Property] of text to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Length][Length Property] is greater than the length of [Text][Text Property]. |
+
+## Remarks
+
+### Negative Length
+
+If [Length][Length Property] is negative, all text will be removed and the variable specified in the [Text][Text Property] property will be set to empty (i.e. `""`).
+
+### Zero Length
+
+If [Length][Length Property] is `0`, no text will be removed and the variable specified in the [Text][Text Property] property will remain unchanged.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Length][Length Property] of text removed at the end and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[Length Property]: {{< ref "#length" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-index-block.md
new file mode 100644
index 000000000..49b78c595
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-at-index-block.md
@@ -0,0 +1,128 @@
+---
+title: "Remove Text At Index"
+linkTitle: "Remove Text At Index"
+description: "Removes a length of text at the specified index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_RemoveText_RemoveTextAtIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes a [Length][Length Property] of text at the specified [Index][Index Property] of a given [Text][Text Property].
+
+## Examples
+
+### Remove a Length of text at the specified Index of a given Text
+
+This example will remove `3` characters at index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `3` | `($)Index` is a variable of type [Int32][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+
+#### Result
+
+`"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, removing `3` characters at (and including) index `3` results in the variable `($)Text` being updated to the following:
+
+```json
+"ABCGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to remove the [Length][Length Property] of text from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Index
+
+The [Index][Index Property] to remove the text from. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Length
+
+The [Length][Length Property] of text to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+| | Thrown when [Index][Index Property] + a positive [Length][Length Property] is greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Negative Length
+
+A negative [Length][Length Property] can be used to remove all text at and after the [Index][Index Property] of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, no text will be removed and the variable specified in the [Text][Text Property] property will remain unchanged.
+
+### Index is inclusive
+
+The [Index][Index Property] property is an inclusive [index][Indexes], which means the character at the index will be included in the removed text.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Length][Length Property] of text removed at the specified [Index][Index Property] and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[Index Property]: {{< ref "#index" >}}
+[Length Property]: {{< ref "#length" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-before-index-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-before-index-block.md
new file mode 100644
index 000000000..d91eb1419
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-before-index-block.md
@@ -0,0 +1,129 @@
+---
+title: "Remove Text Before Index"
+linkTitle: "Remove Text Before Index"
+description: "Removes a length of text before the specified index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_RemoveText_RemoveTextBeforeIndexBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes a [Length][Length Property] of text before the specified [Index][Index Property] of a given [Text][Text Property].
+
+## Examples
+
+### Remove a Length of text before the specified Index of a given Text
+
+This example will remove `3` characters before index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Index][Index Property] | `($)Index`, with value `3` | `($)Index` is a variable of type [Int32][] |
+| [Length][Length Property] | `($)Length`, with value `3` | `($)Length` is a variable of type [Int32][] |
+
+#### Result
+
+`"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, removing `3` characters before index `3` results in the variable `($)Text` being updated to the following:
+
+```json
+"DEFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to remove the [Length][Length Property] of text from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+
+### Index
+
+The [Index][Index Property] to remove the text before. This is an exclusive index, which means the character at the specified index won't be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Length
+
+The [Length][Length Property] of text to remove.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `-1` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Index][Index Property] is less than `1` or greater than the length of [Text][Text Property] - `1`. |
+| | Thrown when [Index][Index Property] - a positive [Length][Length Property] is less than `1`. |
+
+## Remarks
+
+### Negative Length
+
+A negative [Length][Length Property] can be used to remove all text before the [Index][Index Property] of [Text][Text Property].
+
+### Zero Length
+
+If [Length][Length Property] is `0`, the variable specified in the [Text][Text Property] property will be set to empty (i.e. `""`).
+
+### Index is exclusive
+
+The [Index][Index Property] property is an exclusive [index][Indexes], which means the character at the index will not be included in the removed text.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the [Length][Length Property] of text removed before the specified [Index][Index Property] and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[Index Property]: {{< ref "#index" >}}
+[Length Property]: {{< ref "#length" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-between-indexes-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-between-indexes-block.md
new file mode 100644
index 000000000..afde04054
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/remove-text/remove-text-between-indexes-block.md
@@ -0,0 +1,155 @@
+---
+title: "Remove Text Between Indexes"
+linkTitle: "Remove Text Between Indexes"
+description: "Removes text between the specified start index and end index of a given text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_RemoveText_RemoveTextBetweenIndexesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes text between the specified [Start Index][StartIndex Property] and [End Index][EndIndex Property] of a given [Text][Text Property].
+
+## Examples
+
+### Remove text between the specified Start Index and End Index of a given Text
+
+This example will remove all characters between start index `0` and end index `3` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `0` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `3` | `($)EndIndex` is a variable of type [Int32][] |
+
+#### Result
+
+`"A"` is at index `0` and `"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`. Therefore, removing all characters between (and including) start index `0` and end index `3` results in the variable `($)Text` being updated to the following:
+
+```json
+"EFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+### Remove text where Start Index is greater than End Index
+
+This example will remove all characters between start index `3` and end index `0` of `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"` | `($)Text` is a variable of type [String][] |
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `3` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `0` | `($)EndIndex` is a variable of type [Int32][] |
+
+#### Result
+
+In this example the start index `3` is greater than the end index `0`. When this occurs, the block simply swaps the indexes before it processes the text.
+
+Therefore, having start index `3` and end index `0` is the same as having start index `0` and end index `3`.
+
+`"A"` is at index `0` and `"D"` is at index `3` in `"ABCDEFGHIJKLMNOPQRSTUVWXYZ"`.
+
+Therefore, removing all characters between (and including) start index `3` and end index `0`, or start index `0` and end index `3`, results in the variable `($)Text` being updated to the following:
+
+```json
+"EFGHIJKLMNOPQRSTUVWXYZ"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to remove the text from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Start Index
+
+The [Start Index][StartIndex Property] used to remove the text. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### End Index
+
+The [End Index][EndIndex Property] used to remove the text. This is an inclusive index, which means the character at the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when [Text][Text Property] is `null` or empty (i.e. `""`). |
+| | Thrown when [Start Index][StartIndex Property] or [End Index][EndIndex Property] is less than zero or greater than the length of [Text][Text Property] - `1`. |
+
+## Remarks
+
+### Start Index and End Index are inclusive
+
+The [Start Index][StartIndex Property] and [End Index][EndIndex Property] properties are both inclusive [indexes][Indexes], which means the characters at those indexes will be included in the removed text.
+
+### Start Index greater than End Index
+
+[Start Index][StartIndex Property] can be greater than [End Index][EndIndex Property]. If this is the case, the values of the indexes will be swapped. See [Example][StartIndexGreaterThanEndIndex Example] above.
+
+### Immutable String data type
+
+The [String][] data type used to represent [Text][Text Property] is immutable, which means it is read-only and cannot be changed once created.
+
+To overcome this, this block creates a new [String][] which has the text removed between the specified [Start Index][StartIndex Property] and [End Index][EndIndex Property], and re-assigns it to the variable specified in the [Text][Text Property] property.
+
+[Text Property]: {{< ref "#text" >}}
+[StartIndex Property]: {{< ref "#start-index" >}}
+[EndIndex Property]: {{< ref "#end-index" >}}
+
+[StartIndexGreaterThanEndIndex Example]: {{< ref "#remove-text-where-start-index-is-greater-than-end-index" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/split-text/_index.md b/content/en/docs/2026.3/Reference/Blocks/Text/split-text/_index.md
new file mode 100644
index 000000000..498cf5969
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/split-text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Split Text"
+linkTitle: "Split Text"
+description: "Split text (using a separator) into a list of values."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/Text/split-text/split-text-block.md b/content/en/docs/2026.3/Reference/Blocks/Text/split-text/split-text-block.md
new file mode 100644
index 000000000..adbff686e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/Text/split-text/split-text-block.md
@@ -0,0 +1,244 @@
+---
+title: "Split Text"
+linkTitle: "Split Text"
+description: "Splits text into a list of String values, using the given separator to determine where to split."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Text_SplitText_SplitTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Text.SplitText.SplitTextBlock)
+
+## Description
+
+Splits [Text][Text Property] into a list of [String][] [Values][Values Property], using the given [Separator][Separator Property] to determine where to split.
+
+[Split Options][SplitOptions Property] can be used to specify how to treat empty entries (i.e. `""`).
+
+## Examples
+
+### Split Text into a list of String Values using a pipe Separator
+
+This example will split the text `"Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday"` into a list of [String][] values, using the pipe separator (i.e. `"|"`) to determine where to split.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"Sunday\|Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday"` | `($)Text` is a variable of type [String][] |
+| [Separator][Separator Property] | `($)Separator`, with value `"\|"` | `($)Separator` is a variable of type [String][] |
+| [Split Options][SplitOptions Property] | `($)SplitOptions`, with value `StringSplitOptions.None` | `($)SplitOptions` is a variable of type [StringSplitOptions][] |
+| [Values][Values Property] | `($)Values`, with no value | `($)Values` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Splitting `"Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday"` using a pipe separator (i.e. `"|"`), results in the variable `($)Values` being updated to the following:
+
+```json
+["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
+```
+
+***
+
+### Split Text into a list of String Values using a comma Separator (removing empty entries)
+
+This example will split the text `"1,2,3,,"` into a list of [String][] values, using the comma separator (i.e. `","`) to determine where to split, and removing empty entries (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"1,2,3,,"` | `($)Text` is a variable of type [String][] |
+| [Separator][Separator Property] | `($)Separator`, with value `","` | `($)Separator` is a variable of type [String][] |
+| [Split Options][SplitOptions Property] | `($)SplitOptions`, with value `StringSplitOptions.RemoveEmptyEntries` | `($)SplitOptions` is a variable of type [StringSplitOptions][] |
+| [Values][Values Property] | `($)Values`, with no value | `($)Values` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Splitting `"1,2,3,,"` using a comma separator (i.e. `","`) and removing the last 2 entries which are empty (i.e. `""`), results in the variable `($)Values` being updated to the following:
+
+```json
+["1", "2", "3"]
+```
+
+***
+
+### Split Text into a list of String Values using a comma Separator (keeping empty entries)
+
+This example will split the text `"1,2,3,,"` into a list of [String][] values, using the comma separator (i.e. `","`) to determine where to split, and keeping empty entries (i.e. `""`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"1,2,3,,"` | `($)Text` is a variable of type [String][] |
+| [Separator][Separator Property] | `($)Separator`, with value `","` | `($)Separator` is a variable of type [String][] |
+| [Split Options][SplitOptions Property] | `($)SplitOptions`, with value `StringSplitOptions.None` | `($)SplitOptions` is a variable of type [StringSplitOptions][] |
+| [Values][Values Property] | `($)Values`, with no value | `($)Values` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Splitting `"1,2,3,,"` using a comma separator (i.e. `","`) and keeping the last 2 entries which are empty but trimming, results in the variable `($)Values` being updated to the following:
+
+```json
+["1", "2", "3", "", ""]
+```
+
+***
+
+### Split Text into a list of String Values using a comma Separator (keeping empty entries but trimming entries)
+
+This example will split the text `" 1 , 2,3 ,,"` into a list of [String][] values, using the comma separator (i.e. `","`) to determine where to split, and keeping empty entries (i.e. `""`) but trimming whitespaces (i.e. `" 1 "` would become `"1"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" 1 , 2,3 ,,"` | `($)Text` is a variable of type [String][] |
+| [Separator][Separator Property] | `($)Separator`, with value `","` | `($)Separator` is a variable of type [String][] |
+| [Split Options][SplitOptions Property] | `($)SplitOptions`, with value `StringSplitOptions.TrimEntries` | `($)SplitOptions` is a variable of type [StringSplitOptions][] |
+| [Values][Values Property] | `($)Values`, with no value | `($)Values` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Splitting `" 1 , 2,3 ,,"` using a comma separator (i.e. `","`) and keeping the last 2 entries which are empty (i.e. `""`) but trimming whitespaces (i.e. `" 1 "`), results in the variable `($)Values` being updated to the following:
+
+```json
+["1", "2", "3", "", ""]
+```
+
+***
+
+### Split Text into a list of String Values using a comma Separator (removing empty entries and trimming entries)
+
+This example will split the text `" 1 , 2,3 ,,"` into a list of [String][] values, using the comma separator (i.e. `","`) to determine where to split, and remove any empty entries (i.e. `""`) and trimming whitespaces (i.e. `" 1 "` would become `"1"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `" 1 , 2,3 ,,"` | `($)Text` is a variable of type [String][] |
+| [Separator][Separator Property] | `($)Separator`, with value `","` | `($)Separator` is a variable of type [String][] |
+| [Split Options][SplitOptions Property] | `($)SplitOptions`, with value `StringSplitOptions.RemoveEmptyEntries \| StringSplitOptions.TrimEntries` | `($)SplitOptions` is a variable of type [StringSplitOptions][] |
+| [Values][Values Property] | `($)Values`, with no value | `($)Values` is a variable that will be set to an [IList][]<[String][]> |
+
+#### Result
+
+Splitting `" 1 , 2,3 ,,"` using a comma separator (i.e. `","`) and removing the last 2 entries which are empty (i.e. `""`) and trimming whitespaces (i.e. `" 1 "`), results in the variable `($)Values` being updated to the following:
+
+```json
+["1", "2", "3"]
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to split into [Values][Values Property] using the given [Separator][Separator Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Separator
+
+The [Separator][Separator Property] used to determine where to split the [Text][Text Property] into the [Values][Values Property].
+
+[Separator][Separator Property] can contain zero or more characters.
+
+The [Separator][Separator Property] is not included in the resultant [Values][Values Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `,` |
+
+### Split Options
+
+[Split Options][SplitOptions Property] used to specify how to treat empty entries (i.e. `""`).
+
+Currently supported values for the [Split Options][SplitOptions Property] property are:
+
+* StringSplitOptions.None (Default) - empty entries and trailing or leading whitespaces (at the start or end of text) are included in [Values][Values Property].
+* StringSplitOptions.RemoveEmptyEntries - empty entries are excluded from [Values][Values Property]; trailing or leading whitespaces (at the start or end of text) are included.
+* StringSplitOptions.TrimEntries - trailing or leading whitespaces (at the start or end of text) are excluded from [Values][Values Property]; empty entries are included.
+
+It's also possible to combine `StringSplitOptions` in the [Expression Editor][Expression]. The example below shows how to remove empty entries and trim entries:
+
+```csharp
+StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
+```
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [StringSplitOptions][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Literal][] |
+| Default Value | `None` |
+
+### Values
+
+The resultant [Values][Values Property] containing an entry for each piece of split text in the order they are defined in [Text][Text Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[String][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Values` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Split Options][SplitOptions Property] is not one of the specified [StringSplitOptions][] types (e.g. `(StringSplitOptions)10`). |
+
+## Remarks
+
+### Null or empty Text
+
+If [Text][Text Property] is `null` or empty (i.e. `""`), then `null` or empty (i.e. `""`) respectively is added as the only entry to [Values][Values Property].
+
+### Null or empty Separator
+
+If [Separator][Separator Property] is `null` or empty (i.e. `""`), the value of the variable specified for the [Text][Text Property] property is added as the only entry to [Values][Values Property].
+
+### Separator not found
+
+If the [Separator][Separator Property] is not found in [Text][Text Property], the value of the variable specified for the [Text][Text Property] property is added as the only entry to [Values][Values Property].
+
+[Values Property]: {{< ref "#values" >}}
+[Separator Property]: {{< ref "#separator" >}}
+[SplitOptions Property]: {{< ref "#split-options" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[StringSplitOptions]: {{< url path="Cortex.Reference.DataTypes.Text.StringSplitOptions.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+
diff --git a/content/en/docs/2026.3/Reference/Blocks/_index.md b/content/en/docs/2026.3/Reference/Blocks/_index.md
new file mode 100644
index 000000000..321f178f6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Blocks"
+linkTitle: "Blocks"
+description: "This section includes all reference documentation for functional blocks."
+weight: 10
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/_index.md
new file mode 100644
index 000000000..1ec60a4e9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Data Storage"
+linkTitle: "Data Storage"
+description: "Blocks related to working with Data Storage."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/_index.md
new file mode 100644
index 000000000..7d76634a0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Create Collection"
+linkTitle: "Create Collection"
+description: "Create a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/create-collection-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/create-collection-block.md
new file mode 100644
index 000000000..b3246083b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/create-collection/create-collection-block.md
@@ -0,0 +1,139 @@
+---
+title: "Create Collection"
+linkTitle: "Create Collection"
+description: "Create a data storage collection."
+---
+{{}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Create a [Data Storage Collection] within the [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Create a Data Storage Collection
+
+This example will attempt to create a new [Data Storage Collection] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+This creates a new [Data Storage Collection] within the [Collection Scope][Collection Scope Property] with [Collection Name][Collection Name Property] `"users"`.
+
+### Create a Data Storage Collection that Already Exists
+
+This example will attempt to create a new [Data Storage Collection] named `"users"`that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Attempting to create a [Data Storage Collection] with the name `"users"` within the [Collection Scope][Collection Scope Property] results in no operation, as the [Data Storage Collection] already exists.
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] to create the [Data Storage Collection] within.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with the value shown below: |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection] to create.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| [ServiceDoesNotExistException][] | Thrown when the [Data Storage Service][] does not exist. |
+| [ServiceUnavailableException][] | Thrown when the [Data Storage Service][] is not healthy. |
+
+## Remarks
+
+### Creating a Collection that Already Exists
+
+When trying to create a collection that already exists, no operation is performed; see example [Create a Data Storage Collection that Already Exists][Collection Already Exists].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. 'Collection' is the same as 'collection'), so trying to create a [Data Storage Collection] named `"Collection"` while `"COLLECTION"` already exists would have no effect; see example [Create a Data Storage Collection that Already Exists][Collection Already Exists].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Collection Already Exists]: {{< ref "#create-a-data-storage-collection-that-already-exists">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ServiceDoesNotExistException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceDoesNotExistException.MainDoc">}}
+[ServiceUnavailableException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceUnavailableException.MainDoc">}}
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/_index.md
new file mode 100644
index 000000000..55e7c9294
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Delete Collection"
+linkTitle: "Delete Collection"
+description: "Delete a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/delete-collection-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/delete-collection-block.md
new file mode 100644
index 000000000..d22a27e01
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-collection/delete-collection-block.md
@@ -0,0 +1,147 @@
+---
+title: "Delete Collection"
+linkTitle: "Delete Collection"
+description: "Deletes a data storage collection."
+---
+
+{{}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Delete a [Data Storage Collection][] within the [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Delete a Data Storage Collection
+
+This example will attempt to delete a [Data Storage Collection] named `"users"`that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+This deletes the [Data Storage Collection] within the [Collection Scope][Collection Scope Property] with [Collection Name][Collection Name Property] `"users"`.
+
+***
+
+### Delete a Data Storage Collection that Does Not Exist
+
+This example will attempt to delete a [Data Storage Collection][] named `"users"`that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` does not exist.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Attempting to delete a [Data Storage Collection] with the name `"users"` within the [Collection Scope][Collection Scope Property] results in no operation, as the [Data Storage Collection] does not exist.
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] to delete the [Data Storage Collection] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value show below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection] to delete.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| [ServiceDoesNotExistException][] | Thrown when the [Data Storage Service][] does not exist. |
+| [ServiceUnavailableException][] | Thrown when the [Data Storage Service][] is not healthy. |
+
+## Remarks
+
+### Deleting a Collection that Does Not Exist
+
+When trying to delete a collection that does not exist, no operation is performed; see example [Delete a Data Storage Collection that Does Not Exist][Delete Collection that Does Not Exist].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. 'Collection' is the same as 'collection'), so trying to delete a [Data Storage Collection] named `"Collection"` while `"COLLECTION"` exists would delete `"COLLECTION"`; see example [Delete a Data Storage Collection][Delete Collection].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+
+[Delete Collection]: {{< ref "#delete-a-data-storage-collection">}}
+[Delete Collection that Does Not Exist]: {{< ref "#delete-a-data-storage-collection-that-does-not-exist" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ServiceDoesNotExistException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceDoesNotExistException.MainDoc">}}
+[ServiceUnavailableException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceUnavailableException.MainDoc">}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/_index.md
new file mode 100644
index 000000000..aa6ec59f5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Delete Data"
+linkTitle: "Delete Data"
+description: "Delete data from a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/delete-data-with-key-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/delete-data-with-key-block.md
new file mode 100644
index 000000000..ec7973ff9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/delete-data/delete-data-with-key-block.md
@@ -0,0 +1,189 @@
+---
+title: "Delete Data With Key"
+linkTitle: "Delete Data With Key"
+description: "Deletes data from a data storage collection with the specified key."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_DeleteData_DeleteDataWithKeyBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Deletes data from a [Data Storage Collection][] with the specified [Key][Key Property].
+
+## Examples
+
+### Delete from a Data Storage Collection
+
+This example will attempt to delete data from a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following [Keys][Key Property] and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+The example will delete the [Key][Key Property] `"user2"` and the associated data.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+This deletes `"user2"` from the [Data Storage Collection][] which removes the data `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` from the `"users"` [Data Storage Collection][] as shown below:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+
+***
+
+### Delete from a Data Storage Collection with a Key that Does Not Exist
+
+This example will attempt to delete data from a [Data Storage Collection] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following [Keys][Key Property] and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+The example will attempt to delete the [Key][Key Property] `"user3"` and any associated data.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user3"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Attempting to delete `"user3"` from the [Data Storage Collection][] `"users"` within the [Collection Scope][Collection Scope Property] results in no operation, as the [Key][Key Property] does not exist.
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection] to delete from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value shown below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] to delete from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] the data to delete must have.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [DataStorageCollectionNotFoundException][] | Thrown when the [Collection Name][Collection Name Property] can not be found within the specified [Collection Scope][Collection Scope property].
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null`. |
+| [ServiceDoesNotExistException][] | Thrown when the [Data Storage Service][] does not exist. |
+| [ServiceUnavailableException][] | Thrown when the [Data Storage Service][] is not healthy. |
+
+## Remarks
+
+### Deleting from a Collection with a Key that Does Not Exist
+When trying to delete from a collection with a [Key][Key Property] that does not exist, no operation is performed; see example [Delete from a Data Storage Collection with a Key that Does Not Exist][Delete Missing Key].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. 'Collection' is the same as 'collection'), so trying to delete from a [Data Storage Collection] named `"Collection"` while `"COLLECTION"` already exists would delete from `"COLLECTION"`.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Data Property]: {{< ref "#data" >}}
+[Delete Missing Key]: {{< ref "#delete-from-a-data-storage-collection-with-a-key-that-does-not-exist">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ServiceDoesNotExistException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceDoesNotExistException.MainDoc">}}
+[ServiceUnavailableException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceUnavailableException.MainDoc">}}
+[DataStorageCollectionNotFoundException]: {{< url path = "Cortex.Reference.Exceptions.DataStorage.DataStorageCollectionNotFoundException.MainDoc">}}
+[KeyInDataStorageCollectionNotFoundException]: {{< url path = "Cortex.Reference.Exceptions.DataStorage.KeyInDataStorageCollectionNotFoundException.MainDoc">}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/_index.md
new file mode 100644
index 000000000..5e5187a84
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Read Data"
+linkTitle: "Read Data"
+description: "Read data from a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/read-data-with-key-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/read-data-with-key-block.md
new file mode 100644
index 000000000..74007abac
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/read-data/read-data-with-key-block.md
@@ -0,0 +1,175 @@
+---
+title: "Read Data With Key"
+linkTitle: "Read Data With Key"
+description: "Reads data from a data storage collection with the specified key."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_ReadData_ReadDataWithKeyBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Reads data from a [Data Storage Collection][] with the specified [Key][Key Property].
+
+## Examples
+
+### Read from a Data Storage Collection
+
+This example will attempt to read [Data][Data Property] from a [Data Storage Collection] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following [Keys][Key Property] and [Data][Data Property]:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+The example will read the [Key][Key Property] `"user2"` and store the retrieved [Data][Data Property] to `($)Data`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+| [Data][Data Property] | `($)Data`, with no value | `($)Data` is a variable that will be of type [dynamic][] |
+
+#### Result
+
+This reads `"user2"` from the [Data Storage Collection][] `"users"` which results in the variable `($)Data` being updated to the following:
+
+```json
+{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}
+```
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection] to read from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value shown below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] to read from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] the [Data][Data Property] to read must have.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+### Data
+
+The [Data][Data Property] that is read from the [Data Storage Collection] with the matching [Key][Key Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Data` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [DataStorageCollectionNotFoundException][] | Thrown when the [Collection Name][Collection Name Property] can not be found within the specified [Collection Scope][Collection Scope property].
+| [KeyInDataStorageCollectionNotFoundException][] | Thrown when the given [Key][Key Property] can not be found in the [Data Storage Collection] within the specified [Collection Scope][Collection Scope Property]. |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null`. |
+| [ServiceDoesNotExistException][] | Thrown when the [Data Storage Service][] does not exist. |
+| [ServiceUnavailableException][] | Thrown when the [Data Storage Service][] is not healthy. |
+
+## Remarks
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. 'Collection' is the same as 'collection'), so trying to read from a [Data Storage Collection] named `"Collection"` while `"COLLECTION"` already exists would read from `"COLLECTION"`.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Data Property]: {{< ref "#data" >}}
+[Write Existing Key]: {{< ref "#write-to-a-data-storage-collection-with-a-key-that-already-exists">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ServiceDoesNotExistException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceDoesNotExistException.MainDoc">}}
+[ServiceUnavailableException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceUnavailableException.MainDoc">}}
+[DataStorageCollectionNotFoundException]: {{< url path = "Cortex.Reference.Exceptions.DataStorage.DataStorageCollectionNotFoundException.MainDoc">}}
+[KeyInDataStorageCollectionNotFoundException]: {{< url path = "Cortex.Reference.Exceptions.DataStorage.KeyInDataStorageCollectionNotFoundException.MainDoc">}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/_index.md
new file mode 100644
index 000000000..597640892
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wait For Collection"
+linkTitle: "Wait For Collection"
+description: "Waits for a data storage collection to exist or not exist."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-exist-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-exist-block.md
new file mode 100644
index 000000000..8bc5e7a2a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-exist-block.md
@@ -0,0 +1,149 @@
+---
+title: "Wait For Collection To Exist"
+linkTitle: "Wait For Collection To Exist"
+description: "Waits for a data storage collection to exist."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForCollection_WaitForCollectionToExistBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Data Storage Collection][] to exist within a [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Wait for a Data Storage Collection to exist
+
+This example will wait for a [Data Storage Collection][] `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [CollectionScope][Collection Scope Property], to exist. In this example `"users"` does not already exist.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Waiting for the `"users"` [Data Storage Collection][] to exist results in the execution waiting until the desired [Collection][Collection Name Property] exists; see [Create Collection][].
+
+### Wait for a Data Storage Collection that already exists to exist
+
+This example will wait for a [Data Storage Collection][] `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [CollectionScope][Collection Scope Property], to exist. In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Waiting for the `"users"` [Data Storage Collection][] to exist results in the execution progressing as the collection `"users"` already exists.
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] to wait for the [Data Storage Collection][] to exist in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value shown below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so trying to wait for a [Data Storage Collection][] named `"Collection"` to exist while `"COLLECTION"` already exists would cause the execution to progress; see [Wait for a Data Storage Collection that already exists to exist][Collection Already Exists].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Collection Already Exists]: {{< ref
+"#wait-for-a-data-storage-collection-that-already-exists-to-exist" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+[Create Collection]: {{< url path = "Cortex.Reference.Blocks.DataStorage.CreateCollection.CreateCollectionBlock.MainDoc">}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-not-exist-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-not-exist-block.md
new file mode 100644
index 000000000..324a1f416
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-collection/wait-for-collection-to-not-exist-block.md
@@ -0,0 +1,154 @@
+---
+title: "Wait For Collection To Not Exist"
+linkTitle: "Wait For Collection To Not Exist"
+description: "Waits for a data storage collection to not exist."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForCollection_WaitForCollectionToNotExistBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Data Storage Collection][] to not exist within a [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Wait for a Data Storage Collection to not exist
+
+This example will wait for a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property], to not exist. In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Waiting for the `"users"` [Data Storage Collection][] to not exist results in the execution waiting until the desired [Collection][Collection Name Property] does not exist; see [Delete Collection][Deleted].
+
+***
+
+### Wait for a Data Storage Collection to not exist when it does not already exist
+
+This example will wait for a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property], to not exist. In this example `"users"` does not already exist.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+
+#### Result
+
+Waiting for the `"users"` [Data Storage Collection][] to not exist results in the execution progressing as the collection `"users"` does not exist.
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] to wait for the [Data Storage Collection][] to not exist in.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value|
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so waiting for a [Data Storage Collection] named `"Collection"` to not exist while `"COLLECTION"` exists will cause the execution to wait; see [Wait for a Data Storage Collection to not exist][Wait For Collection To Not Exist].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Data Property]: {{< ref "#data" >}}
+[Wait For Collection To Not Exist]: {{< ref "#wait-for-a-data-storage-collection-to-not-exist" >}}
+[Wait For Missing Key]: {{< ref "#wait-for-a-key-to-exist-in-a-data-storage-collection">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[Deleted]: {{< url path="Cortex.Reference.Blocks.DataStorage.DeleteCollection.DeleteCollectionBlock.MainDoc">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/_index.md
new file mode 100644
index 000000000..b69826477
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wait For Key In Collection"
+linkTitle: "Wait For Key In Collection"
+description: "Wait for changes to a key in a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-be-set-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-be-set-block.md
new file mode 100644
index 000000000..3dbb217fe
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-be-set-block.md
@@ -0,0 +1,227 @@
+---
+title: "Wait For Key In Collection To Be Set"
+linkTitle: "Wait For Key In Collection To Be Set"
+description: "Waits for a key in a collection to be set."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForKeyInCollection_WaitForKeyInCollectionToBeSetBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Key][Key Property] in a [Data Storage Collection][] within a [Collection Scope][Collection Scope Property] to be set to a value and returns the [old][Old Value Property] and [new][New Value Property] values.
+
+## Examples
+
+### Wait for a Key to be set in a Data Storage Collection
+
+This example will wait for a [Key][Key Property] `"user1"` to be set in a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+In this example a separate flow with access to `"users"` has a [Write Data With Key][Write Data With Key] block that will act on `"users"` to update the following key and data:
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "newDomain", "Username": "newUser1", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user1"` | `($)Key` is a variable of type [String][] |
+| [Old Value][Old Value Property] | `($)OldValue`, with no value | `($)OldValue` is a variable of type [dynamic][] |
+| [New Value][New Value Property] | `($)NewValue`, with no value | `($)NewValue` is a variable of type [dynamic][] |
+
+#### Result
+
+Waiting for `"user1"` to be set in the [Data Storage Collection][] results in the execution waiting until the [Key][Key Property] `"user1"` is updated to have any value; see [Write Data With Key][Write Data With Key].
+On the update to the value of `"user1"`, [Old Value][Old Value Property] will have the value `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}`. [New Value][New Value Property] will have the value `{"Domain": "newDomain", "Username": "newUser1", "Password": "encryptedPassword"}`.
+
+***
+
+### Wait for a Key to be set in a Data Storage Collection where the Key does not already exist
+
+This example will wait for a [Key][Key Property] `"user3"` to be set in a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+In this example a separate flow with access to `"users"` has a [Write Data With Key][Write Data With Key] block that will act on `"users"` to add the following key and data:
+|Key | Data |
+-------------|--------------|
+|`"user3"` | `{"Domain": "domain", "Username": "user3", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user3"` | `($)Key` is a variable of type [String][] |
+| [Old Value][Old Value Property] | `($)OldValue`, with no value | `($)OldValue` is a variable of type [dynamic][] |
+| [New Value][New Value Property] | `($)NewValue`, with no value | `($)NewValue` is a variable of type [dynamic][] |
+
+#### Result
+
+Waiting for `"user3"` to be set in the [Data Storage Collection][] results in the execution waiting until the [Key][Key Property] `"user3"` is created; see [Write Data With Key][Write Data With Key].
+On the creation of `"user3"` [Old Value][Old Value Property] will have the value `null`, as the key did not exist before being set to a value.
+[New Value][New Value Property] will have the value `{"Domain": "domain", "Username": "user3", "Password": "encryptedPassword"}`.
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value show below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] containing the [Key][Key Property] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] to wait for.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+### Old Value
+
+The [Old Value][Old Value Property] associated with the key in the [Data Storage Collection][], i.e. before setting a value.
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)OldValue` with no value |
+
+### New Value
+
+The [New Value][New Value Property] associated with the key in the [Data Storage Collection][], i.e. after setting a value. [New Value][New Value Property] can have the same value as [Old Value][Old Value Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)NewValue` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null` |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so waiting for a [Key][Key Property] `"key"` to be set in a [Data Storage Collection][] named `"Collection"` while `"COLLECTION"` already contains a key `"key"` will cause the execution to progress if the [Key][Key Property] `"key"` in the [Collection Scope][Collection Scope Property] is set.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+### Waiting for a Key to Be Set in a Collection That Does Not Exist
+
+Waiting for a key to be set, in a collection that doesn't exist, it is treated the same as when waiting for a key that does not exist to be set; see [Wait for a Key to be set in a Data Storage Collection where the Key does not already exist][Wait For Missing Key].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Data Property]: {{< ref "#data" >}}
+[Wait For Missing Key]: {{< ref
+"#wait-for-a-key-to-be-set-in-a-data-storage-collection-where-the-key-does-not-already-exist">}}
+[Old Value Property]: {{< ref "#old-value" >}}
+[New Value Property]: {{< ref "#new-value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+[Write Data With Key]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Write Data With Key]: {{< url path="Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc" >}}
+[Delete Collection]: {{< url path="Cortex.Reference.Blocks.DataStorage.DeleteCollection.DeleteCollectionBlock.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-contain-value-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-contain-value-block.md
new file mode 100644
index 000000000..3aee09187
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-contain-value-block.md
@@ -0,0 +1,198 @@
+---
+title: "Wait For Key In Collection To Contain Value"
+linkTitle: "Wait For Key In Collection To Contain Value"
+description: "Waits for a key in a collection to contain the specified value."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForKeyInCollection_WaitForKeyInCollectionToContainValueBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a given [Key][Key Property] to contain the specified [Value][Value Property] in a [Data Storage Collection][] within a [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Wait for a Key in a Data Storage Collection to contain Value
+
+This example will wait for a [Key][Key Property] `"user2"` to contain the [Value][Value Property] `{"Domain": "domain", "Username": "admin", "Password": "encryptedPassword"}` in the [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value` with value `{"Domain": "domain", "Username": "admin", "Password": "encryptedPassword"}`.
In this example `($)Value` has been set up using the following [Expression][]:
`new UserCredentials(domain: "domain", username: "admin", password: "encryptedPassword")` | `($)Value` is a variable of type [UserCredentials][] |
+
+#### Result
+
+Waiting for `"user2"` to contain [Value][Value Property] `{"Domain": "domain", "Username": "admin", "Password": "encryptedPassword"}` in the [Data Storage Collection][] results in the execution waiting until the key `"user2"` contains the desired [Value][Value Property]; see [Write Data With Key][Write Data With Key].
+
+***
+
+### Wait for a Key in a Data Storage Collection to contain Value which it already contains
+
+This example will wait for a [Key][Key Property] `"user2"` to contain the [Value][Value Property] `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` in the [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant][] and [System][] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+| [Value][Value Property] | `($)Value` with value `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}`.
In this example `($)Value` has been set up using the following [Expression][]:
`new UserCredentials(domain: "domain", username: "user2", password: "encryptedPassword")` | `($)Value` is a variable of type [UserCredentials][] |
+
+#### Result
+
+Waiting for `"user2"` to contain `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` in the [Data Storage Collection][] results in the execution progressing as the key `"user2"` already contains the desired [Value][Value Property].
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value shown below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] containing the [Key][Key Property] and [Value][Value Property] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] containing the [Value][Value Property] to match.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+### Value
+
+The [Value][Value Property] to match.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Value` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null`. |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so waiting for a [Key][Key Property] `"key"` in a [Data Storage Collection][] named `"Collection"` to contain a [Value][Value Property] while `"COLLECTION"` already contains `"key"` will cause the execution to progress.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+### Waiting For a Key in a Collection That Does Not Exist to Contain a Value
+
+When trying to wait for a [Key][Key Property] to contain a value and the specified [Data Storage Collection][] does not exist, it is treated the same as when a key does not have a matching value; see [Wait for a Key in a Data Storage Collection to contain Value][Waiting For Key Value When Different].
+
+### Waiting For a Key That Does Not Exist in a Collection To Contain a Value
+
+When trying to wait for a [Key][Key Property] that does not exist, in a collection that does exist, to contain a value, it is treated the same as when a key does not have a matching value; see [Wait for a Key in a Data Storage Collection to contain Value][Waiting For Key Value When Different].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Value Property]: {{< ref "#value" >}}
+[Waiting For Key Value When Different]: {{< ref "#wait-for-a-key-in-a-data-storage-collection-to-contain-value">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Write Data With Key]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-exist-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-exist-block.md
new file mode 100644
index 000000000..2cbe8f5ba
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-exist-block.md
@@ -0,0 +1,182 @@
+---
+title: "Wait For Key In Collection To Exist"
+linkTitle: "Wait For Key In Collection To Exist"
+description: "Waits for a key in a collection to exist."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForKeyInCollection_WaitForKeyInCollectionToExistBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Key][Key Property] to exist in a [Data Storage Collection][] within a [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Wait for a Key to exist in a Data Storage Collection
+
+This example will wait for a [Key][Key Property] `"user3"` to exist in a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user3"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Waiting for `"user3"` to exist in the [Data Storage Collection][] results in the execution waiting until `"users"` contains the desired [Key][Key Property]; see [Write Data With Key][Write Data With Key].
+
+### Wait for a Key to exist in a Data Storage Collection where the Key already exists
+
+This example will wait for a [Key][Key Property] `"user2"` to exist in a [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Waiting for `"user2"` to exist in the [Data Storage Collection][] results in the execution progressing as `"users"` already contains the desired [Key][Key Property].
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value show below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] containing the [Key][Key Property] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] to wait for.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null` |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so waiting for a [Key][Key Property] `"key"` to exist in a [Data Storage Collection][] named `"Collection"` while `"COLLECTION"` already contains a key `"key"` will cause the execution to progress.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+### Waiting For a Key to Exist in a Collection That Doesn't Exist
+
+When trying to wait for a key to exist, in a collection that doesn't exist, it is treated the same as when a key does not exist in a collection that does exist; see [Wait for a Key to exist in a Data Storage Collection][Wait For Missing Key].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Data Property]: {{< ref "#data" >}}
+[Wait For Missing Key]: {{< ref
+"#wait-for-a-key-to-exist-in-a-data-storage-collection">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+[Write Data With Key]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+
+[Write Data With Key]: {{< url path="Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc">}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-not-exist-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-not-exist-block.md
new file mode 100644
index 000000000..aab4007de
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/wait-for-key-in-collection/wait-for-key-in-collection-to-not-exist-block.md
@@ -0,0 +1,177 @@
+---
+title: "Wait For Key In Collection To Not Exist"
+linkTitle: "Wait For Key In Collection To Not Exist"
+description: "Waits for a key in a collection to not exist."
+---
+{{< figure src="/blocks/Cortex_Blocks_DataStorage_WaitForKeyInCollection_WaitForKeyInCollectionToNotExistBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Key][Key Property] to not exist in a [Data Storage Collection][] within a [Collection Scope][Collection Scope Property].
+
+## Examples
+
+### Wait for a Key in a Data Storage Collection to not exist
+
+This example will wait for a [Key][Key Property] `"user2"` to exist in the [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Waiting for `"user2"` to not exist in the [Data Storage Collection][] results in the execution waiting until `"users"` does not contain the desired [Key][Key Property]; see [Delete Data With Key][].
+
+***
+
+### Wait for a Key in a Data Storage Collection to not exist where the Key does not already exist
+
+This example will wait for a [Key][Key Property] `"user3"` to exist in the [Data Storage Collection][] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property].
+In this example `"users"` already exists and contains the following keys and data:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]:
`new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user3"` | `($)Key` is a variable of type [String][] |
+
+#### Result
+
+Waiting for `"user3"` to not exist in the [Data Storage Collection][] results in the execution progressing as `"users"` does not contain the desired [Key][Key Property].
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection][] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value shown below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] containing the [Key][Key Property] to wait for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] to wait for.
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null`. |
+
+## Remarks
+
+### Block Timeout
+
+This block has a default [Block Timeout][] of 60 seconds. If the execution waits for longer than 60 seconds the block will throw a [BlockTimeoutException][].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. `"Collection"` is the same as `"collection"`), so trying to wait for a key `"key"` to not exist in a [Data Storage Collection][] named `"Collection"` while `"COLLECTION"` already exists would wait for `"key"` to not exist in the [Data Storage Collection][] `"COLLECTION"`.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+### Waiting For a Key in a Collection That Does Not Exist
+
+When trying to wait for a [Key][Key Property] contained in a collection that does not exist, it is treated the same as when a key does not exist in a collection; see [Wait for a Key in a Data Storage Collection to not exist where the Key does not already exist][Wait For Key To Not Exist].
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Wait For Key To Not Exist]: {{< ref "#wait-for-a-key-in-a-data-storage-collection-to-not-exist-where-the-key-does-not-already-exist" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+[Block Timeout]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.BlockTimeoutProperty" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Delete Data With Key]: {{< url path = "Cortex.Reference.Blocks.DataStorage.DeleteData.DeleteDataWithKeyBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/_index.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/_index.md
new file mode 100644
index 000000000..1d223db89
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Write Data"
+linkTitle: "Write Data"
+description: "Write data to a data storage collection."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/write-data-with-key-block.md b/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/write-data-with-key-block.md
new file mode 100644
index 000000000..bd7c4c30e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data-storage/write-data/write-data-with-key-block.md
@@ -0,0 +1,209 @@
+---
+title: "Write Data With Key"
+linkTitle: "Write Data With Key"
+description: "Writes data to a data storage collection with the specified key."
+---
+{{}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Writes [Data][Data Property] to a [Data Storage Collection][] with the specified [Key][Key Property].
+
+## Examples
+
+### Write to a Data Storage Collection
+
+This example will attempt to write [Data][Data Property] to a [Data Storage Collection] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following [Keys][Key Property] and [Data][Data Property]:
+
+ |Key | Data |
+-------------|--------------|
+ |`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+
+The example will write the [Data][Data Property] `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` of type [UserCredentials][] with the [Key][Key Property] `"user2"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+| [Data][Data Property] | `($)Data` with value `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}`.
In this example `($)Data` has been set up using the following [Expression][] `new UserCredentials(domain: "domain", username: "user2", password: "encryptedPassword")` | `($)Data` is a variable of type [UserCredentials][] |
+
+#### Result
+
+This writes the [Data][Data Property] `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` with the [Key][Key Property] `"user2"` to the [Data Storage Collection][] named `"users"` as shown below:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+***
+
+### Write to a Data Storage Collection with a Key that already exists
+
+This example will attempt to write [Data][Data Property] to a [Data Storage Collection] named `"users"` that is only accessible by flows that are scoped to the same [Tenant] and [System] specified by the [Collection Scope][Collection Scope Property]. In this example `"users"` already exists and contains the following [Keys][Key Property] and [Data][Data Property]:
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "user2", "Password": "encryptedPassword"}` |
+
+The example will write the [Data][Data Property] `{"Domain": "domain", "Username": "new user2", "Password": "encryptedPassword"}` of type [UserCredentials][] with the [Key][Key Property] `"user2"`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection Scope][Collection Scope Property] | `($)Scope` with value `{"Tenant": "ScopeOption.Current", "System": "ScopeOption.Current", "Package": "ScopeOption.All", "Flow": "ScopeOption.All"}`.
In this example `($)Scope` has been set up using the following [Expression][]: `new ScopeDefinition(tenant: ScopeOption.Current, system: ScopeOption.Current, package: ScopeOption.All, flow: ScopeOption.All)`| `($)Scope` is a variable of type [ScopeDefinition][] |
+| [Collection Name][Collection Name Property] | `($)CollectionName` with value `"users"` | `($)CollectionName` is a variable of type [String][] |
+| [Key][Key Property] | `($)Key` with value `"user2"` | `($)Key` is a variable of type [String][] |
+| [Data][Data Property] | `($)Data` with value `{"Domain": "domain", "Username": "new user2", "Password": "encryptedPassword"}`.
In this example `($)Data` has been set up using the following [Expression][] `new UserCredentials(domain: "domain", username: "new user2", password: "encryptedPassword")` | `($)Data` is a variable of type [UserCredentials][] |
+
+#### Result
+
+This example will update the [Data][Data Property] stored to [Key][Key Property] `"user2"` to `{"Domain": "domain", "Username": "new user2", "Password": "encryptedPassword"}` of type [UserCredentials][] in the [Data Storage Collection][] named `"users"` as shown below.
+
+|Key | Data |
+-------------|--------------|
+|`"user1"` | `{"Domain": "domain", "Username": "user1", "Password": "encryptedPassword"}` |
+|`"user2"` | `{"Domain": "domain", "Username": "new user2", "Password": "encryptedPassword"}` |
+
+***
+
+## Properties
+
+### Collection Scope
+
+The [Collection Scope][Collection Scope Property] containing the [Data Storage Collection][] to write to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ScopeDefinition] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Collection Scope][Collection Scope Property] with value show below |
+
+```json
+{
+ "Tenant": "ScopeOption.Current",
+ "System": "ScopeOption.Current",
+ "Package": "ScopeOption.Current",
+ "Flow": "ScopeOption.All"
+}
+
+```
+
+### Collection Name
+
+The name of the [Data Storage Collection][] to write to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CollectionName` with no value |
+
+### Key
+
+The [Key][Key Property] to add the [Data][Data Property] with.
+
+The [Key][Key Property] can't be `null` and must be unique within each [Data Storage Collection][].
+
+For more information about what a key is, please see [Keys].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Key` with no value |
+
+### Data
+
+The [Data][Data Property] to be added to the [Data Storage Collection][] with the specified [Key][Key Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Data` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Tenant][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [System][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Package][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| | Thrown when [Flow][] is not one of the specified [ScopeOption][] types (e.g. `(ScopeOption)100`). |
+| [DataStorageCollectionNotFoundException][] | Thrown when the [Collection Name][Collection Name Property] can not be found within the specified [Collection Scope][Collection Scope property].
+| [PropertyEmptyException][] | Thrown when the [Collection Name][Collection Name Property] is empty (i.e. `""`).|
+| [PropertyNullException][] | Thrown when the [Collection Scope][Collection Scope Property] is `null`. |
+| | Thrown when the [Collection Name][Collection Name Property] is `null`. |
+| | Thrown when the [Key][Key Property] is `null` |
+| [ServiceDoesNotExistException][] | Thrown when the [Data Storage Service][] does not exist. |
+| [ServiceUnavailableException][] | Thrown when the [Data Storage Service][] is not healthy. |
+
+## Remarks
+
+### Writing With a Key That Already Exists
+
+When trying to write to a key that already exists in the [Data Storage Collection][] provided, the value of the key is overwritten; see example [Write to a Data Storage Collection with a Key that Already Exists][Write Existing Key].
+
+### Case Sensitivity
+
+[Collection Name][Collection Name Property] is case insensitive (e.g. 'Collection' is the same as 'collection'), so trying to write to a [Data Storage Collection] named `"Collection"` while `"COLLECTION"` already exists would write to `"COLLECTION"`.
+
+[Key][Key Property] is case sensitive (e.g. `"user"` is not the same as `"USER"`).
+
+[Collection Scope Property]: {{< ref "#collection-scope" >}}
+[Collection Name Property]: {{< ref "#collection-name" >}}
+[Key Property]: {{< ref "#key" >}}
+[Data Property]: {{< ref "#data" >}}
+[Write Existing Key]: {{< ref "#write-to-a-data-storage-collection-with-a-key-that-already-exists">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ScopeDefinition]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+[ScopeOption]: {{< url path ="Cortex.Reference.DataTypes.Scopes.ScopeOption.MainDoc">}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant">}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System">}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package">}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow">}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ServiceDoesNotExistException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceDoesNotExistException.MainDoc">}}
+[ServiceUnavailableException]: {{< url path = "Cortex.Reference.Exceptions.Services.ServiceUnavailableException.MainDoc">}}
+[DataStorageCollectionNotFoundException]: {{< url path = "Cortex.Reference.Exceptions.DataStorage.DataStorageCollectionNotFoundException.MainDoc">}}
+
+[Data Storage Collection]: {{< url path = "Cortex.Reference.Concepts.WorkingWith.Collections.WhatIsACollection.DataStorage">}}
+[Data Storage Service]: {{< url path = "Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc">}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc">}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/data/_index.md b/content/en/docs/2026.3/Reference/Blocks/data/_index.md
new file mode 100644
index 000000000..fb99deffc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Data"
+linkTitle: "Data"
+description: "Blocks related to working with data sources."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/_index.md b/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/_index.md
new file mode 100644
index 000000000..4d20fea6d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute Data Command"
+linkTitle: "Execute Data Command"
+description: "Blocks related to executing commands against data sources."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/execute-data-command-block-1.md b/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/execute-data-command-block-1.md
new file mode 100644
index 000000000..4a8292d48
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/data/execute-data-command/execute-data-command-block-1.md
@@ -0,0 +1,806 @@
+---
+title: "Execute Data Command"
+linkTitle: "Execute Data Command"
+description: "Connects to a specific data source and executes a Command, returning any object from the Command's result."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Data_ExecuteDataCommand_ExecuteDataCommandBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Connects to a data source (e.g. SQL Server) using the specified [Connection Details][Connection Details Property], and executes a [Command][Command Property] (e.g. `SELECT * FROM Table`), returning the [Result][Result Property].
+
+[Close Connection][Close Connection Property] can be specified to choose whether the connection to the data source is closed or is kept open for use on subsequent Execute Command blocks.
+
+## Examples
+
+### Selecting Rows
+
+This example will select all rows and columns from a connected SQL Server data source which have an Id less than 3, saving the rows to the [Result][Result Property].
+
+A [QueryCommand][Command Types QueryCommand] is used throughout this example to select data from the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "SELECT * FROM Table WHERE Id < @SelectParameter", "Parameters": {"SelectParameter": 3}}`
In this example `($)Command` has been set using the following [Expression][]:
`new QueryCommand("SELECT * FROM Table WHERE Id < @SelectParameter", new {SelectParameter = 3})` | `($)Command` is a variable of type [QueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Selecting all rows and columns that have an Id less than 3 from `Table` using a [QueryCommand][Command Types QueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+[
+ {
+ "Id": 1,
+ "FirstColumn": "FirstColumn1",
+ "SecondColumn": "SecondColumn1"
+ },
+ {
+ "Id": 2,
+ "FirstColumn": "FirstColumn2",
+ "SecondColumn": "SecondColumn2"
+ }
+]
+```
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][]. For an example of a non parameterised command please see [Executing Multiple Commands (Unsafe)][]
+
+***
+
+### Inserting Rows
+
+This example will insert a new row into a connected SQL Server data source, saving the number of rows inserted to the [Result][Result Property].
+
+A [NonQueryCommand][Command Types NonQueryCommand] is used throughout this example to insert data into the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2)", "Parameters": { "InsertParameter1": \"FirstColumn4\", "InsertParameter2": \"SecondColumn4\" } }`
In this example `($)Command` has been set using the following [Expression][]:
`new NonQueryCommand("INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2)", new { InsertParameter1 = "FirstColumn4", InsertParameter2 = "SecondColumn4" })` | `($)Command` is a variable of type [NonQueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Inserting a new row into `Table` using a parameterised [NonQueryCommand][Command Types NonQueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+1
+```
+
+This indicates that 1 row has been inserted into `Table`, with `Table` being updated to:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+| `4` | `"FirstColumn4"` | `"SecondColumn4"` |
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][]. For an example of a non parameterised command please see [Executing Multiple Commands (Unsafe)][]
+
+***
+
+### Updating Rows
+
+This example will update all rows on a connected SQL Server data source which have an Id less than `3`, saving the number of rows updated to the [Result][Result Property].
+
+A [NonQueryCommand][Command Types NonQueryCommand] is used throughout this example to update data in the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter", "Parameters": { "UpdateParameter": 3 } }`
In this example `($)Command` has been set using the following [Expression][]:
`new NonQueryCommand("UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter", new {UpdateParameter = 3})` | `($)Command` is a variable of type [NonQueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Updating all rows that have an Id less than `3` in `Table` using a [NonQueryCommand][Command Types NonQueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+2
+```
+
+This indicates that 2 rows have been updated in `Table`, with `Table` being updated to:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"Updated"` | `"SecondColumn1"` |
+| `2` | `"Updated"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][]. For an example of a non parameterised command please see [Executing Multiple Commands (Unsafe)][]
+
+***
+
+### Deleting Rows
+
+This example will delete all rows on a connected SQL Server data source which have an Id less than `3`, saving the number of rows deleted to the [Result][Result Property].
+
+A [NonQueryCommand][Command Types NonQueryCommand] is used throughout this example to delete data in the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "DELETE FROM Table WHERE Id < @DeleteParameter", "Parameters": { "DeleteParameter": 3 } }`
In this example `($)Command` has been set using the following [Expression][]:
`new NonQueryCommand("DELETE FROM Table WHERE Id < @DeleteParameter", new {DeleteParameter = 3})` | `($)Command` is a variable of type [NonQueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Deleting all rows that have an Id less than `3` in `Table` using a [NonQueryCommand][Command Types NonQueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+2
+```
+
+This indicates that 2 rows have been deleted in `Table`, with `Table` being updated to:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][]. For an example of a non parameterised command please see [Executing Multiple Commands (Unsafe)][]
+
+***
+
+### Using Functions
+
+This example will select the maximum Id value from a connected SQL Server data source, saving the value of the function to the [Result][Result Property].
+
+A [QueryCommand][Command Types QueryCommand] is used throughout this example to select the maximum Id value from the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "SELECT Max(Id) FROM Table", "Parameters": null}`
In this example `($)Command` has been set using the following [Expression][]:
`new QueryCommand("SELECT Max(Id) FROM Table", null)` | `($)Command` is a variable of type [QueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Selecting the maximum Id value from `Table` using a [QueryCommand][Command Types QueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+[
+ {
+ "": 3
+ }
+]
+```
+
+Note that the `AS` keyword can be used to give aliases to results, for example the CommandText `"SELECT Max(Id) AS MaxId FROM Table;"` would have resulted in the variable `($)Result` being updated to `[ { "MaxId": 3 } ]`; the `AS` keyword also allows for [Using Multiple Functions][].
+
+***
+
+### Using Multiple Functions
+
+This example will select the maximum Id value as MaxId and the minimum Id value as MinId from a connected SQL Server data source, saving the values of the functions to the [Result][Result Property].
+
+A [QueryCommand][Command Types QueryCommand] is used throughout this example to select the maximum Id value as MaxId and the minimum Id value as MinId from the data source, however, both an [Command][Command Types Command] or [Commands][Command Types Commands] could also be used to the same effect.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "SELECT Max(Id) AS MaxId, Min(Id) AS MinId FROM Table", "Parameters": null}`
In this example `($)Command` has been set using the following [Expression][]:
`new QueryCommand("SELECT Max(Id) AS MaxId, Min(Id) AS MinId FROM Table", null)` | `($)Command` is a variable of type [QueryCommand][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Selecting the maximum Id value as MaxId and the minimum Id value as MinId from `Table` using a [QueryCommand][Command Types QueryCommand] results in the variable `($)Result` being updated to the following:
+
+```json
+[
+ {
+ "MaxId": 3,
+ "MinId": 1
+ }
+]
+```
+
+***
+
+### Executing Multiple Commands (Safe)
+
+This example will select, insert, update and delete from a connected SQL Server data source, using a parameterised command. The result of each command will be saved to the result.
+
+An [Commands][Command Types Commands] is used throughout this example, as it is the only type of [Command][Command Property] that allows you to execute and return the results of multiple commands.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "SELECT * FROM Table WHERE Id < @SelectParameter; INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2); UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter; DELETE FROM Table WHERE Id < @DeleteParameter; SELECT * FROM Table", "Parameters": { "SelectParameter": 3, InsertParameter1 = \"FirstColumn4\", InsertParameter2 = \"SecondColumn4\", "UpdateParameter": 3, "DeleteParameter": 3 }}`
In this example `($)Command` has been set using the following [Expression][]:
`new Commands("SELECT * FROM Table WHERE Id < @SelectParameter; INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2); UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter; DELETE FROM Table WHERE Id < @DeleteParameter; SELECT * FROM Table", new {SelectParameter = 3, InsertParameter1 = "FirstColumn4", InsertParameter2 = "SecondColumn4", UpdateParameter = 3, DeleteParameter = 3})` | `($)Command` is a variable of type [Commands][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Running the [Commands][Command Types Commands] results in the variable `($)Result` being updated to the following:
+
+```json
+[
+ [
+ {
+ "Id": 1,
+ "FirstColumn": "FirstColumn1",
+ "SecondColumn": "SecondColumn1"
+ },
+ {
+ "Id": 2,
+ "FirstColumn": "FirstColumn2",
+ "SecondColumn": "SecondColumn2"
+ }
+ ],
+ 1,
+ 2,
+ 2,
+ [
+ {
+ "Id": 3,
+ "FirstColumn": "FirstColumn3",
+ "SecondColumn": "SecondColumn3"
+ },
+ {
+ "Id": 4,
+ "FirstColumn": "FirstColumn4",
+ "SecondColumn": "SecondColumn4"
+ }
+ ]
+]
+```
+
+- The first item of `($)Result` represents the rows selected by the first select statement (`SELECT * FROM Table WHERE Id < @SelectParameter`).
+- The second item of `($)Result` indicates that 1 row has been inserted into `Table` (`INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2)`).
+- The third item of `($)Result` indicates that 2 rows have been updated in `Table` (`UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter`).
+- The fourth item of `($)Result` indicates that 2 rows have been deleted in `Table` (`DELETE FROM Table WHERE Id < @DeleteParameter`).
+- The fifth item of `($)Result` represents the rows selected by the second select statement (`SELECT * FROM Table`).
+
+`Table` has been updated to:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+| `4` | `"FirstColumn4"` | `"SecondColumn4"` |
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][]. For an example of a non parameterised command please see [Executing Multiple Commands (Unsafe)][]
+
+***
+
+### Executing Multiple Commands (Unsafe)
+
+This example will select, insert, update and delete from a connected SQL Server data source, using [String Interpolation][] instead of parameters. The result of each command will be saved to the result.
+
+{{% alert title="Warning" color="warning" %}}
+This example inserts data directly into the [Command](#command) instead of using parameters. This means the SQL in this example is susceptible to [SQL Injection](https://www.w3schools.com/sql/sql_injection.asp) and it is advised to use parameters to insert data into a command instead.
+
+Please see [Executing Multiple Commands (Safe)](#executing-multiple-commands-safe) for an example of a [Parameterised Command](#parameterised-commands).
+{{% /alert %}}
+
+An [Commands][Command Types Commands] is used throughout this example, as it is the only type of [Command][Command Property] that allows you to execute and return the results of multiple commands.
+
+The data source contains a `Table` with the following rows and columns before the command is executed:
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `1` | `"FirstColumn1"` | `"SecondColumn1"` |
+| `2` | `"FirstColumn2"` | `"SecondColumn2"` |
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+
+In this example assume the following variables have been set before the command has been executed:
+
+- `($)SelectParameter` with the value `3`
+- `($)InsertParameter1` with the value `"FirstColumn4"`
+- `($)InsertParameter2` with the value `"SecondColumn4"`
+- `($)UpdateParameter` with the value `3`
+- `($)DeleteParameter` with the value `3`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command`, with value `{"CommandText": "SELECT * FROM Table WHERE Id < 3; INSERT INTO Table (FirstColumn, SecondColumn) VALUES (\"FirstColumn1\", \"SecondColumn2\"); UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < 3; DELETE FROM Table WHERE Id < 3; SELECT * FROM Table", "Parameters": null}`
In this example `($)Command` has been set using the following [Expression][]:
`new Commands($"SELECT * FROM Table WHERE Id < {($)SelectParameter}; INSERT INTO Table (FirstColumn, SecondColumn) VALUES ({($)InsertParameter1}, {($)InsertParameter2}); UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < {($)UpdateParameter}; DELETE FROM Table WHERE Id < {($)DeleteParameter}; SELECT * FROM Table", null)` | `($)Command` is a variable of type [Commands][] |
+| [Connection Details][Connection Details Property] | `($)ConnectionDetails`, with value `{"ConnectionString": "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;"}` | `($)ConnectionDetails` is a variable of type [SqlServerConnectionDetails][] |
+| [Close Connection][Close Connection Property] | `($)CloseConnection`, with value `true` | `($)CloseConnection` is a variable of type [Boolean][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` will be set to the type [dynamic][] |
+
+#### Result
+
+Running the [Commands][Command Types Commands] results in the variable `($)Result` being updated to the following:
+
+```json
+[
+ [
+ {
+ "Id": 1,
+ "FirstColumn": "FirstColumn1",
+ "SecondColumn": "SecondColumn1"
+ },
+ {
+ "Id": 2,
+ "FirstColumn": "FirstColumn2",
+ "SecondColumn": "SecondColumn2"
+ }
+ ],
+ 1,
+ 2,
+ 2,
+ [
+ {
+ "Id": 3,
+ "FirstColumn": "FirstColumn3",
+ "SecondColumn": "SecondColumn3"
+ },
+ {
+ "Id": 4,
+ "FirstColumn": "FirstColumn4",
+ "SecondColumn": "SecondColumn4"
+ }
+ ]
+]
+```
+
+- The first item of `($)Result` represents the rows selected by the first select statement (`SELECT * FROM Table WHERE Id < @SelectParameter`).
+- The second item of `($)Result` indicates that 1 row has been inserted into `Table` (`INSERT INTO Table (FirstColumn, SecondColumn) VALUES (@InsertParameter1, @InsertParameter2)`).
+- The third item of `($)Result` indicates that 2 rows have been updated in `Table` (`UPDATE Table SET FirstColumn = \"Updated\" WHERE Id < @UpdateParameter`).
+- The fourth item of `($)Result` indicates that 2 rows have been deleted in `Table` (`DELETE FROM Table WHERE Id < @DeleteParameter`).
+- The fifth item of `($)Result` represents the rows selected by the second select statement (`SELECT * FROM Table`).
+
+`Table` has been updated to:
+
+| Id | FirstColumn | SecondColumn |
+|----|-------------|--------------|
+| `3` | `"FirstColumn3"` | `"SecondColumn3"` |
+| `4` | `"FirstColumn4"` | `"SecondColumn4"` |
+
+Note that using a [Parameterised Command][Parameterised Commands] helps prevent against [SQL Injection][], for more information please see [Parameterised Commands][].
+
+***
+
+## Properties
+
+### Command
+
+The [Command][Command Property] executed on the connected data source. There are multiple [Command Types][] that can be used, each with a different purpose:
+
+- [Command][Command Types Command]: Parses a single statement provided in the commandText, determining how the statement should be executed against the data source. If the commandText is a [Query Statement][Query Statements] the rows retrieved from the data source will be returned, otherwise if the commandText is a [Non Query Statement][Non Query Statements] the number of rows affected will be returned.
+- [Commands][Command Types Commands]: Parses single or multiple statements provided in the commandText, determining how each statement should be executed against the data source. If a [Query Statement][Query Statements] is executed rows retrieved from the data source are added as an entry of the result, If a [Non Query Statement][Non Query Statements] is executed the number of rows affected is added as an entry of the result.
+- [QueryCommand][Command Types QueryCommand]: Executes the given commandText as a [Query Statement][Query Statements], returning the rows retrieved from the data source.
+- [NonQueryCommand][Command Types NonQueryCommand]: Executes the given commandText as a [Non Query Statement][Non Query Statements], returning the number of rows affected from the data source.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DataCommand][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Command][Command Types Command] with value `{"CommandText": "", "Parameters": null}` |
+
+### Connection Details
+
+The [Connection Details][Connection Details Property] object that includes all of the information required to connect to a data source, including:
+
+- [Connection String][Connection Strings] - must be provided in order to connect to a data source. The [Connection String][Connection Strings] is formatted differently depending on the type of data source that is being connected to, please see [Working with Data Sources][] for more information.
+
+For a list of currently supported connection details, please see [ConnectionDetails][]
+
+Note it is recommended to use a [Variable][] for [Connection Details][Connection Details Property] when it will be used across multiple Execute Command blocks, as using a variable will allow for reuse of the same connection. Using a [Literal][] to set the Connection Details will cause the connection to only be used once.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ConnectionDetails][]|
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [SqlServerConnectionDetails][] with value `{"ConnectionString": "Server=localhost;Database=YourDatabase;Trusted_Connection=true;"}` |
+
+### Close Connection
+
+[Close Connection][Close Connection Property] can be specified to choose whether the connection to the data source is closed or is kept open for use on subsequent Execute Command blocks, this defaults to `false` if left blank, please see [Closing Connections][] for more information.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+### Result
+
+The object returned from the data source.
+
+Depending on the type of [Command][Command Property], the data returned within the [Result][Result Property] will vary. Please see [Command Types][] for more information on what data will be returned by each type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][Variable Editor] |
+| Default Value | `($)Result` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when the [Command][Command Property] is null. |
+| | Thrown when the commandText within the [Command][Command Property] is null. |
+| | Thrown when the [Connection Details][Connection Details Property] is null. |
+| | Thrown when the connectionString within the [Connection Details][Connection Details Property] is null. |
+| [PropertyEmptyException][] | Thrown when the commandText within the [Command][Command Property] is empty. |
+| | Thrown when the connectionString within the [Connection Details][Connection Details Property] is empty. |
+| [InvalidConnectionStringException][] | Thrown when an invalid connection string has been supplied (e.g. The connection string contains an invalid argument `"NotAnArgument = False"`). |
+| | Thrown when a required connection string argument has not been supplied (e.g. The server requires encryption and the connection string contains `"Encrypt=False"`). |
+| [CommandException][] | Thrown when the data source was not found or was not accessible. |
+| | Thrown when an error occurs whilst trying to open a new connection. |
+| | Thrown when a connection is successfully established but an error occurred during the login process. |
+| | Thrown when the [Command][Command Property] contains syntax errors. The error will contain either a nested [SqlException][] with a corresponding [SqlException Error Code][SqlException Error Codes], or a nested [ParserException][] (Oracle Only). |
+| | Thrown when the [Command][Command Property] is invalid for the table specified. |
+| | Thrown when the [Command][Command Property] references a non-existent stored procedure. |
+| | Thrown when parameters derives from [Array][] or [IEnumerable][] when a [Query Statement][Query Statements] is executed. |
+| | Thrown when an [Command][] contains multiple statements. |
+| | Thrown when a [Command][] or [Commands][] contains an [OracleBlockStatement][] statements. (Oracle Only)|
+
+## Remarks
+
+### Command Types
+
+There are multiple types of [Command][Command Property] that can be used, each with a different purpose:
+
+#### Command
+
+A [Command][] parses a single statement provided in the [commandText][Command.CommandText], determining how the statement should be executed against the data source. If the [commandText][Command.CommandText] is a [Query Statement][Query Statements] the rows retrieved from the data source will be returned, otherwise if the [commandText][Command.CommandText] is a [Non Query Statement][Non Query Statements] the number of rows affected will be returned.
+
+For a [Query Statement][Query Statements] (e.g. select and execute):
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| [List][]<[Structure][]> with a single item | Single item is returned |
+| [List][]<[Structure][]> with many items | Many items are returned |
+| [List][]<[Structure][]> with no items | No items are returned |
+
+For a [Non Query Statement][Non Query Statements] (e.g. insert, update, delete, etc)
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| [Int32][] with a value of `1` | Single row is affected |
+| [Int32][] with a value greater than `1` | Many rows are affected |
+| [Int32][] with a value of `0` | No rows are affected |
+
+If multiple statements are provided in [CommandText][Command.CommandText], the block will throw a [CommandException][] as this type can only run single statements.
+
+If performance is a key consideration it is recommended to use a [QueryCommand][Command Types QueryCommand] or [NonQueryCommand][Command Types NonQueryCommand] instead of [Command][] as they do not parse the [commandText][Command.CommandText].
+
+#### Commands
+
+A [Commands][] parses single or multiple statements provided in the [commandText][Commands.CommandText], determining how each statement should be executed against the data source. If a [Query Statement][Query Statements] is executed rows retrieved from the data source are added as an entry of the result, If a [Non Query Statement][Non Query Statements] is executed the number of rows affected is added as an entry of the result.
+
+For each [Query Statement][Query Statements] (e.g. select and execute):
+
+| [Result][Result Property] will have the following entry added | when |
+|-|-|
+| [List][]<[Structure][]> with a single item | Single item is returned |
+| [List][]<[Structure][]> with many items | Many items are returned |
+| [List][]<[Structure][]> with no items | No items are returned |
+
+For each [Non Query Statement][Non Query Statements] (e.g. insert, update, delete, etc)
+
+| [Result][Result Property] will have the following entry added | when |
+|-|-|
+| [Int32][] with a value of `1` | Single row is affected |
+| [Int32][] with a value greater than `1` | Many rows are affected |
+| [Int32][] with a value of `0` | No rows are affected |
+
+If performance is a key consideration it is recommended to use a [QueryCommand][Command Types QueryCommand] or [NonQueryCommand][Command Types NonQueryCommand] instead of [Commands][] as they do not parse the [commandText][Commands.CommandText].
+
+Note that the [Commands][] should not be used for commands that have dependency between their statements (e.g. Cursors and Variables). Please see [Complex Commands][] for more information on how to deal with these.
+
+#### QueryCommand
+
+A [QueryCommand][] executes the given [commandText][QueryCommand.CommandText] as a [Query Statement][Query Statements], returning the rows retrieved from the data source. If the [commandText][QueryCommand.CommandText] contains multiple select statements, only the results of the first [Query Statement][Query Statements] will be returned.
+
+For a [Query Statement][Query Statements] (e.g. select):
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| [List][]<[Structure][]> with a single item | Single item is returned |
+| [List][]<[Structure][]> with many items | Many items are returned |
+| [List][]<[Structure][]> with no items | No items are returned |
+
+For a [Non Query Statement][Non Query Statements] (e.g. insert, update, delete, etc)
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| `[]` | always, as [Non Query Statements][] do not return data |
+
+Note use a [QueryCommand][] for commands that have dependency between their statements (e.g. Cursors and Variables) and return data from the data source. Please see [Complex Commands][] for more information.
+
+#### NonQueryCommand
+
+A [NonQueryCommand][] executes the given [commandText][NonQueryCommand.CommandText] as a [Non Query Statement][Non Query Statements], returning the number of rows affected from the data source. If the command contains multiple statements, the sum of all the results will be returned.
+
+For a [Query Statement][Query Statements] (e.g. select):
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| [Int32][] with a value of `-1` | always, as [Query Statements][] do not return data |
+
+For a [Non Query Statement][Non Query Statements] (e.g. insert, update, delete, etc)
+
+| [Result][Result Property] will be set to | when |
+|-|-|
+| [Int32][] with a value of `1` | Single row is affected |
+| [Int32][] with a value greater than `1` | Many rows are affected |
+| [Int32][] with a value of `0` | No rows are affected |
+
+Note use a [NonQueryCommand][] for commands that have dependency between their statements (e.g. Cursors and Variables) and return the number of rows affected. Please see [Complex Commands][] for more information.
+
+### Statement Types
+
+There are two categories of statements [Query][Query Statements] and [Non Query][Non Query Statements].
+
+#### Query Statements
+
+Query Statements are used to retrieve data from a data source, for example selecting all rows from a table in a database, Query Statements return the data selected by the Statement as a [List][]<[Structure][]> when used in an [Command][Command Types Command], an [Commands][Command Types Commands], or a [QueryCommand][Command Types QueryCommand]. If a Query Statement is used in a [NonQueryCommand][Command Types NonQueryCommand] `-1` will be returned as Query Statements do not affect rows.
+
+Examples of Query Statements can be found here:
+
+- [Selecting Rows][]
+- [Using Functions][]
+- [Using Multiple Functions][]
+- [Executing Multiple Commands (Safe)][]
+- [Executing Multiple Commands (Unsafe)][]
+
+A Query Statement can use any object as a parameter. Objects that derive from [Array][] or [IEnumerable][] can only be used for clauses that accept list values (e.g. `IN`, `ANY`, `ALL`), if they are used in other clauses the block will throw a [CommandException][].
+
+#### Non Query Statements
+
+Non Query Statements are used to manipulate the data within a data source, for example deleting all rows from a table in a database, Non Query Statements return the number of rows affected by the Statement as an [Int32][] value when used in an [Command][Command Types Command], an [Commands][Command Types Commands], or a [NonQueryCommand][Command Types NonQueryCommand]. If a Non Query Statement is used in a [QueryCommand][Command Types QueryCommand] `null` will be returned as Non Query Statements do not return data.
+
+Examples of Non Query Statements can be found here:
+
+- [Inserting Rows][]
+- [Updating Rows][]
+- [Deleting Rows][]
+- [Executing Multiple Commands (Safe)][]
+- [Executing Multiple Commands (Unsafe)][]
+
+A Non Query Statement can use any object as a parameter. If an object that derives from [Array][] or [IEnumerable][] is used, the Non Query Statement will be executed for each item in the [Array][] or [IEnumerable][] and the sum of all the results will be returned.
+
+### Parameterised Commands
+
+It is recommended to always use parameterised commands as they prevent [SQL Injection][] attacks by ensuring the parameters are sanitised before the [Command][Command Property] is executed.
+
+The `@` symbol denotes a parameter within the [CommandText][DataCommand.CommandText] (e.g. `"SELECT * FROM Table WHERE Name = @Parameter"`). An example of using parameters can be found in [Executing Multiple Commands (Safe)][], whereas, an example of inserting variables into a statement without parameters can be found in [Executing Multiple Commands (Unsafe)][]
+
+[Query Statements][] can use any object as a parameter. Objects that derive from [Array][] or [IEnumerable][] can only be used for clauses that accept list values (e.g. `IN`, `ANY`, `ALL`), if they are used in other clauses the block will throw a [CommandException][].
+
+[Non Query Statements][] can use any object as a parameter. If an object that derives from [Array][] or [IEnumerable][] is used, the Non Query Statement will be executed for each item in the [Array][] or [IEnumerable][] and the sum of all the results will be returned.
+
+For both [Query Statements][] and [Non Query Statements][], an SqlException is thrown if a parameter is missing from the [Command][Command Property] and the [CommandText][DataCommand.CommandText] contains a parameter (e.g. `{"CommandText": "SELECT * FROM Table WHERE Name = @Parameter", "Parameters": {"IncorrectParameter": 0}}`).
+
+### Complex Commands
+
+Complex commands (e.g. Cursors and Variables) that contain dependency between their statements cannot be used with [Commands][Command Types Commands], as the parsing performed by the block will cause each statement of [CommandText][DataCommand.CommandText] to be run individually instead of running the [CommandText][DataCommand.CommandText] as a whole.
+
+For statements with this type of dependency use either [QueryCommand][Command Types QueryCommand] or [NonQueryCommand][Command Types NonQueryCommand], depending on whether data from the data source or the number of rows affected is returned.
+
+### Connection Strings
+
+A connection string must be provided within the [Connection Details][Connection Details Property] in order to connect to a data source. The connection string is formatted differently depending on the type of data source, please see [Working with Data Sources][] for more information.
+
+Please see [Working with Data Sources][] for a list of supported data sources and how to construct valid connection strings for them.
+
+### Opening Connections
+
+The Execute Command block automatically handles creating and opening connections for the specified [Connection Details][Connection Details Property] using the following rules:
+
+- If a connection does not exist, a new connection will be created, opened and used when the block runs.
+- If a connection already exists but is closed, the connection will be opened and used when the block runs.
+- If a connection already exists and is open, the connection will used the block runs.
+
+If a [Variable][] is used to pass in the [Connection Details][Connection Details Property] it can be used to keep the connection alive across multiple Execute Command blocks as long as [Close Connection][Close Connection Property] is set to `false`. Keeping the connection open helps increase the performance of the block due to the subsequent blocks not having to spend resources creating and opening connections for each execution.
+
+If a [Literal][] or an [Expression][] is used to create the [Connection Details][Connection Details Property] a new connection will always be made when the Execute Command block runs and if [Close Connection][Close Connection Property] is set to `false` the connection will be closed automatically at some point after the block finishes and before the flow ends.
+
+For information on how to explicitly close a connection, please see [Closing Connections][].
+
+### Closing Connections
+
+Connections can be explicitly closed by setting [Close Connection][Close Connection Property] to `true`. This causes the connection to be closed after the [Command][Command Property] has been executed.
+
+If a [Variable][] is used to pass in the [Connection Details][Connection Details Property] and [Close Connection][Close Connection Property] is set to `false` the connection will be closed when the [Variable][] goes out of scope or the flow ends, whichever happens first. For more information about variables and scope, please see [Variables][].
+
+If a [Literal][] or an [Expression][] is used to create the [Connection Details][Connection Details Property] and [Close Connection][Close Connection Property] is set to `false` the connection will be closed automatically at some point after the Execute Command block finishes and before the flow ends.
+
+For information on how to open a connection, please see [Opening Connections][].
+
+### Why does the Result property return a dynamic data type?
+
+The decision for the [Result][Result Property] to return a [dynamic data type][dynamic] rather than a specific type, was to avoid users having to [cast][Object Casting] the [Result][Result Property] to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Result][Result Property] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the [Result][Result Property] to its correct type.
+
+### RunAs
+
+RunAs can be used to connect to a database as a Windows user, rather than a SQL user.
+
+To connect as a Windows user:
+- An appropriate connection string (e.g. [Oracle][OracleConnectionStringIntegratedSecurity], [SQL Server][SqlConnectionStringTrustedConnection]) must be specified in the [Connection Details][Connection Details Property].
+- [UserCredentials][] for the Windows user must be specified in the [Run As property][RunAsProperty].
+
+If connecting to a local database, the [UserCredentials][] must specify the [LogonType][] to be `LogonType.Network`; if connecting to a remote database, the [LogonType][] must be `LogonType.NewCredentials`.
+
+### Known Limitations
+
+When using a [Parameterised Command][Parameterised Commands] to execute a stored procedure, it is not possible to write back to output parameters.
+
+[Command Property]: {{< ref "#command" >}}
+[Connection Details Property]: {{< ref "#connection-details" >}}
+[Close Connection Property]: {{< ref "#close-connection" >}}
+[Result Property]: {{< ref "#result-8" >}}
+
+[Selecting Rows]: {{< ref "#selecting-rows">}}
+[Inserting Rows]: {{< ref "#inserting-rows">}}
+[Updating Rows]: {{< ref "#updating-rows">}}
+[Deleting Rows]: {{< ref "#deleting-rows">}}
+[Executing Multiple Commands (Safe)]: {{< ref "#executing-multiple-commands-safe">}}
+[Executing Multiple Commands (Unsafe)]: {{< ref "#executing-multiple-commands-unsafe">}}
+[Using Functions]: {{< ref "#using-functions">}}
+[Using Multiple Functions]: {{< ref "#using-multiple-functions">}}
+[Executing a Parameterised Command]: {{< ref "#executing-a-parameterised-command">}}
+
+[Command Types]: {{< ref "#command-types">}}
+[Command Types Command]: {{< ref "#command-1">}}
+[Command Types Commands]: {{< ref "#commands">}}
+[Command Types QueryCommand]: {{< ref "#querycommand">}}
+[Command Types NonQueryCommand]: {{< ref "#nonquerycommand">}}
+
+[Query Statements]: {{< ref "#query-statements">}}
+[Non Query Statements]: {{< ref "#non-query-statements">}}
+
+[Connection Strings]: {{< ref "#connection-strings">}}
+[Parameterised Commands]: {{< ref "#parameterised-commands">}}
+[Complex Commands]: {{< ref "#complex-commands">}}
+[Opening Connections]: {{< ref "#opening-connections">}}
+[Closing Connections]: {{< ref "#closing-connections">}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[InvalidConnectionStringException]: {{< url path="Cortex.Reference.Exceptions.Data.InvalidConnectionStringException.MainDoc" >}}
+[CommandException]: {{< url path="Cortex.Reference.Exceptions.Data.CommandException.MainDoc" >}}
+
+[ConnectionDetails]: {{< url path="Cortex.Reference.DataTypes.Data.ConnectionDetails.MainDoc" >}}
+[SqlServerConnectionDetails]: {{< url path="Cortex.Reference.DataTypes.Data.SqlServerConnectionDetails.MainDoc" >}}
+[OracleConnectionDetails]: {{< url path="Cortex.Reference.DataTypes.Data.OracleConnectionDetails.MainDoc" >}}
+[OdbcConnectionDetails]: {{< url path="Cortex.Reference.DataTypes.Data.OdbcConnectionDetails.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+
+[TConnectionDetails]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Array]: {{< url path="Cortex.Reference.DataTypes.Collections.Array.MainDoc" >}}
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+
+[DataCommand]: {{< url path="Cortex.Reference.DataTypes.Data.DataCommand.MainDoc" >}}
+[DataCommand.CommandText]: {{< url path="Cortex.Reference.DataTypes.Data.DataCommand.CommandText" >}}
+
+[Command]: {{< url path="Cortex.Reference.DataTypes.Data.Command.MainDoc" >}}
+[Command.CommandText]: {{< url path="Cortex.Reference.DataTypes.Data.Command.CommandText" >}}
+
+[Commands]: {{< url path="Cortex.Reference.DataTypes.Data.Commands.MainDoc" >}}
+[Commands.CommandText]: {{< url path="Cortex.Reference.DataTypes.Data.Commands.CommandText" >}}
+
+[QueryCommand]: {{< url path="Cortex.Reference.DataTypes.Data.QueryCommand.MainDoc" >}}
+[QueryCommand.CommandText]: {{< url path="Cortex.Reference.DataTypes.Data.QueryCommand.CommandText" >}}
+
+[NonQueryCommand]: {{< url path="Cortex.Reference.DataTypes.Data.NonQueryCommand.MainDoc" >}}
+[NonQueryCommand.CommandText]: {{< url path="Cortex.Reference.DataTypes.Data.NonQueryCommand.CommandText" >}}
+
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[String Interpolation]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.ConvertingObjectsToText.StringInterpolation" >}}
+[Working with Data Sources]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DataSources.MainDoc" >}}
+[Connection String Formats]: {{< url path="ConnectionStrings.MainDoc" >}}
+[SqlException Error Codes]: {{< url path="MSDocs.SqlServer.ErrorCodes" >}}
+[SqlException]: {{< url path="MSDocs.SqlServer.SqlException" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[LogonType]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.LogonType" >}}
+[RunAsProperty]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.RunAsProperty" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+
+[OracleBlockStatement]: {{< url path="Oracle.PL-SQL.BlockStatement" >}}
+[SQL Injection]: {{< url path="W3.SqlInjection" >}}
+
+[SqlConnectionStringTrustedConnection]: {{< url path="ConnectionStrings.SqlConnectionTrustedConnection" >}}
+[OracleConnectionStringIntegratedSecurity]: {{< url path="ConnectionStrings.OracleConnectionIntegratedSecurity" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/_index.md
new file mode 100644
index 000000000..442888370
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Date & Time"
+linkTitle: "Date & Time"
+description: "Blocks related to working with Date and Time."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/_index.md
new file mode 100644
index 000000000..b273f6313
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Add Time Period"
+linkTitle: "Add Time Period"
+description: "Add a time period (Years, Months, Days, Hours, Minutes, Seconds and Milliseconds) to a date time."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/add-time-period-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/add-time-period-block.md
new file mode 100644
index 000000000..1932df472
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/add-time-period/add-time-period-block.md
@@ -0,0 +1,157 @@
+---
+title: "Add Time Period"
+linkTitle: "Add Time Period"
+description: "Adds a Time Period to a specified Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_AddTimePeriod_AddTimePeriodBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds a [Time Period][TimePeriod Property] to the specified [Date Time][DateTime Property].
+
+This block can add both positive and negative [TimePeriod][] values.
+
+## Examples
+
+### Add a positive Time Period
+
+This example will add `1 year`, `1 month`, `1 day`, `1 hour` and `30 minutes` to `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Time Period][TimePeriod Property] | `($)TimePeriod`, with value of `{"Years": 1, "Months": 1, "Days": 1, "Hours": 1, "Minutes": 30, "Seconds": 0, "Milliseconds": 0}` | `($)TimePeriod` is a variable of type [TimePeriod][] |
+
+#### Result
+
+Adding `1 year`, `1 month`, `1 day`, `1 hour` and `30 minutes` to `2021-01-01T00:00:00+00:00` will result in the variable `($)DateTime` being updated. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2022-02-02T01:30:00+00:00"
+```
+
+***
+
+### Add a negative Time Period
+
+This example will add `-1 year` to `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Time Period][TimePeriod Property] | `($)TimePeriod`, with value of `{"Years": -1, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 0, "Milliseconds": 0}` | `($)TimePeriod` is a variable of type [TimePeriod][] |
+
+#### Result
+
+Adding `-1 year` from `2021-01-01T00:00:00+00:00` will result in `1 year` being subtracted and the variable `($)DateTime` being updated. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2020-01-01T00:00:00+00:00"
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to add the [Time Period][TimePeriod Property] to.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Time Period
+
+The [Time Period][TimePeriod Property] to add to the [Date Time][DateTime Property] to.
+
+[Time Period][TimePeriod Property] can have positive and negative components where components are:
+
+* Years
+* Months
+* Days
+* Hours
+* Minutes
+* Seconds
+* Milliseconds
+
+When adding a [Time Period][TimePeriod Property], the block will first add years, followed by months, days, hours, minutes, seconds and finally milliseconds.
+
+When adding months, if the current day component is greater than the last day in the resultant month, it will update the day to the last day for that month (e.g. adding one month onto `2021-01-31T23:59:59+00:00` will equate to `2021-02-28T23:59:59+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TimePeriod][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | Years: `0` Months: `0` Days: `0` Hours: `0` Minutes: `0` Seconds: `0` Milliseconds: `0`|
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when adding [Time Period][TimePeriod Property] to [Date Time][DateTime Property] will result in the [Date Time][DateTime Property] being less than `0001-01-01T00:00:00+00:00`. See [Property Less Than Minimum Value][].|
+| | Thrown when adding [Time Period][TimePeriod Property] to [Date Time][DateTime Property] will result in the [Date Time][DateTime Property] being greater than `9999-12-31T23:59:59+00:00`. See [Property Greater Than Maximum Value][]. |
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Order of calculations
+
+When adding a [Time Period][TimePeriod Property], the block will first add years, followed by months, days, hours, minutes, seconds and finally milliseconds.
+
+### Addition of Months
+
+When adding months to the [Date Time][DateTime Property], if the current day component is greater than the last day in the resultant month, it will update the day to the last day for that month (e.g. adding one month onto `2021-01-31T23:59:59+00:00` will equate to `2021-02-28T23:59:59+00:00`).
+
+### Daylight Savings
+
+This block copes with UTC time offsets but does not know anything about which time zone the [Date Time][DateTime Property] represents; as a result it cannot take daylight savings into account as these are related to time zones rather than UTC time offsets.
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[TimePeriod Property]: {{< ref "#time-period" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[Property Greater Than Maximum Value]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyGreaterThanMaximumValue" >}}
+[Property Less Than Minimum Value]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyLessThanMinimumValue" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/_index.md
new file mode 100644
index 000000000..c4089d580
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Convert Date Time"
+linkTitle: "Convert Date Time"
+description: "Convert a date time to and from text."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-date-time-to-text-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-date-time-to-text-block.md
new file mode 100644
index 000000000..7853340df
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-date-time-to-text-block.md
@@ -0,0 +1,254 @@
+---
+title: "Convert Date Time To Text"
+linkTitle: "Convert Date Time To Text"
+description: "Converts a Date Time to Text."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_ConvertDateTime_ConvertDateTimeToTextBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts a [Date Time][DateTime Property] to [Text][Text Property].
+
+Additional options can be specified:
+
+* [Format Template][FormatTemplate Property] can be specified to define the format the [Date Time][DateTime Property] should be converted to (e.g. `"dd/MM/yyyy"`).
+* [Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting).
+
+## Examples
+
+### ISO 8601 Standard Format
+
+This example will convert a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset) to the [ISO 8601 Standard][] format (i.e. `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `null` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting a Date Time representing midnight on 31st December 2021 (with a `0` UTC time offset and without specifying any format template or provider) will result in the variable `($)Text` being updated to the following [ISO 8601 Standard][] text representation:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+### Default format for Invariant Culture
+
+This example will convert a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset) to the default format for Invariant Culture (i.e. `"MM/dd/yyyy HH:mm:ss zzz"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `CultureInfo.InvariantCulture` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting a Date Time representing midnight on 31st December 2021 (with a `0` UTC time offset and without a format template), but specifying Invariant Culture text representation, will result in the variable `($)Text` being updated to the following:
+
+```json
+"12/31/2021 00:00:00 +00:00"
+```
+
+***
+
+### Full Date Long Time format for Invariant Culture
+
+This example will convert a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset) to the Full Date Long Time format for Invariant Culture (i.e. `"dddd, dd MMMM yyyy HH:mm:ss"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"F"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `CultureInfo.InvariantCulture` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting a Date Time representing midnight on 31st December 2021 (with a `0` UTC time offset), and specifying the Full Date Long Time format for Invariant Culture, will result in the variable `($)Text` being updated to the following:
+
+```json
+"Friday, 31 December 2021 00:00:00"
+```
+
+***
+
+### Default format for American English ("en-US")
+
+This example will convert a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset) to the default format for American English `"en-US"` (i.e. `"MM/d/yyyy h:m:s tt zzz"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting a Date Time representing midnight on 31st December 2021 (with a `0` UTC time offset and without a format template), but specifying an American English `"en-US"` text representation, will result in the variable `($)Text` being updated to the following:
+
+```json
+"12/31/2021 12:00:00 AM +00:00"
+```
+
+***
+
+### Full Date Long Time format for American English ("en-US")
+
+This example will convert a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset) to the Full Date Long Time format for American English `"en-US"` (i.e. `"dddd, MMMM d, yyyy h:m:s tt"`).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"F"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting a Date Time representing midnight on 31st December 2021 (with a `0` UTC time offset), and specifying the Full Date Long Time format for American English `"en-US"`, will result in the variable `($)Text` being updated to the following:
+
+```json
+"Friday, December 31, 2021 12:00:00 AM"
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to convert to [Text][Text Property].
+
+By default, if no [Format Template][FormatTemplate Property] or [Format Provider][FormatProvider Property] are specified, the resultant [Text][Text Property] will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Format Template
+
+[Format Template][FormatTemplate Property] can be specified to define the format the [Date Time][DateTime Property] should be converted to (e.g. `"dd/MM/yyyy"` -> `"31/12/2021"`).
+
+If [Format Template][FormatTemplate Property] contains valid format specifiers (e.g. `"dd"` for 2 digit day representation), they will be subsitituted based on the [Date Time][DateTime Property]; characters that are not format specifiers will be passed through as literal text.
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), the default format template of the specified [Format Provider][FormatProvider Property] is used. If [Format Provider][FormatProvider Property] is also not specified or `null` the [ISO 8601 Standard][] format will be used (i.e. `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`).
+
+For information about format templates and specifiers, please see [Date and Time Formatting][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `yyyy-MM-ddTHH:mm:ss.fffffffzzz` |
+
+### Format Provider
+
+[Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting.).
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IFormatProvider][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+### Text
+
+The [Text][Text Property] representation of the [Date Time][DateTime Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [FormatException][] | Thrown when [Format Template][FormatTemplate Property] is a single invalid format specifier (i.e. `"a"`). |
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Format Template and Specifiers
+
+Please note that changes to operating system date and time formats, could result in some of the examples above displaying different results.
+
+For information about format templates and specifiers, please see [Date and Time Formatting][].
+
+### Null or Empty Format Template
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), the default format template of the specified [Format Provider][FormatProvider Property] is used. If [Format Provider][FormatProvider Property] is also not specified or `null` the [ISO 8601 Standard][] format will be used (i.e. `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`).
+
+### Null Format Provider
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[FormatTemplate Property]: {{< ref "#format-template" >}}
+[FormatProvider Property]: {{< ref "#format-provider" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+
+[Date and Time Formatting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.MainDoc" >}}
+[Invariant Culture rules]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.InvariantCulture" >}}
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[IFormatProvider]: {{< url path="Cortex.Reference.DataTypes.Text.IFormatProvider.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-text-to-date-time-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-text-to-date-time-block.md
new file mode 100644
index 000000000..c2a93ad96
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/convert-date-time/convert-text-to-date-time-block.md
@@ -0,0 +1,270 @@
+---
+title: "Convert Text To Date Time"
+linkTitle: "Convert Text To Date Time"
+description: "Converts Text to a Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_ConvertDateTime_ConvertTextToDateTimeBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Text][Text Property] to a [Date Time][DateTime Property].
+
+Additional options can be specified:
+
+* [Format Template][FormatTemplate Property] can be specified to explicity define the format of the [Text][Text Property] (e.g. `"dd/MM/yyyy"`).
+* [Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the conversion (e.g. `new CultureInfo("en-US")` will apply American English rules to the conversion).
+
+## Examples
+
+### ISO 8601 Standard Format
+
+[ISO 8601 Standard][] format is `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`.
+
+This example will convert `"2021-12-31T00:00:00.0000000+00:00"` to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"2021-12-31T00:00:00+00:00"` | `($)Text` is a variable of type [String][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `null` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Converting `"2021-12-31T00:00:00.0000000+00:00"` to a Date Time (without specifying any format template or provider) will result in the variable `($)DateTime` being updated to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+### Default format for Invariant Culture
+
+Default format for Invariant Culture is `"MM/dd/yyyy HH:mm:ss zzz"`.
+
+This example will convert `"12/31/2021 00:00:00 +00:00"` to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"12/31/2021 00:00:00 +00:00"` | `($)Text` is a variable of type [String][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `CultureInfo.InvariantCulture` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Converting `"12/31/2021 00:00:00 +00:00"` to a Date Time without specifying a format template but specifying Invariant Culture, will result in the variable `($)DateTime` being updated to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+### Full Date Long Time format for Invariant Culture
+
+Full Date Long Time format for Invariant Culture is `"dddd, dd MMMM yyyy HH:mm:ss"`.
+
+This example will convert `"Friday, 31 December 2021 00:00:00"` to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset).
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"Friday, 31 December 2021 00:00:00"` | `($)Text` is a variable of type [String][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"F"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `CultureInfo.InvariantCulture` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Converting `"Friday, 31 December 2021 00:00:00"` to a Date Time specifying the Full Date Long Time format for Invariant Culture, will result in the variable `($)DateTime` being updated to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+### Default format for American English ("en-US")
+
+Default format for American English ("en-US") is `"MM/d/yyyy h:m:s tt zzz"`.
+
+This example will convert `"12/31/2021 12:00:00 AM +00:00"` to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset).
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"12/31/2021 12:00:00 AM +00:00"` | `($)Text` is a variable of type [String][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `null` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Converting `"12/31/2021 12:00:00 AM +00:00"` to a Date Time without specifying a format template but specifying American English `"en-US"`, will result in the variable `($)DateTime` being updated to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+### Full Date Long Time format for American English ("en-US")
+
+Full Date Long Time format for American English ("en-US") is `"dddd, MMMM d, yyyy h:m:s tt"`.
+
+This example will convert `"Friday, December 31, 2021 12:00:00 AM"` to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Text][Text Property] | `($)Text`, with value `"Friday, December 31, 2021 12:00:00 AM"` | `($)Text` is a variable of type [String][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"F"` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Converting `"Friday, December 31, 2021 12:00:00 AM"` to a Date Time specifying the Full Date Long Time format for American English `"en-US"`, will result in the variable `($)DateTime` being updated to a Date Time representing midnight on 31st December 2021 (with `0` UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00.0000000+00:00"
+```
+
+***
+
+## Properties
+
+### Text
+
+The [Text][Text Property] to convert to a [Date Time][DateTime Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+### Format Template
+
+[Format Template][FormatTemplate Property] can be specified to define the format the [Text][Text Property] is in (e.g. `"dd/MM/yyyy"`).
+
+If [Format Template][FormatTemplate Property] does not contain any valid format specifiers (e.g. `"ww/ww/wwww"`) and the text exactly matches the [Format Template][FormatTemplate Property] (e.g. `"ww/ww/wwww"`), then [Date Time][DateTime Property] is set to a [DateTimeOffset][] value that represents the current Date and Time.
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), the [ISO 8601 Standard][] format will be used for the conversion (i.e. `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`).
+
+If the [ISO 8601 Standard][] format fails, then the default template of the specified [Format Provider][FormatProvider Property] will be used; if there is no specified [Format Provider][FormatProvider Property], then [Invariant Culture rules][] will be used instead.
+
+For information about format templates and specifiers, please see [Date and Time Formatting][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `yyyy-MM-ddTHH:mm:ss.fffffffzzz` |
+
+### Format Provider
+
+[Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the conversion (e.g. `new CultureInfo("en-US")` will apply American English rules to the conversion).
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IFormatProvider][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+### Date Time
+
+The [Date Time][DateTime Property] that has been converted from [Text][Text Property].
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [FormatException][] | Thrown when [Format Template][FormatTemplate Property] does not contain any valid specifiers (e.g. `"ww/ww/wwww"`). |
+| | Thrown when [Format Template][FormatTemplate Property] contains non-specifier characters, and [Text][Text Property] does not match the characters exactly (e.g. `"01/10/2021 12:00"` and `"dd/ww/yyyy hh:mm"` will throw, but `"01/ww/2021 12:00"` and `"dd/ww/yyyy hh:mm"` does not). |
+| | Thrown when [Format Template][FormatTemplate Property] is `null` or empty (i.e. `""`) and the [Text][Text Property] does not match the [ISO 8601 Standard][] format, the default format of the [Format Provider][FormatProvider Property] (e.g. `"31/12/2021 00:00"` and `"dd/MM/yyyy"`). |
+| [PropertyEmptyException][] | Thrown when [Text][Text Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Text][Text Property] is `null`. |
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Format Template and Specifiers
+
+Please note that changes to operating system date and time formats, could result in some of the examples above displaying different results.
+
+For information about format templates and specifiers, please see [Date and Time Formatting][].
+
+### Null or Empty Format Template
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), the [ISO 8601 Standard][] format will be used for the conversion (i.e. `"yyyy-MM-ddTHH:mm:ss.fffffffzzz"`).
+
+If the [ISO 8601 Standard][] format fails, then the default template of the specified [Format Provider][FormatProvider Property] will be used; if there is no specified [Format Provider][FormatProvider Property], then [Invariant Culture rules][] will be used instead.
+
+### Null Format Provider
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[FormatTemplate Property]: {{< ref "#format-template" >}}
+[FormatProvider Property]: {{< ref "#format-provider" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[Date and Time Formatting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.MainDoc" >}}
+[Invariant Culture rules]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.InvariantCulture" >}}
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[IFormatProvider]: {{< url path="Cortex.Reference.DataTypes.Text.IFormatProvider.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/_index.md
new file mode 100644
index 000000000..fa05212da
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Date Time"
+linkTitle: "Get Date Time"
+description: "Get the current date time or parts of a date time (i.e. Year, Month, Day)."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-current-date-time-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-current-date-time-block.md
new file mode 100644
index 000000000..58759f529
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-current-date-time-block.md
@@ -0,0 +1,80 @@
+---
+title: "Get Current Date Time"
+linkTitle: "Get Current Date Time"
+description: "Gets the current Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_GetDateTime_GetCurrentDateTimeBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the current [Date Time][DateTime Property].
+
+## Examples
+
+### Get the current Date Time
+
+This example will get the current Date Time.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with no value | `($)DateTime` is a variable that will be set to a [DateTimeOffset][] value |
+
+#### Result
+
+Getting the current Date Time will result in the variable `($)DateTime` being set to a [DateTimeOffset][] representing the current Date Time (including a UTC time offset). Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-11-05T08:48:08.0307614+00:00"
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The current [Date Time][DateTime Property] including a UTC time offset.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-date-time-component-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-date-time-component-block.md
new file mode 100644
index 000000000..3e2a32399
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-date-time/get-date-time-component-block.md
@@ -0,0 +1,426 @@
+---
+title: "Get Date Time Component"
+linkTitle: "Get Date Time Component"
+description: "Gets a component (e.g. Year, Month, Day) of a specified Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_GetDateTime_GetDateTimeComponentBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets a [Component][Component Property] (e.g. Year, Month, Day) of the specified [Date Time][DateTime Property].
+
+[Component Type][ComponentType Property] is used to specify which type of component to get.
+
+For more information about values that can be specified for [Component Type][ComponentType Property], please see [DateTimeComponentType][] or the [examples][] below.
+
+## Examples
+
+### LocalDateTime
+
+This example will get the LocalDateTime of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+In this example assume that the local date and time is in the GMT time zone.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T00:05:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.LocalDateTime` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the LocalDateTime (GMT) of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to a [DateTime][] value. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T10:00:00+00:00"
+```
+
+***
+
+### UtcDateTime
+
+This example will get the UTCDateTime of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.UtcDateTime` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the UTCDateTime of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to a [DateTime][] value. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T10:00:00Z"
+```
+
+***
+
+### Date
+
+This example will get the Date component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Date` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Date component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to a [DateTime][] value. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-12-31T00:00:00"
+```
+
+***
+
+### Time
+
+This example will get the Time component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Time` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Time component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [TimePeriod][] value:
+
+```json
+{
+ "Years": 0,
+ "Months": 0,
+ "Days": 0,
+ "Hours": 5,
+ "Minutes": 0,
+ "Seconds": 0,
+ "Milliseconds": 0
+}
+```
+
+### Year
+
+This example will get the Year component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Year` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Year component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+2021
+```
+
+***
+
+### Month
+
+This example will get the Month component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Month` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Month component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+12
+```
+
+### Day
+
+This example will get the Day component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Day` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Day component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+31
+```
+
+### Hour
+
+This example will get the Hour component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Hour` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Hour component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+5
+```
+
+***
+
+### Minute
+
+This example will get the Minute component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Minute` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Minute component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+0
+```
+
+***
+
+### Second
+
+This example will get the Second component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Second` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Second component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+0
+```
+
+***
+
+### Millisecond
+
+This example will get the Millisecond component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Millisecond` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Millisecond component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+0
+```
+
+***
+
+### Offset
+
+This example will get the Offset component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.Offset` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the Offset component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [TimeSpan][] value with the following text representation:
+
+```json
+"-5:00:00"
+```
+
+***
+
+### DayOfYear
+
+This example will get the DayOfYear component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.DayOfYear` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the DayOfYear component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [Int32][] value:
+
+```json
+365
+```
+
+***
+
+### DayOfWeek
+
+This example will get the DayOfWeek component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset).
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-12-31T05:00:00-05:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Component Type][ComponentType Property] | `($)ComponentType`, with value of `DateTimeComponentType.DayOfWeek` | `($)DateTime` is a variable of type [DateTimeComponentType][] |
+| [Component][Component Property] | `($)Component`, with no value | `($)Component` is a variable that will be set to a [dynamic][] value |
+
+#### Result
+
+Getting the DayOfWeek component of a Date Time representing 5am on 31st December 2021 (with `-5` UTC time offset), will result in the variable `($)Component` being updated to the following [DayOfWeek][] value:
+
+```json
+DayOfWeek.Friday
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to get the specified [Component Type][ComponentType Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Component Type
+
+The [Component Type][ComponentType Property] to get from the [Date Time][DateTime Property].
+
+For more information about values that can be specified for [Component Type][ComponentType Property], please see [DateTimeComponentType][] or the [examples][] above.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeComponentType][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `LocalDateTime` |
+
+### Component
+
+The [Component][Component Property] from the [Date Time][DateTime Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Component` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Component Type][ComponentType Property] is not one of the specified [DateTimeComponentType][] types (e.g. `(DateTimeComponentType)100`). |
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Why does the Component property return a dynamic data type?
+
+The decision for [Component][Component Property] to return a [dynamic data type][dynamic] rather than an [Object][], was to avoid users having to [cast][Object Casting] the component to its correct type to be able to use all of its properties.
+
+As a result, any issues with using the [Component][Component Property] (i.e. trying to access a property it does not have) will not be reported as messages when trying to debug the flow; they will only be discovered when the flow execution reaches the part of the flow with the issue.
+
+If it is desirable to have any issues reported as messages when trying to debug the flow, the user can [cast][Object Casting] the variable specified for [Component][Component Property] to its correct type when using it (e.g. for UtcDateTime component it could be case as follows: `(DateTime)($)Component`).
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[ComponentType Property]: {{< ref "#component-type" >}}
+[Component Property]: {{< ref "#component" >}}
+[Examples]: {{< ref "#examples" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[DateTime]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTime.MainDoc" >}}
+[DateTimeComponentType]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeComponentType.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+[TimeSpan]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimeSpan.MainDoc" >}}
+[DayOfWeek]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DayOfWeek.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/_index.md
new file mode 100644
index 000000000..631288791
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Time Period"
+linkTitle: "Get Time Period"
+description: "Get the time period (Years, Months, Days, Hours, Minutes, Seconds and Milliseconds) between two date times."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/get-time-period-between-date-times-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/get-time-period-between-date-times-block.md
new file mode 100644
index 000000000..e4fb7740f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/get-time-period/get-time-period-between-date-times-block.md
@@ -0,0 +1,146 @@
+---
+title: "Get Time Period Between Date Times"
+linkTitle: "Get Time Period Between Date Times"
+description: "Gets the Time Period between two Date Times."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_GetTimePeriod_GetTimePeriodBetweenDateTimesBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Get the [Time Period][TimePeriod Property] between the specified [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property].
+
+## Examples
+
+### Get Time Period between Start Date Time and End Date Time
+
+This example will get the Time Period between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Start Date Time][StartDateTime Property] | `($)StartDateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)StartDateTime` is a variable of type [DateTimeOffset][] |
+| [End Date Time][EndDateTime Property] | `($)EndDateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)EndDateTime` is a variable of type [DateTimeOffset][] |
+| [Time Period][TimePeriod Property] | `($)TimePeriod`, with no value | `($)TimePeriod` is a variable that will be set to a [TimePeriod][] value |
+
+#### Result
+
+Getting the Time Period between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00` will result in the variable `($)TimePeriod` being updated to the following:
+
+```json
+{
+ "Years": 0,
+ "Months": 0,
+ "Days": 365,
+ "Hours": 0,
+ "Minutes": 0,
+ "Seconds": 0,
+ "Milliseconds": 0
+}
+```
+
+***
+
+## Properties
+
+### Start Date Time
+
+The [Start Date Time][StartDateTime Property] to get the Time Period between.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)StartDateTime` with no value |
+
+### End Date Time
+
+The [End Date Time][EndDateTime Property] to get the Time Period between.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)EndDateTime` with no value |
+
+### Time Period
+
+The [Time Period][TimePeriod Property] between the [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property].
+
+[Time Period][TimePeriod Property] can have positive and negative components where components are:
+
+* Years
+* Months
+* Days
+* Hours
+* Minutes
+* Seconds
+* Milliseconds
+
+In this block, the Year and Month components are not used as they aren't constant (i.e. Years can have different numbers of days depending upon whether it is a leap year or not, and months can have different numbers of days); instead Days will be used.
+
+[Time Period][TimePeriod Property] is calculated by subtracting [Start Date Time][StartDateTime Property] from [End Date Time][EndDateTime Property]; therefore if [Start Date Time][StartDateTime Property] is less than [End Date Time][EndDateTime Property], the [Time Period][TimePeriod Property] components will be positive, if it is equal they will be `0` and finally if it is greater than they will be negative.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TimePeriod][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TimePeriod` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Years and Months components not used
+
+In this block, the Year and Month components are not used as they aren't constant (i.e. Years can have different numbers of days depending upon whether it is a leap year or not, and months can have different numbers of days); instead Days will be used.
+
+### Start Date Time greater than End Date Time
+
+[Start Date Time][StartDateTime Property] can be greater than [End Date Time][EndDateTime Property]; if this is the case the components of the [Time Period][TimePeriod Property] will be negative.
+
+[StartDateTime Property]: {{< ref "#start-date-time" >}}
+[EndDateTime Property]: {{< ref "#end-date-time" >}}
+[TimePeriod Property]: {{< ref "#time-period" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/_index.md
new file mode 100644
index 000000000..0bc30351e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Is Date Time"
+linkTitle: "Is Date Time"
+description: "Check if a date time is equal to another date time, before it, after it, or between two date times."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-after-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-after-block.md
new file mode 100644
index 000000000..18dc3cbd2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-after-block.md
@@ -0,0 +1,156 @@
+---
+title: "Is Date Time After"
+linkTitle: "Is Date Time After"
+description: "Checks if a Date Time is after another Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_IsDateTime_IsDateTimeAfterBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [Date Time][DateTime Property] is after a given [Date Time To Compare][DateTimeToCompare Property].
+
+## Examples
+
+### Date Time is after Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is after `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is After][DateTimeIsAfter Property] | `($)DateTimeIsAfter`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is after `2021-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsAfter` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Date Time is before Date Time To Compare
+
+This example will check if `2021-01-01T00:00:00+00:00` is after `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is After][DateTimeIsAfter Property] | `($)DateTimeIsAfter`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2021-01-01T00:00:00+00:00` is after `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsAfter` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Date Time is equal to Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is after `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is After][DateTimeIsAfter Property] | `($)DateTimeIsAfter`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is after `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsAfter` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to check is after [Date Time To Compare][DateTimeToCompare Property].
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Date Time To Compare
+
+The Date Time to check if [Date Time][DateTime Property] is after.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeToCompare` with no value |
+
+### Date Time Is After
+
+The result of the is after check.
+
+If [Date Time][DateTime Property] is after [Date Time To Compare][DateTimeToCompare Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeIsAfter` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[DateTimeToCompare Property]: {{< ref "#date-time-to-compare" >}}
+[DateTimeIsAfter Property]: {{< ref "#date-time-is-after" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-before-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-before-block.md
new file mode 100644
index 000000000..107d3c2af
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-before-block.md
@@ -0,0 +1,156 @@
+---
+title: "Is Date Time Before"
+linkTitle: "Is Date Time Before"
+description: "Checks if a Date Time is before another Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_IsDateTime_IsDateTimeBeforeBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [Date Time][DateTime Property] is before a given [Date Time To Compare][DateTimeToCompare Property].
+
+## Examples
+
+### Date Time is before Date Time To Compare
+
+This example will check if `2021-01-01T00:00:00+00:00` is before `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Before][DateTimeIsBefore Property] | `($)DateTimeIsBefore`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2021-01-01T00:00:00+00:00` is before `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsBefore` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Date Time is after Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is before `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Before][DateTimeIsBefore Property] | `($)DateTimeIsBefore`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is before `2021-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsBefore` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Date Time is equal to Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is before `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Before][DateTimeIsBefore Property] | `($)DateTimeIsBefore`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is before `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsBefore` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to check is before [Date Time To Compare][DateTimeToCompare Property].
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Date Time To Compare
+
+The Date Time to check if [Date Time][DateTime Property] is before.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeToCompare` with no value |
+
+### Date Time Is Before
+
+The result of the is before check.
+
+If [Date Time][DateTime Property] is before [Date Time To Compare][DateTimeToCompare Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeIsBefore` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[DateTimeToCompare Property]: {{< ref "#date-time-to-compare" >}}
+[DateTimeIsBefore Property]: {{< ref "#date-time-is-before" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-between-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-between-block.md
new file mode 100644
index 000000000..f4e3f95eb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-between-block.md
@@ -0,0 +1,161 @@
+---
+title: "Is Date Time Between"
+linkTitle: "Is Date Time Between"
+description: "Checks if a Date Time is between two Date Times."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_IsDateTime_IsDateTimeBetweenBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [Date Time][DateTime Property] is between the specified [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property].
+
+## Examples
+
+### Date Time is between Start Date Time and End Date Time
+
+This example will check if `2021-06-01T00:00:00+00:00` is between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-06-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Start Date Time][StartDateTime Property] | `($)StartDateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)StartDateTime` is a variable of type [DateTimeOffset][] |
+| [End Date Time][EndDateTime Property] | `($)EndDateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)EndDateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Between][DateTimeIsBetween Property] | `($)DateTimeIsBetween`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2021-06-01T00:00:00+00:00` is between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsBetween` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Date Time is not between Start Date Time and End Date Time
+
+This example will check if `2020-01-01T00:00:00+00:00` is between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2020-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Start Date Time][StartDateTime Property] | `($)StartDateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)StartDateTime` is a variable of type [DateTimeOffset][] |
+| [End Date Time][EndDateTime Property] | `($)EndDateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)EndDateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Between][DateTimeIsBetween Property] | `($)DateTimeIsBetween`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2020-01-01T00:00:00+00:00` is between `2021-01-01T00:00:00+00:00` and `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsBetween` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to check is between [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property].
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Start Date Time
+
+The [Start Date Time][StartDateTime Property] to check against. This is inclusive, which means if [Date Time][DateTime Property] is equal to it, it will be considered between.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)StartDateTime` no value |
+
+### End Date Time
+
+The [End Date Time][EndDateTime Property] to check against. This is inclusive, which means if [Date Time][DateTime Property] is equal to it, it will be considered between.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)EndDateTime` with no value |
+
+### Date Time Is Between
+
+The result of the is between check.
+
+If [Date Time][DateTime Property] is between (and including) the [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeIsBetween` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Start Date Time and End Date Time are inclusive
+
+The [Start Date Time][StartDateTime Property] and [End Date Time][EndDateTime Property] properties are both inclusive, which means if [Date Time][DateTime Property] is equal to either of them, it will be considered between.
+
+### Start Date Time greater than End Date Time
+
+[Start Date Time][StartDateTime Property] can be greater than [End Date Time][EndDateTime Property]; as long as [Date Time][DateTime Property] is between or equal to either of them the variable specified for [Date Time Is Between][DateTimeIsBetween Property] will be set to `true`, otherwise it will be set to `false`.
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[StartDateTime Property]: {{< ref "#start-date-time" >}}
+[EndDateTime Property]: {{< ref "#end-date-time" >}}
+[DateTimeIsBetween Property]: {{< ref "#date-time-is-between" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-equal-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-equal-block.md
new file mode 100644
index 000000000..1c0da869a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/is-date-time/is-date-time-equal-block.md
@@ -0,0 +1,156 @@
+---
+title: "Is Date Time Equal"
+linkTitle: "Is Date Time Equal"
+description: "Checks if a Date Time is equal to another Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_IsDateTime_IsDateTimeEqualBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a [Date Time][DateTime Property] is equal to a given [Date Time To Compare][DateTimeToCompare Property].
+
+## Examples
+
+### Date Time is equal to Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is equal to `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Equal][DateTimeIsEqual Property] | `($)DateTimeIsEqual`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is equal `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsEqual` being updated to the following:
+
+```json
+true
+```
+
+***
+
+### Date Time is after Date Time To Compare
+
+This example will check if `2022-01-01T00:00:00+00:00` is equal to `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Equal][DateTimeIsEqual Property] | `($)DateTimeIsEqual`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2022-01-01T00:00:00+00:00` is equal to `2021-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsEqual` being updated to the following:
+
+```json
+false
+```
+
+***
+
+### Date Time is before Date Time To Compare
+
+This example will check if `2021-01-01T00:00:00+00:00` is equal to `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Date Time To Compare][DateTimeToCompare Property] | `($)DateTimeToCompare`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTimeToCompare` is a variable of type [DateTimeOffset][] |
+| [Date Time Is Equal][DateTimeIsEqual Property] | `($)DateTimeIsEqual`, with no value | `($)DateTime` is a variable that will be set to a [Boolean][] value |
+
+#### Result
+
+Checking if `2021-01-01T00:00:00+00:00` is equal to `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTimeIsEqual` being updated to the following:
+
+```json
+false
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to check is equal to [Date Time To Compare][DateTimeToCompare Property].
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Date Time To Compare
+
+The Date Time to check if [Date Time][DateTime Property] is equal to.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeToCompare` with no value |
+
+### Date Time Is Equal
+
+The result of the is equal check.
+
+If [Date Time][DateTime Property] is equal to [Date Time To Compare][DateTimeToCompare Property], the specified variable will be set to `true`, otherwise it will be set to `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTimeIsEqual` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[DateTimeToCompare Property]: {{< ref "#date-time-to-compare" >}}
+[DateTimeIsEqual Property]: {{< ref "#date-time-is-equal" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/_index.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/_index.md
new file mode 100644
index 000000000..95e6ebff1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Subtract Time Period"
+linkTitle: "Subtract Time Period"
+description: "Subtract a time period (Years, Months, Days, Hours, Minutes, Seconds and Milliseconds) from a date time."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/subtract-time-period-block.md b/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/subtract-time-period-block.md
new file mode 100644
index 000000000..be69f77f9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/date-and-time/subtract-time-period/subtract-time-period-block.md
@@ -0,0 +1,157 @@
+---
+title: "Subtract Time Period"
+linkTitle: "Subtract Time Period"
+description: "Subtracts a Time Period to from specified Date Time."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_DateAndTime_SubtractTimePeriod_SubtractTimePeriodBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Subtracts a [Time Period][TimePeriod Property] from the specified [Date Time][DateTime Property].
+
+This block can subtract both positive and negative [TimePeriod][] values.
+
+## Examples
+
+### Subtract a positive Time Period
+
+This example will subtract `1 year` from `2022-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2022-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Time Period][TimePeriod Property] | `($)TimePeriod`, with value of `{"Years": 1, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 0, "Milliseconds": 0}` | `($)TimePeriod` is a variable of type [TimePeriod][] |
+
+#### Result
+
+Subtracting `1 year` from `2022-01-01T00:00:00+00:00` will result in the variable `($)DateTime` being updated. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2021-01-01T00:00:00+00:00"
+```
+
+***
+
+### Subtract a negative Time Period
+
+This example will subtract `-1 year` from `2021-01-01T00:00:00+00:00`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Date Time][DateTime Property] | `($)DateTime`, with value of [DateTimeOffset][] that has a text representation of `2021-01-01T00:00:00+00:00` | `($)DateTime` is a variable of type [DateTimeOffset][] |
+| [Time Period][TimePeriod Property] | `($)TimePeriod`, with value of `{"Years": -1, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 0, "Milliseconds": 0}` | `($)TimePeriod` is a variable of type [TimePeriod][] |
+
+#### Result
+
+Subtracting `-1 year` from `2021-01-01T00:00:00+00:00` will result in `1 year` being added and the variable `($)DateTime` being updated. Its text representation will be in the [ISO 8601 Standard][], which can be seen below:
+
+```json
+"2022-01-01T00:00:00+00:00"
+```
+
+***
+
+## Properties
+
+### Date Time
+
+The [Date Time][DateTime Property] to subtract the [Time Period][TimePeriod Property] from.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [DateTimeOffset][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)DateTime` with no value |
+
+### Time Period
+
+The [Time Period][TimePeriod Property] to subtract from the [Date Time][DateTime Property].
+
+[Time Period][TimePeriod Property] can have positive and negative components where components are:
+
+* Years
+* Months
+* Days
+* Hours
+* Minutes
+* Seconds
+* Milliseconds
+
+When subtracting a [Time Period][TimePeriod Property], the block will first subtract years, followed by months, days, hours, minutes, seconds and finally milliseconds.
+
+When subtracting months, if the current day component is greater than the last day in the resultant month, it will update the day to the last day for that month (e.g. subtracting one month from `2021-02-28T23:59:59+00:00` will equate to `2021-01-31T23:59:59+00:00`).
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TimePeriod][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | Years: `0` Months: `0` Days: `0` Hours: `0` Minutes: `0` Seconds: `0` Milliseconds: `0`|
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyValueOutOfRangeException][] | Thrown when subtracting [Time Period][TimePeriod Property] from [Date Time][DateTime Property] will result in the [Date Time][DateTime Property] being less than `0001-01-01T00:00:00+00:00`. See [Property Less Than Minimum Value][].|
+| | Thrown when subtracting [Time Period][TimePeriod Property] from [Date Time][DateTime Property] will result in the [Date Time][DateTime Property] being greater than `9999-12-31T23:59:59+00:00`. See [Property Greater Than Maximum Value][]. |
+
+## Remarks
+
+### Dates and Time
+
+The default text representation of Date and Time will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+For more information, please see [Working with Date and Time][].
+
+### Order of calculations
+
+When subtracting a [Time Period][TimePeriod Property], the block will first subtract years, followed by months, days, hours, minutes, seconds and finally milliseconds.
+
+### Subtraction of Months
+
+When subtracting months from the [Date Time][DateTime Property], if the current day component is greater than the last day in the resultant month, it will update the day to the last day for that month (e.g. subtracting one month from `2021-02-28T23:59:59+00:00` will equate to `2021-01-31T23:59:59+00:00`).
+
+### Daylight Savings
+
+This block copes with UTC time offsets but does not know anything about which time zone the [Date Time][DateTime Property] represents; as a result it cannot take daylight savings into account as these are related to time zones rather than UTC time offsets.
+
+[DateTime Property]: {{< ref "#date-time" >}}
+[TimePeriod Property]: {{< ref "#time-period" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[Property Greater Than Maximum Value]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyGreaterThanMaximumValue" >}}
+[Property Less Than Minimum Value]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyLessThanMinimumValue" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/_index.md b/content/en/docs/2026.3/Reference/Blocks/decisions/_index.md
new file mode 100644
index 000000000..15b7f418c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Decisions"
+linkTitle: "Decisions"
+description: "Blocks related to making decisions and branching the path a flow execution takes."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/if/_index.md b/content/en/docs/2026.3/Reference/Blocks/decisions/if/_index.md
new file mode 100644
index 000000000..cd4e027e1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/if/_index.md
@@ -0,0 +1,5 @@
+---
+title: "If Else"
+linkTitle: "If Else"
+description: "Perform if-else like conditional decision making."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-bottom-block-1.md b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-bottom-block-1.md
new file mode 100644
index 000000000..93099fb1b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-bottom-block-1.md
@@ -0,0 +1,96 @@
+---
+title: "If Null Exit Bottom"
+linkTitle: "If Null Exit Bottom"
+description: "Checks if a given value is `null`; if so the flow execution exits via the block's bottom port, otherwise it exits via the right port."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Decisions_If_IfNullExitBottomBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a given [Value][Value Property] is `null`; if so the flow execution exits via the block's bottom port (green tick), otherwise it exits via the right port (red cross).
+
+For information about `null`, please see [Null and Nullable Types][].
+
+## Examples
+
+### Value is null
+
+This example will check if `null` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `null` | `($)Value` is a variable of type [String][] |
+
+#### Result
+
+`null` is `null`, so the flow execution exits via the block's bottom port (green tick).
+
+***
+
+### Value is not null
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Value` is a variable of type [String][] |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not `null`, so the flow execution exits via the block's right port (red cross).
+
+***
+
+## Properties
+
+### Value
+
+The [Value][Value Property] to check is `null`.
+
+For information about `null`, please see [Null and Nullable Types][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TValue][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | No value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNotNullableException][] | Thrown when [Value][Value Property] is given a non-nullable value type. |
+
+## Remarks
+
+### Null and Nullable Types
+
+For information about `null`, please see [Null and Nullable Types][].
+
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[Null and Nullable Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.NullAndNullableTypes.MainDoc" >}}
+
+[PropertyNotNullableException]: {{< url path="Cortex.Reference.Exceptions.Decisions.PropertyNotNullableException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-right-block-1.md b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-right-block-1.md
new file mode 100644
index 000000000..2b7cd3735
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-null-exit-right-block-1.md
@@ -0,0 +1,96 @@
+---
+title: "If Null Exit Right"
+linkTitle: "If Null Exit Right"
+description: "Checks if a given value is `null`; if so the flow execution exits via the block's right port, otherwise it exits via the bottom port."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Decisions_If_IfNullExitRightBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a given [Value][Value Property] is `null`; if so the flow execution exits via the block's right port (green tick), otherwise it exits via the bottom port (red cross).
+
+For information about `null`, please see [Null and Nullable Types][].
+
+## Examples
+
+### Value is null
+
+This example will check if `null` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `null` | `($)Value` is a variable of type [String][] |
+
+#### Result
+
+`null` is `null`, so the flow execution exits via the block's right port (green tick).
+
+***
+
+### Value is not null
+
+This example will check if `"The quick brown fox jumps over the lazy dog"` is `null`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `"The quick brown fox jumps over the lazy dog"` | `($)Value` is a variable of type [String][] |
+
+#### Result
+
+`"The quick brown fox jumps over the lazy dog"` is not `null`, so the flow execution exits via the block's bottom port (red cross).
+
+***
+
+## Properties
+
+### Value
+
+The [Value][Value Property] to check is `null`.
+
+For information about `null`, please see [Null and Nullable Types][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TValue][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | No value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNotNullableException][] | Thrown when [Value][Value Property] is given a non-nullable value type. |
+
+## Remarks
+
+### Null and Nullable Types
+
+For information about `null`, please see [Null and Nullable Types][].
+
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[Null and Nullable Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.NullAndNullableTypes.MainDoc" >}}
+
+[PropertyNotNullableException]: {{< url path="Cortex.Reference.Exceptions.Decisions.PropertyNotNullableException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-bottom-block.md b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-bottom-block.md
new file mode 100644
index 000000000..2e2c3cdf4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-bottom-block.md
@@ -0,0 +1,81 @@
+---
+title: "If True Exit Bottom"
+linkTitle: "If True Exit Bottom"
+description: "Checks if a given value evaluates to `true`; if so the flow execution exits via the block's bottom port, otherwise it exits via the right port."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Decisions_If_IfTrueExitBottomBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Checks if a given [Value][Value Property] evaluates to `true`; if so the flow execution exits via the block's bottom port (green tick), otherwise it exits via the right port (red cross).
+
+## Examples
+
+### Value is true
+
+This example will check if `1 + 1 == 2` evaluates to `true` or `false`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `1 + 1 == 2` | `($)Value` is a variable whose value evaluates to type [Boolean][] |
+
+#### Result
+
+`1 + 1 == 2` is `true`, so the flow execution exits via the block's bottom port (green tick).
+
+***
+
+### Value is false
+
+This example will check if `1 + 1 == 1` evaluates to `true` or `false`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `1 + 1 == 1` | `($)Value` is a variable whose value evaluates to type [Boolean][] |
+
+#### Result
+
+`1 + 1 == 1` is `false`, so the flow execution exits via the block's right port (red cross).
+
+***
+
+## Properties
+
+### Value
+
+The [Value][Value Property] to check evaluates to `true` or `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | No value |
+
+## Exceptions
+
+None
+
+## Remarks
+
+No remarks for the block.
+
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-right-block.md b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-right-block.md
new file mode 100644
index 000000000..9aab2593f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/decisions/if/if-true-exit-right-block.md
@@ -0,0 +1,81 @@
+---
+title: "If True Exit Right"
+linkTitle: "If True Exit Right"
+description: "Checks if a given value evaluates to `true`; if so the flow execution exits via the block's right port, otherwise it exits via the bottom port."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Decisions_If_IfTrueExitRightBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Decisions.If.IfTrueExitRightBlock)
+
+## Description
+
+Checks if a given [Value][Value Property] evaluates to `true`; if so the flow execution exits via the block's right port (green tick), otherwise it exits via the bottom port (red cross).
+
+## Examples
+
+### Value is true
+
+This example will check if `1 + 1 == 2` evaluates to `true` or `false`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `1 + 1 == 2` | `($)Value` is a variable whose value evaluates to type [Boolean][] |
+
+#### Result
+
+`1 + 1 == 2` is `true`, so the flow execution exits via the block's right port (green tick).
+
+***
+
+### Value is false
+
+This example will check if `1 + 1 == 1` evaluates to `true` or `false`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | `($)Value`, with value `1 + 1 == 1` | `($)Value` is a variable whose value evaluates to type [Boolean][] |
+
+#### Result
+
+`1 + 1 == 1` is `false`, so the flow execution exits via the block's bottom port (red cross).
+
+***
+
+## Properties
+
+### Value
+
+The [Value][Value Property] to check evaluates to `true` or `false`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | No value |
+
+## Exceptions
+
+None
+
+## Remarks
+
+No remarks for the block.
+
+[Value Property]: {{< ref "#value" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/email/_index.md b/content/en/docs/2026.3/Reference/Blocks/email/_index.md
new file mode 100644
index 000000000..da41aa5a8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/email/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Email"
+linkTitle: "Email"
+description: "Blocks related to working with Emails."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/email/send-email/_index.md b/content/en/docs/2026.3/Reference/Blocks/email/send-email/_index.md
new file mode 100644
index 000000000..c12558811
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/email/send-email/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Send Email"
+linkTitle: "Send Email"
+description: "Blocks related to sending Emails."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/email/send-email/send-email-using-smtp-server-block.md b/content/en/docs/2026.3/Reference/Blocks/email/send-email/send-email-using-smtp-server-block.md
new file mode 100644
index 000000000..e7eb35acb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/email/send-email/send-email-using-smtp-server-block.md
@@ -0,0 +1,581 @@
+---
+title: "Send Email Using SMTP Server"
+linkTitle: "Send Email Using SMTP Server"
+description: "Sends an email using the specified SMTP server."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Email_SendEmail_SendEmailUsingSmtpServerBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Connects to an [SMTP][] server using the specified [Basic Email Session Details][Basic Email Session Details Property], and sends an [Email Message][Email Message Property].
+
+[Close Session][Close Session Property] can be specified to choose whether the connection to the [SMTP][] server is closed or is kept open for use on subsequent Send Email Using SMTP Server blocks.
+
+## Examples
+
+### Sending an email to a single recipient
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be to set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email to multiple recipients
+
+This example will send an email from `sender@gmail.com` to `recipient1@outlook.com`, `recipient2@outlook.com` and `recipient3@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient1@outlook.com"}, {"Name": null, "Address": "recipient2@outlook.com"}, {"Name": null, "Address": "recipient3@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient1@outlook.com"), new EmailAddress("recipient2@outlook.com"), new EmailAddress("recipient3@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient1@outlook.com`, `recipient2@outlook.com` and `recipient3@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with a CC or BCC recipient
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com` with `cc@outlook.com` and `bcc@outlook.com` as the [CC][CC Glossary] and [BCC][BCC Glossary] recipients for the email respectively. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [{"Name": null, "Address": "cc@outlook.com"}], "Bcc": [{"Name": null, "Address": "bcc@outlook.com"}], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: new List(){ new EmailAddress("cc@outlook.com") }, bcc: new List(){ new EmailAddress("bcc@outlook.com") }, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`. Both `cc@outlook.com` and `bcc@outlook.com` will also recieve copies of the email as they are listed as [CC][CC Glossary] and [BCC][BCC Glossary] recipients, and then the session is closed.
+
+***
+
+### Sending an email with multiple CC or BCC recipients
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com` with `cc1@outlook.com` and `cc2@outlook.com` as the [CC][CC Glossary] recipients and `bcc1@outlook.com` and `bcc2@outlook.com` as the [BCC][BCC Glossary] recipients for the email. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [{"Name": null, "Address": "cc1@outlook.com"}, {"Name": null, "Address": "cc2@outlook.com"}], "Bcc": [{"Name": null, "Address": "bcc1@outlook.com"}, {"Name": null, "Address": "bcc2@outlook.com"}], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: new List(){ new EmailAddress("cc1@outlook.com"), new EmailAddress("cc2@outlook.com") }, bcc: new List(){ new EmailAddress("bcc1@outlook.com"), new EmailAddress("bcc2@outlook.com") }, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`. Both `cc1@outlook.com` and `cc2@outlook.com` will also recieve copies of the email as they are listed as [CC][CC Glossary] recipients, and both `bcc1@outlook.com` and `bcc2@outlook.com` will recieve copies of the email as they are listed as [BCC][BCC Glossary] recipients. Finally, the session is closed.
+
+***
+
+### Sending an email with a different priority
+
+This example will send an email with [Urgent][] priority from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information on:
+
+- What priorities an email can be sent as, see [EmailMessagePriority][]
+- The effect of changing the [Priority][] of the [Email Message][Email Message Property], see [How does Priority affect sending an email?][]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": "EmailMessagePriority.Urgent", "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: EmailMessagePriority.Urgent, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [BodyFormat][] is `null`, the email will be sent with a [Text][] body.|
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Urgent][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with an HTML body
+
+This example will send an email with an [HTML][] body from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information on:
+
+- What other body formats an email can be sent with, see [EmailMessageBodyFormat][]
+- The effect of changing the [BodyFormat][] of the [Email Message][Email Message Property], see [How does BodyFormat affect sending an email?][]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": "EmailMessageBodyFormat.Html", "Body": "
Example email body
", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: EmailMessageBodyFormat.Html, body: "
Example email body
", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] is `null`, the email will be sent with [Normal][] priority. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and an [HTML][] body of `"
Example email body
"`, and then the session is closed.
+
+***
+
+### Sending an email with a single attachment
+
+This example will send an email with a single attachment, `attachment.txt`, from `sender@gmail.com` to `recipient@outlook.com`. The attachment is located at `C:\attachment.txt` on the server executing the flow. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information on:
+
+- Email attachments, see [Attachments][Attachments Remarks]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": ["C:\\attachment.txt"]}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: new List(){ @"C:\attachment.txt" })` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.
The [Attachments][Attachments Remarks] are added to the email by providing file paths pointing to the files to be attached to the email. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority containing a text file attachment, `attachment.txt`, is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with multiple attachments
+
+This example will send an email with mutiple attachments, `attachment1.txt` and `attachment2.txt` from `sender@gmail.com` to `recipient@outlook.com`. The attachments are located at the paths `C:\attachment1.txt` and `C:\attachment2.txt` on the server executing the flow. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information on:
+
+- Email attachments, see [Attachments][Attachments Remarks]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": ["C:\\attachment1.txt", "C:\\attachment2.txt"]}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: new List(){ @"C:\attachment1.txt", @"C:\attachment2.txt" })` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.
The [Attachments][Attachments Remarks] are added to the email by providing file paths pointing to the files to be attached to the email. |
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority containing two text file attachments, `attachment1.txt` and `attachment2.txt`, is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with UseSsl set to false
+
+This example will send an email from `sender@outlook.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp-mail.outlook.com` on [Port][] `587` which requires [UseSsl][] to be set to `false` within the [Basic Email Session Details][Basic Email Session Details Property].
+
+For more information on when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@outlook.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@outlook.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Basic Email Session Details][Basic Email Session Details Property] | `($)BasicEmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp-mail.outlook.com", "Port": 587, "UseSsl": false}, "Credentials": {"Domain": null, "Username": "sender@outlook.com", "Password": "encryptedPassword"}}`
In this example `($)BasicEmailSessionDetails` has been set up using the following [Expression][]:
`new BasicEmailSessionDetails(serverDetails: new ServerDetails("smtp-mail.outlook.com", 587, false), credentials: new UserCredentials("sender@outlook.com", "encryptedPassword"))` | `($)BasicEmailSessionDetails` is a variable of type [BasicEmailSessionDetails][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@outlook.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+## Properties
+
+### Email Message
+
+The [Email Message][Email Message Property] to send via the [SMTP][] server specified in the [Basic Email Session Details][Basic Email Session Details Property]. This property contains all of the information in relation to the email to be sent, these are:
+
+- [To][]
+- [From][]
+- [Cc][]
+- [Bcc][]
+- [Priority][]
+- [Subject][]
+- [BodyFormat][]
+- [Body][]
+- [Attachments][]
+
+Note that if the properties [Priority][] and [BodyFormat][] are set to `null` when [creating an EmailMessage using a constructor][], the email will be sent with [Normal][] priority and with a text body.
+
+For more detailed information on each of the properties, see [EmailMessage][].
+
+|||
+|----------|----------|
+| Data Type | [EmailMessage][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [EmailMessage][] with value shown below: |
+
+```json
+{
+ "To": [
+ {
+ "Name": null,
+ "Address": ""
+ }
+ ],
+ "From": {
+ "Name": "",
+ "Address": ""
+ },
+ "Cc": [],
+ "Bcc": [],
+ "Priority": "EmailMessagePriority.Normal",
+ "Subject": "",
+ "BodyFormat": "EmailMessageBodyFormat.Text",
+ "Body": "",
+ "Attachments": []
+}
+```
+
+### Basic Email Session Details
+
+The [Basic Email Session Details][Basic Email Session Details Property] object that includes all of the information required to open and maintain a session with an [SMTP][] server, including:
+
+- [ServerDetails][ServerDetails Property] - must be provided in order to connect to an [SMTP][] server. This object contains the properties [Host][], [Port][] and [UseSsl][]. For more information on:
+ - Supported server address formats, see [Supported formats for ServerDetails.Host][].
+ - When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+- [Credentials][Credentials Property] - must be provided in order to connect to an [SMTP][] server. This object contains the properties [Username][] and [Password][] to be used for authentication. For more information, see [Setting Credentials][].
+
+If the [Close Session][Close Session Property] property is set to `false`, then the session will be kept open and can be used in subsequent Send Email Using SMTP Server blocks which improves performance, see [Opening Sessions][] for more information.
+
+For more detailed information on each of the properties, see [BasicEmailSessionDetails][].
+
+|||
+|----------|----------|
+| Data Type | [BasicEmailSessionDetails][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)BasicEmailSessionDetails` with no value |
+
+### Close Session
+
+[Close Session][Close Session Property] can be specified to choose whether the session is closed or is kept open for use on subsequent Send Email Using SMTP Server blocks, this defaults to `false` if left blank, please see [Closing Sessions][Closing Sessions] for more information.
+
+|||
+|-----------------|----------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [ArgumentException][] |Thrown when [BodyFormat][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessageBodyFormat][] values (e.g. `(EmailMessageBodyFormat)10`).|
+| |Thrown when [Priority][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessagePriority][] values (e.g. `(EmailMessagePriority)10`).|
+| |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] is empty (i.e. `""`), contains only whitespace (i.e. `" "`) or contains the NUL character (i.e. `\0`).|
+| [ArgumentNullException][] |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] is `null`.|
+| [EmailSessionException][] |Thrown when an invalid [Port][] is provided in the [ServerDetails][] within the [Basic Email Session Details][Basic Email Session Details Property]. For more information, see [Invalid Port][].|
+| |Thrown when an invalid [Host][] is provided in the [ServerDetails][] within the [Basic Email Session Details][Basic Email Session Details Property]. For more information, see [Invalid Host][].|
+| |Thrown when a connection cannot be established; this typically occurs when [UseSsl][] within [Basic Email Session Details][Basic Email Session Details Property] is set to `false` with a [Port][] which requires it to be set to `true`. For more information, see [SSL Required][]. |
+| |Thrown when a connection cannot be established; this typically occurs when [UseSsl][] within [Basic Email Session Details][Basic Email Session Details Property] is set to `true` with a [Port][] which requires it to be set to `false`. For more information, see [SSL Unsupported][]. |
+| |Thrown when the [TLS][]/[SSL][] certificate has expired on the [Host][] or is untrusted or invalid. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when a locally installed anti-virus software replaces the [TLS][]/[SSL][] certificate in order to scan web traffic. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when the [CRL][] (Certificate Revocation List) server for the [TLS][]/[SSL][] certificate is down. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when the [Username][] and [Password][] in the [UserCredentials][] within [Basic Email Session Details][Basic Email Session Details Property] is incorrect. For more information, see [Invalid User Credentials][]. |
+| [FileNotFoundException][] |Thrown when a non-existent file path is provided in [Attachments][] within [Email Message][Email Message Property]. |
+| [IOException][] |Thrown when the desired socket is held by another process; re-running the flow typically solves this. |
+| |Thrown when a file path within [Attachments][] within the [Email Message][Email Message Property] contains leading spaces.|
+| |Thrown when a file path within [Attachments][] within the [Email Message][Email Message Property] contains invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`).|
+| [PathTooLongException][] |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] exceeds the system-defined maximum length (typically 32,767).|
+| [PropertyNullException][] |Thrown when the [Basic Email Session Details][Basic Email Session Details Property] is `null`. |
+| |Thrown when the [UserCredentials][] within [Basic Email Session Details][Basic Email Session Details Property] is `null`. |
+| |Thrown when the [ServerDetails][] within [Basic Email Session Details][Basic Email Session Details Property] is `null`. |
+| |Thrown when the [Host][] in [ServerDetails][] within [Basic Email Session Details][Basic Email Session Details Property] is `null`. |
+| |Thrown when the [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [To][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [From][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is `null`. |
+| [PropertyEmptyException][] |Thrown when the [Host][] in [ServerDetails][] within [Basic Email Session Details][Basic Email Session Details Property] is empty (i.e. `""`). |
+| |Thrown when the [To][] within [Email Message][Email Message Property] is empty (i.e. `[]`). |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is empty (i.e. `""`). |
+| [PropertyValueOutOfRangeException][] |Thrown when the [Port][] in the [ServerDetails][] within [Basic Email Session Details][Basic Email Session Details Property] is below `1` or above `65535`. For more information, see [Property Is Invalid][]. |
+| [SmtpCommandException][] |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is not of the correct format ([RFC 5321][]).|
+| |Thrown when the combined size of all of the attachments in the list of [Attachments][] within the [Email Message][Email Message Property] is greater than the limit specified by the email service provider; for [Outlook][] this is `20 MB` and for [Gmail][] this is `25 MB`.|
+| [UnauthorizedAccessException][] |Thrown when access is denied to a file provided in [Attachments][] within [Email Message][Email Message Property].|
+| |Thrown when a file path within the [Attachments][] property within [Email Message][Email Message Property] points to a folder.|
+
+## Remarks
+
+### How does Priority affect sending an email?
+
+An email sent with [Urgent][] or [NonUrgent][] priority will have its priority displayed differently depending on the email client. For example, [Outlook][] displays an email that has an [Urgent][] priority with a red exclamation mark like so:
+
+{{< figure src="/images/send-email-using-smtp-server-important-email.png" >}}
+
+For more information on how the priority of an email will be displayed, see the help provided by the respective email client.
+
+### How does BodyFormat affect sending an email?
+
+An email sent with an [HTML][] body will have its body displayed as an HTML page instead of as plain text. How the email looks in the email client may differ depending on the email client in use. For example, if the [Email Message][Email Message Property] has its [BodyFormat][] set to [HTML][] and the [Body][] has a value of:
+
+```json
+"
Example header text
Example paragraph text
"
+```
+
+[Outlook][] will display the email body as follows:
+
+{{< figure src="/images/send-email-using-smtp-server-html-email.png" >}}
+
+For more information on how the body of an email will be displayed, see the help provided by the respective email client.
+
+### Attachments
+
+Attachments can be sent in an email by providing a list of file paths in the [Attachments][] property of the [Email Message][Email Message Property]. For more information concerning attaching files to an email, see the sections below.
+
+#### Supported file path formats
+
+Each file path in the [Attachments][] within the [Email Message][Email Message Property] can be an:
+
+- Absolute file path
+- Relative file path
+- UNC file path
+
+where each file path must be accessible from the server executing the flow.
+
+For more information about each of these supported file path formats, please see [File & Folder Paths][].
+
+#### File paths need escaping
+
+Each file path in the [Attachments][] within the [Email Message][Email Message Property] requires \ characters to be escaped, otherwise each unescaped \ will be reported as an Invalid property value message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+- Escaping the `\` character with another `\` character (e.g. `"C:\\Attachments\\attachment.txt"`), or
+- Prepending an `@` character before the start of the File Path (e.g. `@"C:\Attachments\attachment.txt"`)
+
+#### Null file path
+
+If `null` is provided as a file path in the [Attachments][] within the [Email Message][Email Message Property], an [ArgumentNullException][] is thrown.
+
+#### Empty file path
+
+If an empty string is provided as a file path in the [Attachments][] within the [Email Message][Email Message Property], an [ArgumentException][] is thrown.
+
+#### File path does not exist
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] does not exist, a [FileNotFoundException][] is thrown.
+
+#### Invalid file path
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] is invalid (i.e. contains any of the following characters: ", *, ?, |, <, >, :, \, /), an [IOException][] will be thrown.
+
+#### File path points to a folder
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] points to a folder, an [UnauthorizedAccessException][] will be thrown.
+
+#### File path contains leading spaces
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] contains leading spaces they are not removed and an [IOException][] will be thrown; however, trailing spaces are removed.
+
+#### File path contains only whitespace or the NUL character
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] contains only whitespace (i.e. `" "`) or the NUL character (i.e. `\0`), an [ArgumentException][] will be thrown.
+
+#### File path exceeds the system-defined maximum length
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] exceeds the system-defined maximum length (typically 32,767), a [PathTooLongException][] will be thrown.
+
+#### User does not have necessary permissions to attach the file
+
+If the user the flow is executing as does not have permissions to access the file at the provided file path in the [Attachments][] within the [Email Message][Email Message Property], an [UnauthorizedAccessException][] will be thrown.
+
+#### Attachment size limit
+
+The combined size of all the [Attachments][] within the [Email Message][Email Message Property] must be less than the limit specified by the email service provider. If the combined size of all of the attachments is greater than the limit, an [SmtpCommandException][] will be thrown.
+
+For [Outlook][] this is `20 MB` and for [Gmail][] this is `25 MB`, for more information on the size limits for other email service providers, see the help provided by the respective email service provider.
+
+### Supported formats for ServerDetails.Host
+
+The following formats are supported for [Host][] in [ServerDetails][]:
+
+- Fully Qualified Domain Name (e.g. `"smtp.gmail.com"`)
+- Machine name (e.g. `"mail-server1"`)
+- IP address (e.g. `"127.0.0.1"`)
+- Localhost (e.g. `"localhost"`)
+
+### Setting UseSsl
+
+The [ServerDetails][] within the [Basic Email Session Details][Basic Email Session Details Property] specifies which [SMTP][] server to connect to. The value of the [UseSsl][] property inside this object depends on the [Host][] and [Port][] being connected to. There are two types of [SSL][]/[TLS][] connections that can occur:
+
+- [SSL][]/[TLS][] is used as soon as a connection is established
+- [SSL][]/[TLS][] is used via the STARTTLS command if it is available
+
+The above two points correspond to the [UseSsl][] property being set to `true` and `false` respectively. As such, generally the following rules can be followed to determine whether [UseSsl][] should be set to `true` or `false`:
+
+- If the [Port][] being connected to is `465` then [UseSsl][] should be set to `true`
+- If the [Port][] being connected to is `25` or `587` then [UseSsl][] should be set to `false`
+
+### Setting Credentials
+
+The [UserCredentials][] within the [Basic Email Session Details][Basic Email Session Details Property] specifies what user to connect as on the [SMTP][] server. The value of the [Username][] property may optionally be encrypted, however the [Password][] should be encrypted. For more information on how to encrypt the password, see [EncryptedText][].
+
+Note that the [UserCredentials][] object also contains a [Domain][] property which is ignored by this block.
+
+### Opening Sessions
+
+The Send Email Using SMTP Server block automatically handles creating and opening sessions for the specified [Basic Email Session Details][Basic Email Session Details Property] using the following rules:
+
+- If a session does not exist, a new session will be created, opened and used when the block runs.
+- If a session already exists but is closed, the session will be opened and used when the block runs.
+- If a session already exists and is open, the session will be used when the block runs.
+
+[Basic Email Session Details][Basic Email Session Details Property] will keep the session open across multiple Send Email Using SMTP Server blocks as long as [Close Session][Close Session Property] is set to `false`. Keeping the session open helps increase the performance of the block due to the subsequent blocks not having to spend resources creating and opening sessions for each execution.
+
+Note that for all [SSL][] connections, the protocol to be used will be negotiated with the server depending on which protocols are available. Similarly, the [SASL][] mechanism to be used will be negotiated with the mail server based on the available mechanisms.
+
+For information on how to explicitly close a session, please see [Closing Sessions][].
+
+### Closing Sessions
+
+Sessions can be explicitly closed by setting [Close Session][Close Session Property] to `true`. This causes the session to be closed after the [Email Message][Email Message Property] has been sent.
+
+If [Close Session][Close Session Property] is set to `false` the session will be closed when the [Variable][] that [Basic Email Session Details][Basic Email Session Details Property] is set to goes out of scope or the flow ends, whichever happens first. For more information about variables and scope, please see [Variables][].
+
+For information on how to open a session, please see [Opening Sessions][].
+
+### Known Limitations
+
+Currently unauthenticated [SMTP][] servers are not supported.
+
+This limitation may be removed in the future.
+
+[Email Message Property]: {{< ref "#email-message" >}}
+[Basic Email Session Details Property]: {{< ref "#basic-email-session-details" >}}
+[Close Session Property]: {{< ref "#close-session" >}}
+
+[How does Priority affect sending an email?]: {{< ref "#how-does-priority-affect-sending-an-email" >}}
+[How does BodyFormat affect sending an email?]: {{< ref "#how-does-bodyformat-affect-sending-an-email" >}}
+[Setting UseSsl]: {{< ref "#setting-usessl" >}}
+[Setting Credentials]: {{< ref "#setting-credentials" >}}
+[Opening Sessions]: {{< ref "#opening-sessions" >}}
+[Closing Sessions]: {{< ref "#closing-sessions" >}}
+[Attachments Remarks]: {{< ref "#attachments" >}}
+[Supported formats for ServerDetails.Host]: {{< ref "#supported-formats-for-serverdetailshost" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[EmailSessionException]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.MainDoc" >}}
+[Invalid Port]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidPort" >}}
+[Invalid Host]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidHost" >}}
+[SSL Required]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.SslRequired" >}}
+[SSL Unsupported]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.SslUnsupported" >}}
+[Invalid User Credentials]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidUserCredentials" >}}
+[creating an EmailMessage using a constructor]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.CreateAnEmailMessage" >}}
+
+[EmailSessionErrorCode Limitations]: {{< url path="Cortex.Reference.DataTypes.Email.EmailSessionErrorCode.Limitations" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ArgumentNullException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentNullException" >}}
+[FileNotFoundException]: {{< url path="MSDocs.DotNet.Api.System.IO.FileNotFoundException" >}}
+[IOException]: {{< url path="MSDocs.DotNet.Api.System.IO.IOException" >}}
+[PathTooLongException]: {{< url path="MSDocs.DotNet.Api.System.IO.PathTooLongException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[Property Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyIsInvalid">}}
+
+[SmtpCommandException]: {{< url path="MimeKit.Docs.SmtpCommandException" >}}
+[UnauthorizedAccessException]: {{< url path="MSDocs.DotNet.Api.System.UnauthorizedAccessException" >}}
+
+[EmailMessage]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.MainDoc" >}}
+[To]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.To" >}}
+[From]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.From" >}}
+[Cc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Cc" >}}
+[Bcc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Bcc" >}}
+[Priority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Priority" >}}
+[Subject]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Subject" >}}
+[BodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.BodyFormat" >}}
+[Body]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Body" >}}
+[Attachments]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Attachments" >}}
+
+[EmailAddress]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.MainDoc" >}}
+[Address]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.Address" >}}
+
+[EmailMessagePriority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.MainDoc" >}}
+[Normal]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.Normal" >}}
+[Urgent]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.Urgent" >}}
+[NonUrgent]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.NonUrgent" >}}
+
+[EmailMessageBodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.MainDoc" >}}
+[HTML]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.HTML" >}}
+[Text]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.Text" >}}
+
+[BasicEmailSessionDetails]: {{< url path="Cortex.Reference.DataTypes.Email.BasicEmailSessionDetails.MainDoc" >}}
+[Credentials Property]: {{< url path="Cortex.Reference.DataTypes.Email.BasicEmailSessionDetails.Credentials" >}}
+[ServerDetails Property]: {{< url path="Cortex.Reference.DataTypes.Email.BasicEmailSessionDetails.ServerDetails" >}}
+
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[Domain]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Domain" >}}
+[Username]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Username" >}}
+[Password]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Password" >}}
+
+[ServerDetails]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.MainDoc" >}}
+[Host]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Host" >}}
+[Port]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Port" >}}
+[UseSsl]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.UseSsl" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[SASL]: {{< url path="Cortex.Reference.Glossary.P-T.SASL" >}}
+[SMTP]: {{< url path="Cortex.Reference.Glossary.P-T.SMTP" >}}
+[SSL]: {{< url path="Cortex.Reference.Glossary.P-T.SSL" >}}
+[TLS]: {{< url path="Cortex.Reference.Glossary.P-T.TLS" >}}
+[BCC Glossary]: {{< url path="Cortex.Reference.Glossary.A-E.BCC" >}}
+[CC Glossary]: {{< url path="Cortex.Reference.Glossary.A-E.CC" >}}
+[CRL]: {{< url path="Cortex.Reference.Glossary.A-E.CRL" >}}
+[Gmail]: {{< url path="Cortex.Reference.Glossary.F-J.Gmail" >}}
+[Outlook]: {{< url path="Cortex.Reference.Glossary.K-O.Outlook" >}}
+[RFC 5321]: {{< url path="IETF.Email.RFC5321" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/_index.md b/content/en/docs/2026.3/Reference/Blocks/flows/_index.md
new file mode 100644
index 000000000..3a64c9787
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Flows"
+linkTitle: "Flows"
+description: "Blocks related to executing Flows."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/_index.md b/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/_index.md
new file mode 100644
index 000000000..df9410cb5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/_index.md
@@ -0,0 +1,5 @@
+---
+title: "End Flow"
+linkTitle: "End Flow"
+description: "Blocks that indicate the end of a flow."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/end-flow-block.md b/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/end-flow-block.md
new file mode 100644
index 000000000..b5b228d9b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/end-flow/end-flow-block.md
@@ -0,0 +1,37 @@
+---
+title: "End Flow"
+linkTitle: "End Flow"
+description: "Indicates the end of a flow."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Flows_EndFlow_EndFlowBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Flows.EndFlow.EndFlowBlock)
+
+## Description
+
+Indicates the end of a flow; when a flow execution reaches this block, the execution is ended.
+
+A flow can contain any number of these blocks, and they can be placed anywhere in a flow.
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; typically this will be left blank for this block.
+
+A breakpoint can be added to this block when debugging.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+None
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/_index.md b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/_index.md
new file mode 100644
index 000000000..fb5ca15c1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Run Flow"
+linkTitle: "Run Flow"
+description: "Blocks that are used to run another flow."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-async-block.md b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-async-block.md
new file mode 100644
index 000000000..981a8a0af
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-async-block.md
@@ -0,0 +1,272 @@
+---
+title: "Run Flow Async"
+linkTitle: "Run Flow Async"
+description: "Runs a chosen Flow asynchronously, returning a Task representing its execution."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Flows_RunFlow_RunFlowAsyncBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Flows.RunFlow.RunFlowAsyncBlock)
+
+## Description
+
+Runs a chosen [Flow][Flow Property] asynchronously using the [Inputs][Inputs Property] provided, returning an [IExecutionTask][] that represents the execution of the [Flow][Flow Property] in the [Execution Task][Execution Task Property] variable.
+
+## Examples
+
+### Running a Flow Asynchronously
+
+This example will run the [Flow][Flow Property] `add-database-entry` assigning the task representing the execution of the [Flow][Flow Property] to `($)ExecutionTask`.
+
+The [Flow][Flow Property] `add-database-entry` takes an [Input Variable][] `($)NewData`, which is then added to a database by the [Flow][Flow Property]. If no value is given for `($)NewData` the default value `DefaultNewDataValue` is used. The flow containing the [Run Flow Async][] block will then continue executing the rest of its blocks.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Flow][Flow Property] | [Flow][Flow Property], with value `add-database-entry` | [Flow][Flow Property] is of type [FlowReference][] |
+| [Inputs][Inputs Property] | | [Inputs][Inputs Property] is of type [InputVariables][] |
+| > NewData | `($)NewData`, with value `SomeNewDataToAddToDatabase` | `($)NewData` is of type [String][] |
+| [Execution Task][Execution Task Property] | `($)ExecutionTask`, with no value | `($)ExecutionTask` is a variable of type [IExecutionTask][] |
+
+#### Result
+
+`SomeNewDataToAddToDatabase` is passed into the [Input Variable][] `($)NewData` for the [Flow][Flow Property] `add-database-entry`, which results in the [Flow][Flow Property] starting its execution. The flow containing the [Run Flow Async][] block continues executing without waiting for it to complete.
+
+After the [Flow][Flow Property] has started running, the [Execution Task][Execution Task Property] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+```
+
+Once the [Flow][Flow Property] has added the database entry and has completed successfully, the [Execution Task][Execution Task Property]'s properties will be updated to the following:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+### Running a Flow Asynchronously with Default Input Variables
+
+This example will run the [Flow][Flow Property] `add-database-entry` assigning the task representing the execution of the [Flow][Flow Property] to `($)ExecutionTask`.
+
+The [Flow][Flow Property] `add-database-entry` takes an [Input Variable][] `($)NewData`, which is then added to a database by the [Flow][Flow Property]. If no value is given for `($)NewData` the default value `DefaultNewDataValue` is used. The flow containing the [Run Flow Async][] block will then continue executing the rest of its blocks.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Flow][Flow Property] | [Flow][Flow Property], with value `add-database-entry` | [Flow][Flow Property] is of type [FlowReference][] |
+| [Inputs][Inputs Property] | | [Inputs][Inputs Property] is of type [InputVariables][] |
+| > NewData | No value (defaults to `DefaultNewDataValue`) | `($)NewData` is of type [String][] |
+| [Execution Task][Execution Task Property] | `($)ExecutionTask`, with no value | `($)ExecutionTask` is a variable of type [IExecutionTask][] |
+
+#### Result
+
+As no value is passed into the [Input Variable][] `($)NewData` for the [Flow][Flow Property] `add-database-entry` the default of `DefaultNewDataValue` is used, which results in the [Flow][Flow Property] starting its execution. The flow containing the [Run Flow Async][] block continues executing without waiting for it to complete.
+
+After the [Flow][Flow Property] has started running, the [Execution Task][Execution Task Property] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+```
+
+Once the [Flow][Flow Property] has added the database entry and has completed successfully, the [Execution Task][Execution Task Property]'s properties will be updated to the following:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+## Properties
+
+### Flow
+
+The [Flow][Flow Property] that will be run.
+
+The [Literal Editor][] is the only editor available for this property, and it provides the developer a list of all available flows to choose from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [FlowReference][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][Literal Editor] |
+| Default Value | No value (defaults to `null`) |
+
+### Inputs
+
+The [Input Variables][Input Variable] that are passed to the [Flow][Flow Property] that will be run.
+
+It is recommended to use the [Literal Editor][] for this property as it detects and warns of changes to the Flow Contract, allowing users to [Sync the Editor][Syncing the Inputs Property with the Flow Contract].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [InputVariables][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][Literal Editor] |
+| Default Value | No initial value (Will be [synced][Syncing the Inputs Property with the Flow Contract] when the [Flow][Flow Property] is first [selected][Selecting a Flow]) |
+
+### Execution Task
+
+The [Execution Task][Execution Task Property] representing the asynchronous execution of the [Flow][Flow Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IExecutionTask][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][Variable Editor] |
+| Default Value | `($)ExecutionTask` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|------|-------------|
+| [InvalidInputVariablesException][] | Thrown when [Inputs][Inputs Property] is missing any [Input Variables][Input Variable] from the chosen [Flow][Flow Property]. See [Missing Input Variables][]. |
+| | Thrown when [Inputs][Inputs Property] has any extra [Input Variables][Input Variable] that are not in the chosen [Flow][Flow Property]. See [Extra Input Variables][]. |
+| | Thrown when [Inputs][Inputs Property] has any [Input Variables][Input Variable] that are not a valid type for [Input Variable][]. See [Input Variables of an Invalid Type][]. |
+
+## Remarks
+
+### Selecting a Flow
+
+{{< figure src="/images/run-flow-selecting-a-flow.gif" >}}
+
+A flow can be selected using the [Literal Editor][] on the [Flow Property][], a list of all available flows will be presented to the developer and can be searched by the Name or Id of a flow.
+
+When a [Flow][Flow Property] is selected the [Inputs Property][] will be [Synced with the Flow Contract][Syncing the Inputs Property with the Flow Contract].
+
+### Default Values
+
+If an [Input Variable][] has a default value, then this default value will be used when running the [Flow][Flow Property] if the corresponding value in the [Inputs Property][] is left empty. See [Running a Flow with Default Input Variables][] for an example.
+
+Also, if an [Input Variable][] has a default value, and the corresponding value in the [Inputs Property][] is not of the same type, a [Validation Error][] will be raised when the flow is validated.
+
+For more information see [Input Variables][Input Variable].
+
+### Parent Flow Ending Before Child Flow
+
+If the parent flow containing the [Run Flow Async][] block ends before the child [Flow][Flow Property], the child [Flow][Flow Property] will continue running to completion.
+
+### Exceptions Thrown by a Child Flow
+
+If the child [Flow][Flow Property] run by the [Run Flow Async][] block throws an exception that is unhandled then the exception is saved to the [Execution Task][Execution Task Property]. The parent flow containing the [Run Flow Async][] block will not pause when the exception is thrown unless the [Flow][Flow Property] is being waited on by a [Wait For][] block.
+
+See [Wait For Task][] block or [Wait For All Tasks][] block for more details.
+
+### Syncing the Inputs Property with the Flow Contract
+
+{{< figure src="/images/run-flow-contract-change.gif" >}}
+
+When a flow is first selected the [Inputs Property][] will be synced with the Flow Contract.
+
+When the contract of the flow changes (e.g. [Input Variables][Input Variable] of a called [Flow][Flow Property] are updated), a prompt will appear when the block is selected, allowing the user to sync the editor.
+
+This will cause:
+
+- Any missing [Input Variables][Input Variable] not present in the [Inputs Property][] to be added
+- Any extra [Input Variables][Input Variable] present in the [Inputs Property][] to be removed
+- Any [Input Variables][Input Variable] already present in the [Inputs Property][] to be retained
+
+[Undoing][] this action will cause the [Inputs Property][] to return to its previous state, from before it was synced, allowing any data to be retrieved from any extra [Input Variables][Input Variable].
+
+### Known Limitations
+
+#### The Flow Property can only use the Literal Editor
+
+The Literal Editor is the only editor available for the [Flow Property][]
+
+In future this limitation may be removed.
+
+#### Syncing the Inputs Property with the Flow Contract is not available when using editors other than the Literal Editor
+
+[Syncing the Inputs Property with the Flow Contract][] is only available when the [Inputs Property][] uses the [Literal Editor][]. If any other editor is used, the prompt to sync will not be displayed and any changes will need to be resolved manually.
+
+[Flow Property]: {{< ref "#flow" >}}
+[Inputs Property]: {{< ref "#inputs" >}}
+[Outputs Property]: {{< ref "#outputs" >}}
+[Execution Task Property]: {{< ref "#execution-task" >}}
+[Syncing the Inputs Property with the Flow Contract]: {{< ref "#syncing-the-inputs-property-with-the-flow-contract" >}}
+[Selecting a Flow]: {{< ref "#selecting-a-flow" >}}
+[Running a Flow with Default Input Variables]: {{< ref "#running-a-flow-asynchronously-with-default-input-variables" >}}
+[Default Values]: {{< ref "#default-values" >}}
+[Exceptions Thrown by a Child Flow]: {{< ref "#exceptions-thrown-by-a-child-flow" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Output Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.OutputVariablesStructure" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Validation Error]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+
+[Undoing]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.Undo" >}}
+
+[FlowReference]: {{< url path="Cortex.Reference.DataTypes.Flows.FlowReference.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[InputVariables]: {{< url path="Cortex.Reference.DataTypes.Flows.InputVariables.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[IExecutionTask]: {{< url path="Cortex.Reference.DataTypes.Tasks.IExecutionTask.MainDoc" >}}
+
+[Run Flow Async]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlowAsync.MainDoc" >}}
+
+[Wait For]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.MainDoc" >}}
+[Wait For Task]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForTask.TaskHasThrown" >}}
+[Wait For All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForAllTasksBlock.GetSuccessfulResults" >}}
+
+[InvalidInputVariablesException]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.MainDoc" >}}
+[Missing Input Variables]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.MissingInputVariables" >}}
+[Extra Input Variables]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.ExtraInputVariables" >}}
+[Input Variables of an Invalid Type]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.InputVariablesOfAnInvalidType" >}}
+
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-block.md b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-block.md
new file mode 100644
index 000000000..eb3235979
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/run-flow/run-flow-block.md
@@ -0,0 +1,246 @@
+---
+title: "Run Flow"
+linkTitle: "Run Flow"
+description: "Runs a chosen Flow, returning any output variables."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Flows_RunFlow_RunFlowBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Flows.RunFlow.RunFlowBlock)
+
+## Description
+
+Runs a chosen [Flow][Flow Property] using the [Inputs][Inputs Property] provided, returning any [Output Variables][Output Variable] from the [Flow][Flow Property] in the [Outputs][Outputs Property] variable.
+
+## Examples
+
+### Running a Flow
+
+This example will run the [Flow][Flow Property] `square-number-flow` saving the output variables to `($)Outputs`.
+
+The [Flow][Flow Property] `square-number-flow` takes an [Input Variable][] `($)NumberToSquare`, which is then multiplied by itself and saved to the [Output Variable][] `($)SquaredNumber`. If no value is given for `($)NumberToSquare` the default value `10` is used. The flow contains a block that checks that the [Input Variable][] `($)NumberToSquare` is larger than `0`, an exception is thrown by `square-number-flow` if `($)NumberToSquare` is not larger than `0`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Flow][Flow Property] | [Flow][Flow Property], with value `square-number-flow` | [Flow][Flow Property] is of type [FlowReference][] |
+| [Inputs][Inputs Property] | | [Inputs][Inputs Property] is of type [InputVariables][] |
+| > NumberToSquare | `($)NumberToSquare`, with value `5` | `($)NumberToSquare` is of type [Int32][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` is a variable of type [Structure][] |
+
+#### Result
+
+`5` is passed into the [Input Variable][] `($)NumberToSquare` for the [Flow][Flow Property] `square-number-flow`, which results in `25` being saved to the [Output Variable][] `($)SquaredNumber`. This results in the variable `($)Outputs` being updated to the following:
+
+```json
+{
+ "SquaredNumber": 25
+}
+```
+
+***
+
+### Running a Flow with Default Input Variables
+
+This example will run the [Flow][Flow Property] `square-number-flow` saving the output variables to `($)Outputs`.
+
+The [Flow][Flow Property] `square-number-flow` takes an [Input Variable][] `($)NumberToSquare`, which is then multiplied by itself and saved to the [Output Variable][] `($)SquaredNumber`. If no value is given for `($)NumberToSquare` the default value `10` is used. The flow contains a block that checks that the [Input Variable][] `($)NumberToSquare` is larger than `0`, an exception is thrown by `square-number-flow` if `($)NumberToSquare` is not larger than `0`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Flow][Flow Property] | [Flow][Flow Property], with value `square-number-flow` | [Flow][Flow Property] is of type [FlowReference][] |
+| [Inputs][Inputs Property] | | [Inputs][Inputs Property] is of type [InputVariables][] |
+| > NumberToSquare | No value (defaults to `10`) | `NumberToSquare` is of type [Int32][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` is a variable of type [Structure][] |
+
+#### Result
+
+As no value is passed into the [Input Variable][] `($)NumberToSquare` for the [Flow][Flow Property] `square-number-flow` the default of `10` is used, which results in `100` being saved to the [Output Variable][] `($)SquaredNumber`. This results in the variable `($)Outputs` being updated to the following:
+
+```json
+{
+ "SquaredNumber": 100
+}
+```
+
+For more information see [Default Values][].
+
+***
+
+### Running a Flow that Throws an Exception
+
+This example will run the [Flow][Flow Property] `square-number-flow` saving the output variables to `($)Outputs`.
+
+The [Flow][Flow Property] `square-number-flow` takes an [Input Variable][] `($)NumberToSquare`, which is then multiplied by itself and saved to the [Output Variable][] `($)SquaredNumber`. If no value is given for `($)NumberToSquare` the default value `10` is used. The flow contains a block that checks that the [Input Variable][] `($)NumberToSquare` is larger than `0`, an exception is thrown by `square-number-flow` if `($)NumberToSquare` is not larger than `0`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Flow][Flow Property] | [Flow][Flow Property], with value `square-number-flow` | [Flow][Flow Property] is of type [FlowReference][] |
+| [Inputs][Inputs Property] | | [Inputs][Inputs Property] is of type [InputVariables][] |
+| > NumberToSquare | `($)NumberToSquare`, with value `-1` | `($)NumberToSquare` is of type [Int32][] |
+| [Outputs][Outputs Property] | `($)Outputs`, with no value | `($)Outputs` is a variable of type [Structure][] |
+
+#### Result
+
+The [Flow][Flow Property] `square-number-flow` contains a block that checks that the [Input Variable][] `($)NumberToSquare` is larger than `0`; if this is not the case an exception is thrown.
+
+In this example, as `-1` is passed into the [Input Variable][] `($)NumberToSquare` and is not greater than `0`, `($)Outputs` is not updated and an exception is thrown. For more information on how the exception is thrown and how to handle the exception see [Exceptions Thrown by a Child Flow][].
+
+***
+
+## Properties
+
+### Flow
+
+The [Flow][Flow Property] that will be run.
+
+The [Literal Editor][] is the only editor available for this property, and it provides the developer a list of all available flows to choose from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [FlowReference][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][Literal Editor] |
+| Default Value | No value (defaults to `null`) |
+
+### Inputs
+
+The [Input Variables][Input Variable] that are passed to the [Flow][Flow Property] that will be run.
+
+It is recommended to use the [Literal Editor][] for this property as it detects and warns of changes to the Flow Contract, allowing users to [Sync the Editor][Syncing the Inputs Property with the Flow Contract].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [InputVariables][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][Literal Editor] |
+| Default Value | No initial value (Will be [synced][Syncing the Inputs Property with the Flow Contract] when the [Flow][Flow Property] is first [selected][Selecting a Flow]) |
+
+### Outputs
+
+The [Output Variables][Output Variable] from the [Flow][Flow Property].
+
+Each of the [Output Variables][Output Variable] will be saved to a [Structure][], where the key is the name of the variable and the item is the value of the variable.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Structure][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][Variable Editor] |
+| Default Value | `($)Outputs` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|------|-------------|
+| [InvalidInputVariablesException][] | Thrown when [Inputs][Inputs Property] is missing any [Input Variables][Input Variable] from the chosen [Flow][Flow Property]. See [Missing Input Variables][]. |
+| | Thrown when [Inputs][Inputs Property] has any extra [Input Variables][Input Variable] that are not in the chosen [Flow][Flow Property]. See [Extra Input Variables][]. |
+| | Thrown when [Inputs][Inputs Property] has any [Input Variables][Input Variable] that are not a valid type for [Input Variable][]. See [Input Variables of an Invalid Type][]. |
+
+## Remarks
+
+### Selecting a Flow
+
+{{< figure src="/images/run-flow-selecting-a-flow.gif" >}}
+
+A flow can be selected using the [Literal Editor][] on the [Flow Property][], a list of all available flows will be presented to the developer and can be searched by the Name or Id of a flow.
+
+When a [Flow][Flow Property] is selected the [Inputs Property][] will be [Synced with the Flow Contract][Syncing the Inputs Property with the Flow Contract].
+
+### Default Values
+
+If an [Input Variable][] has a default value, then this default value will be used when running the [Flow][Flow Property] if the corresponding value in the [Inputs Property][] is left empty. See [Running a Flow with Default Input Variables][] for an example.
+
+Also, if an [Input Variable][] has a default value, and the corresponding value in the [Inputs Property][] is not of the same type, a [Validation Error][] will be raised when the flow is validated.
+
+For more information see [Input Variables][Input Variable].
+
+### Exceptions Thrown by a Child Flow
+
+If the [Flow][Flow Property] run by the Run Flow block throws an exception that is unhandled then it is rethrown by the Run Flow block. This can then be handled by any connected [Handle Block Exception blocks][]. See [Running a Flow that Throws an Exception][] for an example.
+
+If an exception thrown by a block is not handled by any connected [Handle Block Exception blocks][], it will be passed to the [Handle Workspace Exception][] block on the same workspace.
+
+This process repeats until:
+
+- The exception is handled, or
+- The exception reaches the flow's top-level workspace, is not handled by any [Handle Block Exception blocks][] and the top-level workspace does not contain a [Handle Workspace Exception][] block. At this stage, the exception is handled by the flow's [Handle Flow Exception][] block.
+
+For more information see [Handling Exceptions][].
+
+### Syncing the Inputs Property with the Flow Contract
+
+{{< figure src="/images/run-flow-contract-change.gif" >}}
+
+When a flow is first selected the [Inputs Property][] will be synced with the Flow Contract.
+
+When the contract of the flow changes (e.g. [Input Variables][Input Variable] of a called [Flow][Flow Property] are updated), a prompt will appear when the block is selected, allowing the user to sync the editor.
+
+This will cause:
+
+- Any missing [Input Variables][Input Variable] not present in the [Inputs Property][] to be added
+- Any extra [Input Variables][Input Variable] present in the [Inputs Property][] to be removed
+- Any [Input Variables][Input Variable] already present in the [Inputs Property][] to be retained
+
+[Undoing][] this action will cause the [Inputs Property][] to return to its previous state, from before it was synced, allowing any data to be retrieved from any extra [Input Variables][Input Variable].
+
+### Known Limitations
+
+#### The Flow Property can only use the Literal Editor
+
+The Literal Editor is the only editor available for the [Flow Property][]
+
+In future this limitation may be removed.
+
+#### Syncing the Inputs Property with the Flow Contract is not available when using editors other than the Literal Editor
+
+[Syncing the Inputs Property with the Flow Contract][] is only available when the [Inputs Property][] uses the [Literal Editor][]. If any other editor is used, the prompt to sync will not be displayed and any changes will need to be resolved manually.
+
+[Flow Property]: {{< ref "#flow" >}}
+[Inputs Property]: {{< ref "#inputs" >}}
+[Outputs Property]: {{< ref "#outputs" >}}
+[Syncing the Inputs Property with the Flow Contract]: {{< ref "#syncing-the-inputs-property-with-the-flow-contract" >}}
+[Selecting a Flow]: {{< ref "#selecting-a-flow" >}}
+[Running a Flow that Throws an Exception]: {{< ref "#running-a-flow-that-throws-an-exception" >}}
+[Running a Flow with Default Input Variables]: {{< ref "#running-a-flow-with-default-input-variables" >}}
+[Default Values]: {{< ref "#default-values" >}}
+[Exceptions Thrown by a Child Flow]: {{< ref "#exceptions-thrown-by-a-child-flow" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Input Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Output Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.OutputVariablesStructure" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Validation Error]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+
+[Undoing]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.Undo" >}}
+
+[FlowReference]: {{< url path="Cortex.Reference.DataTypes.Flows.FlowReference.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[InputVariables]: {{< url path="Cortex.Reference.DataTypes.Flows.InputVariables.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+
+[InvalidInputVariablesException]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.MainDoc" >}}
+[Missing Input Variables]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.MissingInputVariables" >}}
+[Extra Input Variables]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.ExtraInputVariables" >}}
+[Input Variables of an Invalid Type]: {{< url path="Cortex.Reference.Exceptions.Flows.Execution.InvalidInputVariablesException.InputVariablesOfAnInvalidType" >}}
+
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/_index.md b/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/_index.md
new file mode 100644
index 000000000..80df19ef8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Start Flow"
+linkTitle: "Start Flow"
+description: "Blocks that indicate the start of a flow."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/start-flow-block.md b/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/start-flow-block.md
new file mode 100644
index 000000000..984fbcba4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/flows/start-flow/start-flow-block.md
@@ -0,0 +1,37 @@
+---
+title: "Start Flow"
+linkTitle: "Start Flow"
+description: "Indicates the start of a flow."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Flows_StartFlow_StartFlowBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Flows.StartFlow.StartFlowBlock)
+
+## Description
+
+Indicates the start of a flow.
+
+This is always the first block in a flow. It cannot be deleted, and a flow can only contain one of these blocks.
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; typically this will be left blank for this block.
+
+A breakpoint can be added to this block when debugging.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+None
diff --git a/content/en/docs/2026.3/Reference/Blocks/google-workspace/_index.md b/content/en/docs/2026.3/Reference/Blocks/google-workspace/_index.md
new file mode 100644
index 000000000..8d6e24e3f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/google-workspace/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Google Workspace"
+linkTitle: "Google Workspace"
+description: "Blocks related to working with Google Workspace."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/_index.md b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/_index.md
new file mode 100644
index 000000000..f53ba8b4b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Gmail"
+linkTitle: "Gmail"
+description: "Blocks related to working with Gmail."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/_index.md b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/_index.md
new file mode 100644
index 000000000..c12558811
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Send Email"
+linkTitle: "Send Email"
+description: "Blocks related to sending Emails."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/send-email-using-gmail-block.md b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/send-email-using-gmail-block.md
new file mode 100644
index 000000000..025d04ad8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/google-workspace/gmail/send-email/send-email-using-gmail-block.md
@@ -0,0 +1,741 @@
+---
+title: "Send Email Using Gmail"
+linkTitle: "Send Email Using Gmail"
+description: "Sends an email using the SMTP server hosted by Gmail."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_GoogleWorkspace_Gmail_SendEmail_SendEmailUsingGmailBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Connects to the [SMTP][] server hosted by [Gmail][] using the specified [Gmail Session Details][Gmail Session Details Property], and sends an [Email Message][Email Message Property].
+
+[Close Session][Close Session Property] can be specified to choose whether the connection to the [SMTP][] server hosted by [Gmail][] is closed or is kept open for use on subsequent Send Email Using Gmail blocks.
+
+## Examples
+
+Sending emails using a username and password is not recommended and is being phased out by [Gmail][]. Using a username and password will currently only work for [Gmail][] accounts associated with a Google Workspace that has access enabled for less secure apps. Instead, it is recommended to use an app password or OAuth, for more information, see [Less Secure Apps][].
+
+In the following examples, where a [UserCredentials][] is used in the [Gmail Session Details][Gmail Session Details Property], the [Password][] property can be either the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password.
+
+For more information, see [Setting Credentials][].
+
+### Sending an email to a single recipient
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be to set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email to multiple recipients
+
+This example will send an email from `sender@gmail.com` to `recipient1@outlook.com`, `recipient2@outlook.com` and `recipient3@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient1@outlook.com"}, {"Name": null, "Address": "recipient2@outlook.com"}, {"Name": null, "Address": "recipient3@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient1@outlook.com"), new EmailAddress("recipient2@outlook.com"), new EmailAddress("recipient3@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient1@outlook.com`, `recipient2@outlook.com` and `recipient3@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with a CC or BCC recipient
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com` with `cc@outlook.com` and `bcc@outlook.com` as the [CC][CC Glossary] and [BCC][BCC Glossary] recipients for the email respectively. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [{"Name": null, "Address": "cc@outlook.com"}], "Bcc": [{"Name": null, "Address": "bcc@outlook.com"}], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: new List(){ new EmailAddress("cc@outlook.com") }, bcc: new List(){ new EmailAddress("bcc@outlook.com") }, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`. Both `cc@outlook.com` and `bcc@outlook.com` will also recieve copies of the email as they are listed as [CC][CC Glossary] and [BCC][BCC Glossary] recipients, and then the session is closed.
+
+***
+
+### Sending an email with multiple CC or BCC recipients
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com` with `cc1@outlook.com` and `cc2@outlook.com` as the [CC][CC Glossary] recipients and `bcc1@outlook.com` and `bcc2@outlook.com` as the [BCC][BCC Glossary] recipients for the email. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [{"Name": null, "Address": "cc1@outlook.com"}, {"Name": null, "Address": "cc2@outlook.com"}], "Bcc": [{"Name": null, "Address": "bcc1@outlook.com"}, {"Name": null, "Address": "bcc2@outlook.com"}], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: new List(){ new EmailAddress("cc1@outlook.com"), new EmailAddress("cc2@outlook.com") }, bcc: new List(){ new EmailAddress("bcc1@outlook.com"), new EmailAddress("bcc2@outlook.com") }, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`. Both `cc1@outlook.com` and `cc2@outlook.com` will also recieve copies of the email as they are listed as [CC][CC Glossary] recipients, and both `bcc1@outlook.com` and `bcc2@outlook.com` will recieve copies of the email as they are listed as [BCC][BCC Glossary] recipients. Finally, the session is closed.
+
+***
+
+### Sending an email with a different priority
+
+This example will send an email with [Urgent][] priority from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information on:
+
+- What priorities an email can be sent as, see [EmailMessagePriority][]
+- The effect of changing the [Priority][] of the [Email Message][Email Message Property], see [How does Priority affect sending an email?][]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": "EmailMessagePriority.Urgent", "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: EmailMessagePriority.Urgent, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [BodyFormat][] is `null`, the email will be sent with a [Text][] body. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Urgent][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with an HTML body
+
+This example will send an email with an [HTML][] body from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information on:
+
+- What other body formats an email can be sent with, see [EmailMessageBodyFormat][]
+- The effect of changing the [BodyFormat][] of the [Email Message][Email Message Property], see [How does BodyFormat affect sending an email?][]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": "EmailMessageBodyFormat.Html", "Body": "
Example email body
", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: EmailMessageBodyFormat.Html, body: "
Example email body
", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] is `null`, the email will be sent with [Normal][] priority. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and an [HTML][] body of `"
Example email body
"`, and then the session is closed.
+
+***
+
+### Sending an email with a single attachment
+
+This example will send an email with a single attachment, `attachment.txt`, from `sender@gmail.com` to `recipient@outlook.com`. The attachment is located at `C:\attachment.txt` on the server executing the flow. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information on:
+
+- Email attachments, see [Attachments][Attachments Remarks]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": ["C:\\attachment.txt"]}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: new List(){ @"C:\attachment.txt" })` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.
The [Attachments][Attachments Remarks] are added to the email by providing file paths pointing to the files to be attached to the email. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority containing a text file attachment, `attachment.txt`, is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with multiple attachments
+
+This example will send an email with mutiple attachments, `attachment1.txt` and `attachment2.txt` from `sender@gmail.com` to `recipient@outlook.com`. The attachments are located at the paths `C:\attachment1.txt` and `C:\attachment2.txt` on the server executing the flow. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information on:
+
+- Email attachments, see [Attachments][Attachments Remarks]
+- When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": ["C:\\attachment1.txt", "C:\\attachment2.txt"]}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: new List(){ @"C:\attachment1.txt", @"C:\attachment2.txt" })` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.
The [Attachments][Attachments Remarks] are added to the email by providing file paths pointing to the files to be attached to the email. |
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority containing two text file attachments, `attachment1.txt` and `attachment2.txt`, is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email with UseSsl set to false
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `587` which requires [UseSsl][] to be set to `false` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information on when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 587, "UseSsl": false}, "Credentials": {"Domain": null, "Username": "sender@gmail.com", "Password": "encryptedPassword"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 587, false), credentials: new UserCredentials("sender@gmail.com", "encryptedPassword"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [Password][] property in the [UserCredentials][] can be the password associated with the username (if the account is associated with a Google Workspace with access enabled for less secure apps) or an app password, for more information, see [Setting Credentials][].
The [Password][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+### Sending an email using OAuth
+
+This example will send an email from `sender@gmail.com` to `recipient@outlook.com`. The example uses the [SMTP][] server hosted at `smtp.gmail.com` on [Port][] `465` which requires [UseSsl][] to be to set to `true` within the [Gmail Session Details][Gmail Session Details Property].
+
+For more information about when [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+
+The authentication mechanism used in this example is OAuth, the specific authentication flow used is often referred to as "Two-Legged OAuth". Therefore, for this example to work correctly:
+
+- Credentials provided must be for a [Gmail][] account connected to a Google Workspace
+- Credentials in [Gmail Session Details][Gmail Session Details Property] must be a [GmailOAuthCertificateCredentials][] which requires:
+ - [CertificatePath][]
+ - [CertificatePassword][]
+ - [FromAddress][]
+ - [ClientId][]
+- [CertificatePath][] must be a path pointing to a certificate accessible from the server executing the flow
+
+For more information on:
+
+- What each of the properties in the [GmailOAuthCertificateCredentials][] needs to be, see [GmailOAuthCertificateCredentials][]
+- Using a certificate file, see [Certificate Files][]
+- How to set up the Gmail account so that this authentication mechanism can be used, see [Setting up a Gmail account for OAuth authentication][]
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@gmail.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@gmail.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Gmail Session Details][Gmail Session Details Property] | `($)GmailSessionDetails` with value `{"ServerDetails": {"Host": "smtp.gmail.com", "Port": 465, "UseSsl": true}, "Credentials": {"CertificatePath": "C:\\certificate.p12", "CertificatePassword": "encryptedPassword", "FromAddress": "sender@gmail.com", "ClientId": "clientId"}}`
In this example `($)GmailSessionDetails` has been set up using the following [Expression][]:
`new GmailSessionDetails(serverDetails: new ServerDetails("smtp.gmail.com", 465, true), credentials: new GmailOAuthCertificateCredentials(@"C:\certificate.p12", "encryptedPassword", "sender@gmail.com", "clientId"))` | `($)GmailSessionDetails` is a variable of type [GmailSessionDetails][]
The [CertificatePath][] in the [GmailOAuthCertificateCredentials][] is a path pointing to a certificate accessible from the server executing the flow.
For information on:
What each of the properties in the [GmailOAuthCertificateCredentials][] needs to be, see [GmailOAuthCertificateCredentials][]
How to set up the [Gmail][] account so that this authentication mechanism can be used, see [Setting up a Gmail account for OAuth authentication][]
The [CertificatePassword][] property must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` |`($)CloseSession` is a variable of type [Boolean][] |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@gmail.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the session is closed.
+
+***
+
+## Properties
+
+### Email Message
+
+The [Email Message][Email Message Property] to send via the [SMTP][] server hosted by [Gmail][] specified in the [Gmail Session Details][Gmail Session Details Property]. This property contains all of the information in relation to the email to be sent, these are:
+
+- [To][]
+- [From][]
+- [Cc][]
+- [Bcc][]
+- [Priority][]
+- [Subject][]
+- [BodyFormat][]
+- [Body][]
+- [Attachments][]
+
+Note that if the properties [Priority][] and [BodyFormat][] are set to `null` when [creating an EmailMessage using a constructor][], the email will be sent with [Normal][] priority and with a [Text][] body.
+
+For more detailed information on each of the properties, see [EmailMessage][].
+
+|||
+|----------|----------|
+| Data Type | [EmailMessage][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [EmailMessage][] with value shown below: |
+
+```json
+{
+ "To": [
+ {
+ "Name": null,
+ "Address": ""
+ }
+ ],
+ "From": {
+ "Name": "",
+ "Address": ""
+ },
+ "Cc": [],
+ "Bcc": [],
+ "Priority": "EmailMessagePriority.Normal",
+ "Subject": "",
+ "BodyFormat": "EmailMessageBodyFormat.Text",
+ "Body": "",
+ "Attachments": []
+}
+```
+
+### Gmail Session Details
+
+The [Gmail Session Details][Gmail Session Details Property] object that includes all of the information required to open and maintain a session with an [SMTP][] server hosted by [Gmail][], including:
+
+- [ServerDetails][ServerDetails Property] - must be provided in order to connect to an [SMTP][] server. This object contains the properties [Host][], [Port][] and [UseSsl][]. For more information on:
+ - Supported server address formats, see [Supported formats for ServerDetails.Host][].
+ - When [UseSsl][] should be set to `true` or `false`, see [Setting UseSsl][].
+- [Credentials][Credentials Property] - must be provided in order to connect to an [SMTP][] server. This object must be a [UserCredentials][] or a [GmailOAuthCertificateCredentials][] and is used for authentication. For more information on how to configure each of these, see [Setting Credentials][].
+
+If the [Close Session][Close Session Property] property is set to `false`, then the session will be kept open and can be used in subsequent Send Email Using Gmail blocks which improves performance, see [Opening Sessions][] for more information.
+
+For more detailed information on each of the properties, see [GmailSessionDetails][].
+
+|||
+|----------|----------|
+| Data Type | [GmailSessionDetails][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)GmailSessionDetails` with no value |
+
+### Close Session
+
+[Close Session][Close Session Property] can be specified to choose whether the session is closed or is kept open for use on subsequent Send Email Using Gmail blocks, this defaults to `false` if left blank, please see [Closing Sessions][Closing Sessions] for more information.
+
+|||
+|-----------------|----------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [ArgumentException][] |Thrown when [BodyFormat][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessageBodyFormat][] values (e.g. `(EmailMessageBodyFormat)10`).|
+| |Thrown when [Priority][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessagePriority][] values (e.g. `(EmailMessagePriority)10`).|
+| |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] is empty (i.e. `""`), contains only whitespace (i.e. `" "`) or contains the NUL character (i.e. `\0`).|
+| [ArgumentNullException][] |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] is `null`.|
+| [EmailSessionException][] |Thrown when an invalid [Port][] is provided in the [ServerDetails][] within the [Gmail Session Details][Gmail Session Details Property]. For more information, see [Invalid Port][].|
+| |Thrown when an invalid [Host][] is provided in the [ServerDetails][] within the [Gmail Session Details][Gmail Session Details Property]. For more information, see [Invalid Host][].|
+| |Thrown when a connection cannot be established; this typically occurs when [UseSsl][] within [Gmail Session Details][Gmail Session Details Property] is set to `false` with a [Port][] which requires it to be set to `true`. For more information, see [SSL Required][]. |
+| |Thrown when a connection cannot be established; this typically occurs when [UseSsl][] within [Gmail Session Details][Gmail Session Details Property] is set to `true` with a [Port][] which requires it to be set to `false`. For more information, see [SSL Unsupported][]. |
+| |Thrown when the [TLS][]/[SSL][] certificate has expired on the [Host][] or is untrusted or invalid. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when a locally installed anti-virus software replaces the [TLS][]/[SSL][] certificate in order to scan web traffic. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when the [CRL][] (Certificate Revocation List) server for the [TLS][]/[SSL][] certificate is down. For more information, see [SSL Unsupported][]. Note that this exception has the same category and error code as the above row, this is a known limitation, see [EmailSessionErrorCode Limitations][]. |
+| |Thrown when the [Username][] and [Password][] in the [UserCredentials][] within [Gmail Session Details][Gmail Session Details Property] is incorrect. For more information, see [Invalid User Credentials][]. |
+| |Thrown when an invalid [CertificatePath][] and [CertificatePassword][] combination has been provided in the [GmailOAuthCertificateCredentials][]. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] in the [GmailOAuthCertificateCredentials][] points to an invalid [SSL][] certificate. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] points to a non-existent file. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] points to a folder. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] is longer than the system defined maximum length (typically 32,767). For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] contains only whitespace (i.e. `" "`) or contains the NUL character (i.e. `\0`). For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] contains leading spaces. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][] contains invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`). For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when access is denied to the file at the [CertificatePath][] provided in the [GmailOAuthCertificateCredentials][]. For more information, see [Invalid SSL Certificate][]. |
+| |Thrown when an invalid [FromAddress][] and [ClientId][] combination has been provided in the [GmailOAuthCertificateCredentials][]. For more information, see [Invalid Gmail Client Credentials][].|
+| [FileNotFoundException][] |Thrown when a non-existent file path is provided in [Attachments][] within [Email Message][Email Message Property]. |
+| [IOException][] |Thrown when the desired socket is held by another process; re-running the flow typically solves this. |
+| |Thrown when a file path within [Attachments][] within the [Email Message][Email Message Property] contains leading spaces.|
+| |Thrown when a file path within [Attachments][] within the [Email Message][Email Message Property] contains invalid characters (i.e. `"`, `*`, `?`, `\|`, `<`, `>`, `:`, `\`, `/`).|
+| [PathTooLongException][] |Thrown when a file path provided in the [Attachments][] within the [Email Message][Email Message Property] exceeds the system-defined maximum length (typically 32,767).|
+| [PropertyNullException][] |Thrown when the [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [UserCredentials][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [ServerDetails][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [Host][] in [ServerDetails][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [To][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [From][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [CertificatePath][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [CertificatePassword][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [FromAddress][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| |Thrown when the [ClientId][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is `null`. |
+| [PropertyEmptyException][] |Thrown when the [Host][] in [ServerDetails][] within [Gmail Session Details][Gmail Session Details Property] is empty (i.e. `""`). |
+| |Thrown when the [To][] within [Email Message][Email Message Property] is empty (i.e. `[]`). |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is empty (i.e. `""`). |
+| |Thrown when the [CertificatePath][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is empty (i.e. `""`). |
+| |Thrown when the [CertificatePassword][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is empty (i.e. `""`). |
+| |Thrown when the [FromAddress][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is empty (i.e. `""`). |
+| |Thrown when the [ClientId][] in the [GmailOAuthCertificateCredentials][] within [Gmail Session Details][Gmail Session Details Property] is empty (i.e. `""`). |
+| [PropertyValueOutOfRangeException][] |Thrown when the [Port][] in the [ServerDetails][] within [Gmail Session Details][Gmail Session Details Property] is below `1` or above `65535`. For more information, see [Property Is Invalid][]. |
+| [SmtpCommandException][] |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is not of the correct format ([RFC 5321][]).|
+| |Thrown when the combined size of all of the attachments in the list of [Attachments][] within the [Email Message][Email Message Property] is greater than the limit specified by the email service provider; for [Gmail][] this is `25 MB`.|
+| [UnauthorizedAccessException][] |Thrown when access is denied to a file provided in [Attachments][] within [Email Message][Email Message Property].|
+| |Thrown when a file path within the [Attachments][] property within [Email Message][Email Message Property] points to a folder.|
+
+## Remarks
+
+### How does Priority affect sending an email?
+
+An email sent with [Urgent][] or [NonUrgent][] priority will have its priority displayed differently depending on the email client. For example, [Outlook][] displays an email that has an [Urgent][] priority with a red exclamation mark like so:
+
+{{< figure src="/images/send-email-using-smtp-server-important-email.png" >}}
+
+For more information on how the priority of an email will be displayed, see the help provided by the respective email client.
+
+### How does BodyFormat affect sending an email?
+
+An email sent with an [HTML][] body will have its body displayed as an HTML page instead of as plain text. How the email looks in the email client may differ depending on the email client in use. For example, if the [Email Message][Email Message Property] has its [BodyFormat][] set to [HTML][] and the [Body][] has a value of:
+
+```json
+"
Example header text
Example paragraph text
"
+```
+
+[Outlook][] will display the email body as follows:
+
+{{< figure src="/images/send-email-using-smtp-server-html-email.png" >}}
+
+For more information on how the body of an email will be displayed, see the help provided by the respective email client.
+
+### Attachments
+
+Attachments can be sent in an email by providing a list of file paths in the [Attachments][] property of the [Email Message][Email Message Property]. For more information concerning attaching files to an email, see the sections below.
+
+#### Supported file path formats
+
+Each file path in the [Attachments][] within the [Email Message][Email Message Property] can be an:
+
+- Absolute file path
+- Relative file path
+- UNC file path
+
+where each file path must be accessible from the server executing the flow.
+
+For more information about each of these supported file path formats, please see [File & Folder Paths][].
+
+#### File paths need escaping
+
+Each file path in the [Attachments][] within the [Email Message][Email Message Property] requires \ characters to be escaped, otherwise each unescaped \ will be reported as an Invalid property value message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+- Escaping the `\` character with another `\` character (e.g. `"C:\\Attachments\\attachment.txt"`), or
+- Prepending an `@` character before the start of the File Path (e.g. `@"C:\Attachments\attachment.txt"`)
+
+#### Null file path
+
+If `null` is provided as a file path in the [Attachments][] within the [Email Message][Email Message Property], an [ArgumentNullException][] is thrown.
+
+#### Empty file path
+
+If an empty string is provided as a file path in the [Attachments][] within the [Email Message][Email Message Property], an [ArgumentException][] is thrown.
+
+#### File path does not exist
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] does not exist, a [FileNotFoundException][] is thrown.
+
+#### Invalid file path
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] is invalid (i.e. contains any of the following characters: ", *, ?, |, <, >, :, \, /), an [IOException][] will be thrown.
+
+#### File path points to a folder
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] points to a folder, an [UnauthorizedAccessException][] will be thrown.
+
+#### File path contains leading spaces
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] contains leading spaces they are not removed and an [IOException][] will be thrown; however, trailing spaces are removed.
+
+#### File path contains only whitespace or the NUL character
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] contains only whitespace (i.e. `" "`) or the NUL character (i.e. `\0`), an [ArgumentException][] will be thrown.
+
+#### File path exceeds the system-defined maximum length
+
+If a file path in the [Attachments][] within the [Email Message][Email Message Property] exceeds the system-defined maximum length (typically 32,767), a [PathTooLongException][] will be thrown.
+
+#### User does not have necessary permissions to attach the file
+
+If the user the flow is executing as does not have permissions to access the file at the provided file path in the [Attachments][] within the [Email Message][Email Message Property], an [UnauthorizedAccessException][] will be thrown.
+
+#### Attachment size limit
+
+The combined size of all the [Attachments][] within the [Email Message][Email Message Property] must be less than the limit specified by the email service provider. If the combined size of all of the attachments is greater than the limit, an [SmtpCommandException][] will be thrown.
+
+For [Outlook][] this is `20 MB` and for [Gmail][] this is `25 MB`, for more information on the size limits for other email service providers, see the help provided by the respective email service provider.
+
+### Supported formats for ServerDetails.Host
+
+The following formats are supported for [Host][] in [ServerDetails][]:
+
+- Fully Qualified Domain Name (e.g. `"smtp.gmail.com"`)
+
+### Setting UseSsl
+
+The [ServerDetails][] within the [Gmail Session Details][Gmail Session Details Property] specifies which [SMTP][] server to connect to. The value of the [UseSsl][] property inside this object depends on the [Host][] and [Port][] being connected to. There are two types of [SSL][]/[TLS][] connections that can occur:
+
+- [SSL][]/[TLS][] is used as soon as a connection is established
+- [SSL][]/[TLS][] is used via the STARTTLS command if it is available
+
+The above two points correspond to the [UseSsl][] property being set to `true` and `false` respectively. As such, generally the following rules can be followed to determine whether [UseSsl][] should be set to `true` or `false`:
+
+- If the [Port][] being connected to is `465` then [UseSsl][] should be set to `true`
+- If the [Port][] being connected to is `25` or `587` then [UseSsl][] should be set to `false`
+
+### Setting Credentials
+
+The [Credentials][Credentials Property] within the [Gmail Session Details][Gmail Session Details Property] specifies what user to connect as on the [SMTP][] server hosted by [Gmail][]. Two types of authentication are supported:
+
+- Basic
+- OAuth (Two-Legged OAuth)
+
+The above two authentication mechanisms correspond to the [Credentials][Credentials Property] within the [Gmail Session Details][Gmail Session Details Property] being a [UserCredentials][] and a [GmailOAuthCertificateCredentials][] respectively.
+
+#### Setting Credentials to UserCredentials
+
+Currently, [Gmail][] will not allow emails to be sent using the username and password of an account unless the account is associated with a Google Workspace account.
+
+As such, the recommended approach for using a [UserCredentials][] as the [Credentials][Credentials Property] within the [Gmail Session Details][Gmail Session Details Property] is to set up an app password and use that in place of the actual password associated with the account, see [Setting up an app password for a Gmail account][] for more information.
+
+Note the following:
+
+- The value of the [Username][] property may optionally be encrypted, however the [Password][] should be encrypted.
+- Note that the [UserCredentials][] also contains a [Domain][] property which is ignored by this block.
+
+#### Setting Credentials to GmailOAuthCertificateCredentials
+
+In order to use OAuth as the authentication mechanism:
+
+- A client application must be set up on the Google Workspace
+- A service account must be set up for the client application
+- A private key (.p12 file) must be generated for the service account
+- An administrator of the Google Workspace must grant the client application domain-wide delegation for the scope `https://mail.google.com/`
+
+For more information on how to configure a [Gmail][] account to work with OAuth, see [Setting up a Gmail account for OAuth authentication][].
+
+Once the account has been set up to work with OAuth, a [GmailOAuthCertificateCredentials][] can be used as the [Credentials][Credentials Property] within the [Gmail Session Details][Gmail Session Details Property]. The properties in the [GmailOAuthCertificateCredentials][] correspond with the client application data as follows:
+
+- [CertificatePath][] - The path pointing to the certificate (.p12) file generated when setting up the client application; the certificate must be accessible from the server executing the flow, for more information on using a certificate file, see [Certificate Files][].
+- [CertificatePassword][] - The password associated with the certificate (.p12)
+- [FromAddress][] - The address of the account used to set up the client application
+- [ClientId][] - The Client ID of the client application
+
+Note that the values of the [CertificatePath][] and [ClientId][] properties may optionally be encrypted, however the [CertificatePassword][] should be encrypted.
+
+For more detailed information on each of these properties, see [GmailOAuthCertificateCredentials][].
+
+### Certificate Files
+
+OAuth can be used as the authentication mechanism when sending an email using this block by providing a [GmailOAuthCertificateCredentials][] as the [Credentials][Credentials Property] in the [Gmail Session Details][Gmail Session Details Property]. [GmailOAuthCertificateCredentials][] requires a [CertificatePath][] to be provided, which is a path pointing to a certificate file accessible from the server executing the flow. For more information concerning using a certificate, see the sections below.
+
+#### Supported CertificatePath formats
+
+The [CertificatePath][] within the [GmailOAuthCertificateCredentials][] can be an:
+
+- Absolute file path
+- Relative file path
+- UNC file path
+
+where each file path must be accessible from the server executing the flow.
+
+For more information about each of these supported file path formats, please see [File & Folder Paths][].
+
+#### CertificatePath needs escaping
+
+The [CertificatePath][] within the [GmailOAuthCertificateCredentials][] requires \ characters to be escaped, otherwise each unescaped \ will be reported as an Invalid property value message when trying to debug the flow.
+
+Escaping can be done in two ways:
+
+- Escaping the `\` character with another `\` character (e.g. `"C:\\Certificates\\certificate.p12"`), or
+- Prepending an `@` character before the start of the File Path (e.g. `@"C:\Certificates\certificate.p12"`)
+
+#### Null CertificatePath
+
+If `null` is provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][], a [PropertyNullException][] is thrown.
+
+#### Empty CertificatePath
+
+If an empty string is provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][], a [PropertyEmptyException][] is thrown.
+
+#### CertificatePath does not exist
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] does not exist, an [EmailSessionException][] is thrown. For more information, see [Invalid SSL Certificate][].
+
+#### Invalid CertificatePath
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] is invalid (i.e. contains any of the following characters: ", *, ?, |, <, >, :, \, /), an [EmailSessionException][] will be thrown. For more information, see [Invalid SSL Certificate][].
+
+#### CertificatePath points to a folder
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] points to a folder, an [EmailSessionException][] will be thrown. For more information, see [Invalid SSL Certificate][].
+
+#### CertificatePath contains leading spaces
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] contains leading spaces they are not removed and an [EmailSessionException][] will be thrown; however, trailing spaces are removed. For more information, see [Invalid SSL Certificate][].
+
+#### CertificatePath contains only whitespace or the NUL character
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] contains only whitespace (i.e. `" "`) or the NUL character (i.e. `\0`), an [EmailSessionException][] will be thrown. For more information, see [Invalid SSL Certificate][].
+
+#### CertificatePath exceeds the system-defined maximum length
+
+If the path provided as the [CertificatePath][] within the [GmailOAuthCertificateCredentials][] exceeds the system-defined maximum length (typically 32,767), an [EmailSessionException][] will be thrown. For more information, see [Invalid SSL Certificate][].
+
+#### User does not have necessary permissions to use the certificate file
+
+If the user the flow is executing as does not have permissions to access the file at the [CertificatePath][] within the [GmailOAuthCertificateCredentials][], an [EmailSessionException][] will be thrown. For more information, see [Invalid SSL Certificate][].
+
+### Opening Sessions
+
+The Send Email Using Gmail block automatically handles creating and opening sessions for the specified [Gmail Session Details][Gmail Session Details Property] using the following rules:
+
+- If a session does not exist, a new session will be created, opened and used when the block runs.
+- If a session already exists but is closed, the session will be opened and used when the block runs.
+- If a session already exists and is open, the session will be used when the block runs.
+
+[Gmail Session Details][Gmail Session Details Property] will keep the session open across multiple Send Email Using Gmail blocks as long as [Close Session][Close Session Property] is set to `false`. Keeping the session open helps increase the performance of the block due to the subsequent blocks not having to spend resources creating and opening sessions for each execution.
+
+Note that for all [SSL][] connections, the protocol to be used will be negotiated with the server depending on which protocols are available. Similarly, the [SASL][] mechanism to be used will be negotiated with the mail server based on the available mechanisms.
+
+For information on how to explicitly close a session, please see [Closing Sessions][].
+
+### Closing Sessions
+
+Sessions can be explicitly closed by setting [Close Session][Close Session Property] to `true`. This causes the session to be closed after the [Email Message][Email Message Property] has been sent.
+
+If [Close Session][Close Session Property] is set to `false` the session will be closed when the [Variable][] that [Gmail Session Details][Gmail Session Details Property] is set to goes out of scope or the flow ends, whichever happens first. For more information about variables and scope, please see [Variables][].
+
+For information on how to open a session, please see [Opening Sessions][].
+
+### Known Limitations
+
+None
+
+[Email Message Property]: {{< ref "#email-message" >}}
+[Gmail Session Details Property]: {{< ref "#gmail-session-details" >}}
+[Close Session Property]: {{< ref "#close-session" >}}
+[How does Priority affect sending an email?]: {{< ref "#how-does-priority-affect-sending-an-email" >}}
+[How does BodyFormat affect sending an email?]: {{< ref "#how-does-bodyformat-affect-sending-an-email" >}}
+[Attachments Remarks]: {{< ref "#attachments" >}}
+[Supported formats for ServerDetails.Host]: {{< ref "#supported-formats-for-serverdetailshost" >}}
+[Setting Credentials]: {{< ref "#setting-credentials" >}}
+[Setting UseSsl]: {{< ref "#setting-usessl" >}}
+[Certificate Files]: {{< ref "#certificate-files" >}}
+[Opening Sessions]: {{< ref "#opening-sessions" >}}
+[Closing Sessions]: {{< ref "#closing-sessions" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+
+[EmailMessage]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.MainDoc" >}}
+[To]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.To" >}}
+[From]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.From" >}}
+[Cc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Cc" >}}
+[Bcc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Bcc" >}}
+[Priority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Priority" >}}
+[Subject]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Subject" >}}
+[BodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.BodyFormat" >}}
+[Body]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Body" >}}
+[Attachments]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Attachments" >}}
+[creating an EmailMessage using a constructor]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.CreateAnEmailMessage" >}}
+
+[GmailSessionDetails]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.GmailSessionDetails.MainDoc" >}}
+[ServerDetails Property]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.GmailSessionDetails.ServerDetails" >}}
+[Credentials Property]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.GmailSessionDetails.Credentials" >}}
+
+[ServerDetails]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.MainDoc" >}}
+[Host]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Host" >}}
+[Port]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.Port" >}}
+[UseSsl]: {{< url path="Cortex.Reference.DataTypes.SessionDetails.ServerDetails.UseSsl" >}}
+
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[Domain]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Domain" >}}
+[Username]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Username" >}}
+[Password]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Password" >}}
+
+[GmailOAuthCertificateCredentials]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.Authentication.OAuth.GmailOAuthCertificateCredentials.MainDoc" >}}
+[CertificatePath]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.Authentication.OAuth.GmailOAuthCertificateCredentials.CertificatePath" >}}
+[CertificatePassword]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.Authentication.OAuth.GmailOAuthCertificateCredentials.CertificatePassword" >}}
+[FromAddress]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.Authentication.OAuth.GmailOAuthCertificateCredentials.FromAddress" >}}
+[ClientId]: {{< url path="Cortex.Reference.DataTypes.GoogleWorkspace.Gmail.Authentication.OAuth.GmailOAuthCertificateCredentials.ClientId" >}}
+
+[EmailAddress]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.MainDoc" >}}
+[Address]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.Address" >}}
+
+[EmailMessagePriority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.MainDoc" >}}
+[Normal]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.Normal" >}}
+[Urgent]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.Urgent" >}}
+[NonUrgent]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.NonUrgent" >}}
+
+[EmailMessageBodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.MainDoc" >}}
+[HTML]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.HTML" >}}
+[Text]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.Text" >}}
+
+[Setting up an app password for a Gmail account]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Email.Authentication.SettingUpAppPassword" >}}
+[Setting up a Gmail account for OAuth authentication]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Email.Authentication.SettingUpOAuthGmail" >}}
+
+[EmailSessionException]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.MainDoc" >}}
+[Invalid Port]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidPort" >}}
+[Invalid Host]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidHost" >}}
+[SSL Required]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.SslRequired" >}}
+[SSL Unsupported]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.SslUnsupported" >}}
+[Invalid User Credentials]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidUserCredentials" >}}
+[Invalid SSL Certificate]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidSslCertificate" >}}
+[Invalid Gmail Client Credentials]: {{< url path="Cortex.Reference.Exceptions.Email.EmailSessionException.InvalidClientCredentials" >}}
+[EmailSessionErrorCode Limitations]: {{< url path="Cortex.Reference.DataTypes.Email.EmailSessionErrorCode.Limitations" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[ArgumentNullException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentNullException" >}}
+[FileNotFoundException]: {{< url path="MSDocs.DotNet.Api.System.IO.FileNotFoundException" >}}
+[IOException]: {{< url path="MSDocs.DotNet.Api.System.IO.IOException" >}}
+[PathTooLongException]: {{< url path="MSDocs.DotNet.Api.System.IO.PathTooLongException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[Property Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.PropertyIsInvalid">}}
+[SmtpCommandException]: {{< url path="MimeKit.Docs.SmtpCommandException" >}}
+[UnauthorizedAccessException]: {{< url path="MSDocs.DotNet.Api.System.UnauthorizedAccessException" >}}
+
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[File & Folder Paths]: {{< url path="Cortex.Reference.Concepts.WorkingWith.FilesAndFolders.Paths.MainDoc" >}}
+
+[SASL]: {{< url path="Cortex.Reference.Glossary.P-T.SASL" >}}
+[SMTP]: {{< url path="Cortex.Reference.Glossary.P-T.SMTP" >}}
+[SSL]: {{< url path="Cortex.Reference.Glossary.P-T.SSL" >}}
+[TLS]: {{< url path="Cortex.Reference.Glossary.P-T.TLS" >}}
+[BCC Glossary]: {{< url path="Cortex.Reference.Glossary.A-E.BCC" >}}
+[CC Glossary]: {{< url path="Cortex.Reference.Glossary.A-E.CC" >}}
+[CRL]: {{< url path="Cortex.Reference.Glossary.A-E.CRL" >}}
+[Gmail]: {{< url path="Cortex.Reference.Glossary.F-J.Gmail" >}}
+[Outlook]: {{< url path="Cortex.Reference.Glossary.K-O.Outlook" >}}
+
+[Less Secure Apps]: {{< url path="Google.Authentication.LessSecureApps.MainDoc" >}}
+[RFC 5321]: {{< url path="IETF.Email.RFC5321" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/http/_index.md b/content/en/docs/2026.3/Reference/Blocks/http/_index.md
new file mode 100644
index 000000000..473bf9830
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/http/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Http"
+linkTitle: "Http"
+description: "Blocks related to working with HTTP."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/_index.md b/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/_index.md
new file mode 100644
index 000000000..2afeb1c3a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute Http Request"
+linkTitle: "Execute Http Request"
+description: "Blocks related to executing HTTP requests."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/execute-http-request-block-1.md b/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/execute-http-request-block-1.md
new file mode 100644
index 000000000..3370f3d2a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/http/execute-http-request/execute-http-request-block-1.md
@@ -0,0 +1,518 @@
+---
+title: "Execute Http Request"
+linkTitle: "Execute Http Request"
+description: "Executes an HTTP request and returns a response."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Http_ExecuteHttpRequest_ExecuteHttpRequestBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Executes an [Http Request][Http Request Property] using the specified [Http Credentials][Http Credentials Property] and returns the [Http Response][Http Response Property].
+
+## Examples
+
+The following examples will use an example [API][] with a base [Uri][] of `https://test-shop.com/api` and resource called `items` at `https://test-shop.com/api/items`. Each example assumes that the resource `items` contains the following data before the example is executed:
+
+```json
+[
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ }
+]
+```
+
+The example [API][] supports:
+
+- Retrieval of every item in the `items` resource via a [GET][] request which returns the `items` resource as the [ResponseBody][] of the [Http Response][Http Response Property]
+- Creation of a new item in the `items` resource via a [POST][] request which returns the updated `items` resource as the [ResponseBody][] of the [Http Response][Http Response Property]
+- Unauthenticated requests
+- Basic authentication
+- Retrieval of access tokens from `https://test-shop.com/api/oauth2/token`
+- OAuth authentication using password credentials
+- OAuth authentication using client credentials
+
+### Executing a GET request
+
+This example will send a [GET][] request to `https://test-shop.com/api/items` using [HTTP 1.1][HTTP11] with no authentication which requires [Http Credentials][Http Credentials Property] to be `null`.
+
+Note that the result of executing an [Http Request][Http Request Property] is dependent on the [API][] that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": null, "Verb": "RequestVerb.GET", "ContentType": null, "Body": null, "Uri": "https://test-shop.com/api/items", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://test-api/com/items", queryParameters: null, verb: RequestVerb.GET, contentType: null, headers: null, body: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `null`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`null` | `($)HttpCredentials` is a variable with value `null`
As `($)HttpCredentials` is `null`, no authentication will occur when making the request. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Result
+
+Executing an [HttpRequest][] with a [Uri][] of `https://test-shop.com/api/items` and a [Verb][] of [GET][] using [HTTP 1.1][HTTP11] results in the variable `($)HttpResponse` being updated to the following:
+
+```json
+{
+ "ResponseBody": [
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ }
+ ],
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Length": 1024,
+ "Content-Type": "application/json",
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/json`, the [ResponseBody][] is a [Structure][] containing the data.
+
+***
+
+### Executing a POST request
+
+This example will send a [POST][] request to `https://test-shop.com/api/items` using [HTTP 1.1][HTTP11] with no authentication which requires [Http Credentials][Http Credentials Property] to be `null`.
+
+Note that the result of executing an [Http Request][Http Request Property] is dependent on the [API][] that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": null, "Verb": "RequestVerb.POST", "ContentType": "application/json", "Body": "{'name': 'item 3', 'id': 3}", "Uri": "https://test-shop.com/api/items", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://test-api/com/items", queryParameters: null, verb: RequestVerb.POST, contentType: "application/json", headers: null, body: "{'name': 'item 3', 'id': 3}", httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `null`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`null` | `($)HttpCredentials` is a variable with value `null`
As `($)HttpCredentials` is `null`, no authentication will occur when making the request. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Result
+
+Executing an [HttpRequest][] with a [Uri][] of `https://test-shop.com/api/items` and a [Verb][] of [POST][] using [HTTP 1.1][HTTP11] results in the variable `($)HttpResponse` being updated to the following:
+
+```json
+{
+ "ResponseBody": [
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ },
+ {
+ "name": "item 3",
+ "id": 3
+ }
+ ],
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Length": 1024,
+ "Content-Type": "application/json",
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note the following:
+
+- The resource `items` at `https://test-shop.com/api/items` contains `item 3` as shown in the [ResponseBody][] of the [Http Response][Http Response Property] shown above
+- As the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/json`, the [ResponseBody][] is a [Structure][] containing the data
+
+***
+
+### Executing a request using Basic authentication
+
+This example will send a [GET][] request to `https://test-shop.com/api/items` using [HTTP 1.1][HTTP11] using Basic authentication which requires [Http Credentials][Http Credentials Property] to be a [UserCredentials][].
+
+Note that the result of executing an [Http Request][Http Request Property] is dependent on the [API][] that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": null, "Verb": "RequestVerb.GET", "ContentType": null, "Body": null, "Uri": "https://test-shop.com/api/items", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://test-api/com/items", queryParameters: null, verb: RequestVerb.GET, contentType: null, headers: null, body: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"Domain": null, "Username": "username", "Password": "encryptedPassword"}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new UserCredentials(username: "username", password: "encryptedPassword")` | `($)HttpCredentials` is a variable of type [UserCredentials][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Result
+
+Executing an [HttpRequest][] with a [Uri][] of `https://test-shop.com/api/items` and a [Verb][] of [GET][] using [HTTP 1.1][HTTP11] results in the variable `($)HttpResponse` being updated to the following:
+
+```json
+{
+ "ResponseBody": [
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ }
+ ],
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Length": 1024,
+ "Content-Type": "application/json",
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/json`, the [ResponseBody][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using OAuth password credentials
+
+This example will send a [GET][] request to `https://test-shop.com/api/items` using [HTTP 1.1][HTTP11] using OAuth authentication with password credentials which requires [Http Credentials][Http Credentials Property] to be an [HttpOAuthPasswordCredentials][].
+
+Note that the result of executing an [Http Request][Http Request Property] is dependent on the [API][] that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": null, "Verb": "RequestVerb.GET", "ContentType": null, "Body": null, "Uri": "https://test-shop.com/api/items", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://test-api/com/items", queryParameters: null, verb: RequestVerb.GET, contentType: null, headers: null, body: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"AccessTokenUri": "https://test-shop.com/api/oauth2/token", "ClientAuthentication": null, "Scope": null, "ResourceOwnerUsername": "username", "ResourceOwnerPassword": "encryptedPassword"}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new HttpOAuthPasswordCredentials(accessTokenUri: "https://test-shop.com/api/oauth2/token", clientAuthentication: null, scope: null, resourceOwnerUsername: "username", resourceOwnerPassword: "encryptedPassword")` | `($)HttpCredentials` is a variable of type [HttpOAuthPasswordCredentials][]
The [ResourceOwnerPassword][ResourceOwnerPassword Password Credentials] property in the [HttpOAuthPasswordCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Result
+
+Executing an [HttpRequest][] with a [Uri][] of `https://test-shop.com/api/items` and a [Verb][] of [GET][] using [HTTP 1.1][HTTP11] results in the variable `($)HttpResponse` being updated to the following:
+
+```json
+{
+ "ResponseBody": [
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ }
+ ],
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Length": 1024,
+ "Content-Type": "application/json",
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/json`, the [ResponseBody][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using OAuth client credentials
+
+This example will send a [GET][] request to `https://test-shop.com/api/items` using [HTTP 1.1][HTTP11] using OAuth authentication with client credentials which requires [Http Credentials][Http Credentials Property] to be an [HttpOAuthClientCredentials][].
+
+Note that the result of executing an [Http Request][Http Request Property] is dependent on the [API][] that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": null, "Verb": "RequestVerb.GET", "ContentType": null, "Body": null, "Uri": "https://test-shop.com/api/items", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://test-api/com/items", queryParameters: null, verb: RequestVerb.GET, contentType: null, headers: null, body: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"AccessTokenUri": "https://test-shop.com/api/oauth2/token", "ClientAuthentication": {"ClientId": "clientId", "ClientSecret": "encryptedClientSecret", "SendAs": "ClientAuthType.Header"}, "Scope": null}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new HttpOAuthClientCredentials(accessTokenUri: "https://test-shop.com/api/oauth2/token", clientAuthentication: new ClientAuthentication("clientId", "encryptedClientSecret", ClientAuthType.Header), scope: null)` | `($)HttpCredentials` is a variable of type [HttpOAuthClientCredentials][]
The [ClientSecret][] property in [ClientAuthentication][] must be encrypted, for more information on how to encrypt the [ClientSecret][], see [EncryptedText][]. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Result
+
+Executing an [HttpRequest][] with a [Uri][] of `https://test-shop.com/api/items` and a [Verb][] of [GET][] using [HTTP 1.1][HTTP11] results in the variable `($)HttpResponse` being updated to the following:
+
+```json
+{
+ "ResponseBody": [
+ {
+ "name": "item 1",
+ "id": 1
+ },
+ {
+ "name": "item 2",
+ "id": 2
+ }
+ ],
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Length": 1024,
+ "Content-Type": "application/json",
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/json`, the [ResponseBody][] is a [Structure][] containing the data.
+
+***
+
+### Calling another Flow
+
+Note: This example does not follow the base [Uri][] or [API][] as specified [above][Examples Base]; but instead uses the [Uri][] of the [Cortex API Gateway][]. The [Uri][] to send this HTTP request to has the following form: `https://:8722/api///flows//executions/`.
+
+
+
+This example will send a [POST][] request to the [Uri][] of a [Flow][] within a published [package][Package] using [HTTP 1.1][HTTP11] and run the [Flow][], using Basic authentication which requires [Http Credentials][Http Credentials Property] to be a [UserCredentials][]. This example is similar in functionality to the [Run Flow][] block.
+
+
+
+The flow being run is `ExampleFlow`. This flow sets the value of an [Output][] variable `ExampleOutput` to `"I love We Are CORTEX"`. This flow is in a published, non-default package `ExamplePackage`.
+
+
+
+This example will send this request to `https://server.domain.com:8722/api/default/default/flows/ExampleFlow/executions?packageName=ExamplePackage`, where `server.domain.com` is the FQDN of the server hosting a {{% ctx %}} install.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Http Request][Http Request Property] | `($)HttpRequest`, with value `{"QueryStringParameters": {"packageName": "ExamplePackage"}, "Verb": "RequestVerb.POST", "ContentType": "application/json", "Body": {}, "Uri": "https://server.domain.com:8722/api/default/default/flows/ExampleFlow/executions", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)HttpRequest` has been set up using the following [Expression][]:
`new HttpRequest(uri: "https://server.domain.com:8722/api/default/default/flows/ExampleFlow/executions", queryParameters: new Dictionary({"packageName","ExamplePackage"}), verb: RequestVerb.POST, contentType: "application/json", headers: null, body: "{}", httpVersion: HttpRequestVersion.HTTP11)` | `($)HttpRequest` is a variable of type [HttpRequest][]
In this example, the `queryParameters` [Advanced][] property is an [IDictionary][IDictionary] with three valid keys, `"packageName"`, `"packageVersion"` and `"async"`. `"packageName"` must be specified as the package of the published flow if it is not the default package.`"packageVersion"` may be included to refer to a specific version of a published package if it is not the default version. `"async"` is by default `"false"`, and if set to `"true"` will cause the flow execution to run asynchronously; similar to the [Run Flow Async][] block. |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"Username": "username", "Password":"encryptedPassword"}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new UserCredentials(username: "username", password: "encryptedPassword")` | `($)HttpCredentials` is a variable of type [UserCredentials][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the [password][Password], see [EncryptedText][]. |
+| [Http Response][Http Response Property] | `($)HttpResponse`, with no value | `($)HttpResponse` will be set to the type [HttpResponse][] |
+
+#### Results
+
+Executing a [POST][] [HttpRequest][] to `https://server.domain.com:8722/api/default/default/flows/ExampleFlow/executions?packageName=ExamplePackage` results in the variable `($)HttpResponse` being updated to the following:
+```json
+{
+ "ResponseBody": {
+ "ExampleOutput": "I love We Are CORTEX"
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Date": "2023-10-04T14:17:40+00:00",
+ "Server": "Kestrel",
+ "Cache-Control": "no-store, must-revalidate, no-cache",
+ "X-Content-Type-Options": "nosniff",
+ "api-supported-versions": "1.0",
+ "Content-Length": 36,
+ "Content-Type": "application/json; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+***
+
+## Properties
+
+### Http Request
+
+The [Http Request][Http Request Property] to execute using the [Http Credentials][Http Credentials Property]. This property contains all of the information in relation to the request to be sent, these are:
+
+- [Uri][]
+- [QueryParameters][]
+- [Verb][]
+- [ContentType][]
+- [Headers][Headers Request]
+- [Body][]
+- [HttpVersion][]
+
+For more detailed information on each of the properties, see [HttpRequest][].
+
+|||
+|----------|----------|
+| Data Type | [HttpRequest][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [HttpRequest][] with value shown below: |
+
+```json
+{
+ "Uri": "",
+ "QueryParameters": null,
+ "Verb": "RequestVerb.GET",
+ "ContentType": "application/json",
+ "Headers": null,
+ "Body": "",
+ "HttpVersion": "HttpRequestVersion.HTTP10"
+}
+```
+
+### Http Credentials
+
+The [Http Credentials][Http Credentials Property] object that includes all of the information required for authentication. Mutliple authentication mechanisms are supported which correspond to specific values/data types:
+
+- `null`: No authentication
+- [UserCredentials][]: Basic authentication
+- [HttpOAuthPasswordCredentials][]: OAuth authentication using password credentials
+- [HttpOAuthClientCredentials][]: OAuth authentication using client credentials
+
+Note that when using [HttpOAuthPasswordCredentials][] or [HttpOAuthClientCredentials][] as the [Http Credentials][Http Credentials Property], the Execute Http Request block automatically handles retrieval of access tokens using the following rules:
+
+- If an access token does not exist, a new access token will be retrieved and used when the block runs.
+- If an access token already exists but is expired, a new access token will be retrieved and used when the block runs.
+- If an access token already exists and is valid, it will be used when the block runs.
+
+|||
+|----------|----------|
+| Data Type | [HttpCredentials][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)HttpCredentials` with no value |
+
+### Http Response
+
+The [Http Response][Http Response Property] object which contains the response returned from the server. This property contains all of the information in relation to the response from the server, these are:
+
+- [ResponseBody][]
+- [ErrorMessage][]
+- [Headers][Headers Response]
+- [StatusCode][]
+
+Note that if the [Headers][Headers Response] contains a key of `Content-Type` with a value containing `json` or `xml`, the [ResponseBody][] will be set to a [Structure][] containing the data.
+
+For more detailed information on each of the properties, see [HttpResponse][].
+
+|||
+|----------|----------|
+| Data Type | [HttpResponse][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)HttpResponse` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [HttpAuthorisationException][] | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [ResourceOwnerPassword][ResourceOwnerPassword Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is invalid. |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is invalid. |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is invalid. |
+| [InvalidRequestException][] | Thrown when the [Uri][] within [Http Request][Http Request Property] is not in the correct format or contains invalid characters. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is not in the correct format or contains invalid characters. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is not in the correct format or contains invalid characters. |
+| | Thrown when the [Verb][] within [Http Request][Http Request Property] is not one of the specified [RequestVerb][] values (e.g. `(RequestVerb)10`). |
+| | Thrown when a header key in [Headers][Headers Request] within [Http Request][Http Request Property] is empty (i.e. `""`). |
+| | Thrown when a header key in [Headers][Headers Request] within [Http Request][Http Request Property] is restricted. |
+| | Thrown when a header key in [Headers][Headers Request] within [Http Request][Http Request Property] is restricted and forbidden. |
+| | Thrown when a header value in [Headers][Headers Request] within [Http Request][Http Request Property] could not be assigned to its restricted header key. |
+| | Thrown when a header value in [Headers][Headers Request] within [Http Request][Http Request Property] could not be converted to its restricted header key's type. |
+| | Thrown when the [Body][] within [Http Request][Http Request Property] is not `null` or empty (i.e. `""`) and [RequestVerb][] is [GET][] or [HEAD][]. |
+| | Thrown when the [Body][] within [Http Request][Http Request Property] does not match the [ContentType][]. |
+| | Thrown when the [HttpVersion][] within [Http Request][Http Request Property] is not one of the specified [HttpRequestVersion][] values (e.g. `(HttpRequestVersion)20`). |
+| [PropertyNullException][] | Thrown when the [Http Request][Http Request Property] is `null`. |
+| | Thrown when the [Uri][] within [Http Request][Http Request Property] is `null`. |
+| | Thrown when the [Username][] within [UserCredentials][] is `null`. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is `null`. |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is `null`. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientAuthentication][ClientAuthentication Client Credentials] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is `null`. |
+| [PropertyEmptyException][] | Thrown when the [Uri][] within [Http Request][Http Request Property] is empty (i.e. `""`). |
+| | Thrown when the [Username][] within [UserCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+
+## Remarks
+
+### Known Limitations
+
+None
+
+[Examples Base]: {{< ref "#examples" >}}
+[Http Request Property]: {{< ref "#http-request" >}}
+[Http Credentials Property]: {{< ref "#http-credentials" >}}
+[Http Response Property]: {{< ref "#http-response" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[Username]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Username" >}}
+[Password]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Password" >}}
+
+[HttpCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.HttpCredentials.MainDoc" >}}
+
+[HttpOAuthClientCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.MainDoc" >}}
+[AccessTokenUri Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.AccessTokenUri" >}}
+[ClientAuthentication Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.ClientAuthentication" >}}
+
+[HttpOAuthPasswordCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.MainDoc" >}}
+[ResourceOwnerUsername Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.ResourceOwnerUsername" >}}
+[ResourceOwnerPassword Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.ResourceOwnerPassword" >}}
+[AccessTokenUri Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.AccessTokenUri" >}}
+
+[ClientAuthentication]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.MainDoc" >}}
+[ClientId]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.ClientId" >}}
+[ClientSecret]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.ClientSecret" >}}
+[SendAs]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.SendAs" >}}
+
+[HttpRequest]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.MainDoc" >}}
+[Uri]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.Uri" >}}
+[QueryParameters]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.QueryParameters" >}}
+[Verb]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.Verb" >}}
+[ContentType]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.ContentType" >}}
+[Headers Request]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.Headers" >}}
+[Body]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.Body" >}}
+[HttpVersion]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpRequest.HttpVersion" >}}
+
+[RequestVerb]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.MainDoc" >}}
+[GET]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.GET" >}}
+[POST]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.POST" >}}
+[PUT]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.PUT" >}}
+[DELETE]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.DELETE" >}}
+[PATCH]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.PATCH" >}}
+[HEAD]: {{< url path="Cortex.Reference.DataTypes.Http.RequestVerb.HEAD" >}}
+[HttpRequestVersion]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.MainDoc" >}}
+[HTTP10]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.HTTP10" >}}
+[HTTP11]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.HTTP11" >}}
+
+[HttpResponse]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpResponse.MainDoc" >}}
+[ResponseBody]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpResponse.ResponseBody" >}}
+[ErrorMessage]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpResponse.ErrorMessage" >}}
+[Headers Response]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpResponse.Headers" >}}
+[StatusCode]: {{< url path="Cortex.Reference.DataTypes.Http.Rest.HttpResponse.StatusCode" >}}
+
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[HttpAuthorisationException]: {{< url path="Cortex.Reference.Exceptions.Http.HttpAuthorisationException.MainDoc" >}}
+[InvalidRequestException]: {{< url path="Cortex.Reference.Exceptions.Http.InvalidRequestException.MainDoc" >}}
+
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[API]: {{< url path="Cortex.Reference.Glossary.A-E.API" >}}
+[Flow]:{{< url path="Cortex.Reference.Glossary.F-J.Flow">}}
+
+[Cortex API Gateway]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+[Package]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Packages.WhatIsAPackage.MainDoc" >}}
+[Run Flow]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlow.MainDoc">}}
+[Run Flow Async]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlowAsync.MainDoc">}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/_index.md b/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/_index.md
new file mode 100644
index 000000000..3c6227477
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute Soap Request"
+linkTitle: "Execute Soap Request"
+description: "Blocks related to executing SOAP requests."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/execute-soap-request-block-1.md b/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/execute-soap-request-block-1.md
new file mode 100644
index 000000000..beed8aecb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/http/execute-soap-request/execute-soap-request-block-1.md
@@ -0,0 +1,494 @@
+---
+title: "Execute Soap Request"
+linkTitle: "Execute Soap Request"
+description: "Executes a SOAP request and returns a response."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Http_ExecuteSoapRequest_ExecuteSoapRequestBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Executes a [Soap Request][Soap Request Property] using the specified [Http Credentials][Http Credentials Property] and returns the [Soap Response][Soap Response Property].
+
+## Examples
+
+The following examples will use an example SOAP service with a base [Uri][] of `https://test-converter.com/xml`.
+
+The example SOAP service supports the following:
+
+- Conversion of a temperature in Degrees Celcius to Kelvin using an [Action][] of `https://test-converter.com/DegreesToKelvin`
+- Unauthenticated requests
+- Basic authentication
+- Retrieval of access tokens from `https://test-converter.com/oauth2/token`
+- OAuth authentication using password credentials
+- OAuth authentication using client credentials
+
+### Executing a request using SOAP 1.1
+
+This example will send a [Soap Request][Soap Request Property] to `https://test-converter.com/xml` using SOAP 1.1 with no authentication which requires:
+
+- [SoapMessage][SoapMessage Property] to be a [Soap11Message][]
+- [Http Credentials][Http Credentials Property] to be `null`
+
+Note that the result of executing a [Soap Request][Soap Request Property] is dependent on the SOAP service that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Soap Request][Soap Request Property] | `($)SoapRequest`, with value `{"SoapMessage": {"Action": "https://test-converter.com/DegreesToKelvin", "Envelope": "20", "Version": 11}, "Uri": "https://test-converter.com/xml", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)SoapRequest` has been set up using the following [Expression][]:
`new SoapRequest(uri: "https://test-converter.com/xml", soapMessage: new Soap11Message("https://test-converter.com/DegreesToKelvin", "20"), headers: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)SoapRequest` is a variable of type [SoapRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `null`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`null` | `($)HttpCredentials` is a variable with value `null`
As `($)HttpCredentials` is `null`, no authentication will occur when making the request. |
+| [Soap Response][Soap Response Property] | `($)SoapResponse`, with no value | `($)SoapResponse` will be set to the type [SoapResponse][] |
+
+#### Result
+
+Executing a [Soap Request][Soap Request Property] with a [Uri][] of `https://test-converter.com/xml` using a [Soap11Message][] with an [Action][] of `https://test-converter.com/DegreesToKelvin` results in the variable `($)SoapResponse` being updated to the following:
+
+```json
+{
+ "ResponseEnvelope": {
+ "?xml": {
+ "@version": "1.0",
+ "@encoding": "utf-8"
+ },
+ "soap:Envelope": {
+ "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
+ "@xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/",
+ "soap:Body": {
+ "DegreesToKelvinResponse": {
+ "@xmlns": "https://test-converter.com/DegreesToKelvin/schema",
+ "kelvin": "293"
+ }
+ }
+ }
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Type": "text/xml; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `text/xml; charset=utf-8`, the [ResponseEnvelope][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using SOAP 1.2
+
+This example will send a [Soap Request][Soap Request Property] to `https://test-converter.com/xml` using SOAP 1.2 with no authentication which requires:
+
+- [SoapMessage][SoapMessage Property] to be a [Soap12Message][]
+- [Http Credentials][Http Credentials Property] to be `null`
+
+Note that the result of executing a [Soap Request][Soap Request Property] is dependent on the SOAP service that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Soap Request][Soap Request Property] | `($)SoapRequest`, with value `{"SoapMessage": {"Envelope": "20", "Version": 12}, "Uri": "https://test-converter.com/xml", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)SoapRequest` has been set up using the following [Expression][]:
`new SoapRequest(uri: "https://test-converter.com/xml", soapMessage: new Soap12Message("20"), headers: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)SoapRequest` is a variable of type [SoapRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `null`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`null` | `($)HttpCredentials` is a variable with value `null`
As `($)HttpCredentials` is `null`, no authentication will occur when making the request. |
+| [Soap Response][Soap Response Property] | `($)SoapResponse`, with no value | `($)SoapResponse` will be set to the type [SoapResponse][] |
+
+#### Result
+
+Executing a [Soap Request][Soap Request Property] with a [Uri][] of `https://test-converter.com/xml` using a [Soap12Message][] results in the variable `($)SoapResponse` being updated to the following:
+
+```json
+{
+ "ResponseEnvelope": {
+ "?xml": {
+ "@version": "1.0",
+ "@encoding": "utf-8"
+ },
+ "soap12:Envelope": {
+ "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
+ "@xmlns:soap12": "http://www.w3.org/2003/05/soap-envelope",
+ "soap12:Body": {
+ "DegreesToKelvinResponse": {
+ "@xmlns": "https://test-converter.com/DegreesToKelvin/schema",
+ "kelvin": "293"
+ }
+ }
+ }
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Type": "application/soap+xml; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `application/soap+xml; charset=utf-8`, the [ResponseEnvelope][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using Basic authentication
+
+This example will send a [Soap Request][Soap Request Property] to `https://test-converter.com/xml` using SOAP 1.1 with Basic authentication which requires:
+
+- [SoapMessage][SoapMessage Property] to be a [Soap11Message][]
+- [Http Credentials][Http Credentials Property] to be a [UserCredentials][]
+
+Note that the result of executing a [Soap Request][Soap Request Property] is dependent on the SOAP service that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Soap Request][Soap Request Property] | `($)SoapRequest`, with value `{"SoapMessage": {"Action": "https://test-converter.com/DegreesToKelvin", "Envelope": "20", "Version": 11}, "Uri": "https://test-converter.com/xml", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)SoapRequest` has been set up using the following [Expression][]:
`new SoapRequest(uri: "https://test-converter.com/xml", soapMessage: new Soap11Message("https://test-converter.com/DegreesToKelvin", "20"), headers: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)SoapRequest` is a variable of type [SoapRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"Domain": null, "Username": "username", "Password": "encryptedPassword"}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new UserCredentials(username: "username", password: "encryptedPassword")` | `($)HttpCredentials` is a variable of type [UserCredentials][]
The [Password][] property in the [UserCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Soap Response][Soap Response Property] | `($)SoapResponse`, with no value | `($)SoapResponse` will be set to the type [SoapResponse][] |
+
+#### Result
+
+Executing a [Soap Request][Soap Request Property] with a [Uri][] of `https://test-converter.com/xml` using a [Soap11Message][] with an [Action][] of `https://test-converter.com/DegreesToKelvin` results in the variable `($)SoapResponse` being updated to the following:
+
+```json
+{
+ "ResponseEnvelope": {
+ "?xml": {
+ "@version": "1.0",
+ "@encoding": "utf-8"
+ },
+ "soap:Envelope": {
+ "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
+ "@xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/",
+ "soap:Body": {
+ "DegreesToKelvinResponse": {
+ "@xmlns": "https://test-converter.com/DegreesToKelvin/schema",
+ "kelvin": "293"
+ }
+ }
+ }
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Type": "text/xml; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `text/xml; charset=utf-8`, the [ResponseEnvelope][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using OAuth password credentials
+
+This example will send a [Soap Request][Soap Request Property] to `https://test-converter.com/xml` using SOAP 1.1 with OAuth authentication using password credentials which requires:
+
+- [SoapMessage][SoapMessage Property] to be a [Soap11Message][]
+- [Http Credentials][Http Credentials Property] to be an [HttpOAuthPasswordCredentials][]
+
+Note that the result of executing a [Soap Request][Soap Request Property] is dependent on the SOAP service that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Soap Request][Soap Request Property] | `($)SoapRequest`, with value `{"SoapMessage": {"Action": "https://test-converter.com/DegreesToKelvin", "Envelope": "20", "Version": 11}, "Uri": "https://test-converter.com/xml", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)SoapRequest` has been set up using the following [Expression][]:
`new SoapRequest(uri: "https://test-converter.com/xml", soapMessage: new Soap11Message("https://test-converter.com/DegreesToKelvin", "20"), headers: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)SoapRequest` is a variable of type [SoapRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"AccessTokenUri": "https://test-converter.com/oauth2/token", "ClientAuthentication": null, "Scope": null, "ResourceOwnerUsername": "username", "ResourceOwnerPassword": "encryptedPassword"}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new HttpOAuthPasswordCredentials(accessTokenUri: "https://test-converter.com/oauth2/token", clientAuthentication: null, scope: null, resourceOwnerUsername: "username", resourceOwnerPassword: "encryptedPassword")` | `($)HttpCredentials` is a variable of type [HttpOAuthPasswordCredentials][]
The [ResourceOwnerPassword][ResourceOwnerPassword Password Credentials] property in the [HttpOAuthPasswordCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+| [Soap Response][Soap Response Property] | `($)SoapResponse`, with no value | `($)SoapResponse` will be set to the type [SoapResponse][] |
+
+#### Result
+
+Executing a [Soap Request][Soap Request Property] with a [Uri][] of `https://test-converter.com/xml` using a [Soap11Message][] with an [Action][] of `https://test-converter.com/DegreesToKelvin` results in the variable `($)SoapResponse` being updated to the following:
+
+```json
+{
+ "ResponseEnvelope": {
+ "?xml": {
+ "@version": "1.0",
+ "@encoding": "utf-8"
+ },
+ "soap:Envelope": {
+ "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
+ "@xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/",
+ "soap:Body": {
+ "DegreesToKelvinResponse": {
+ "@xmlns": "https://test-converter.com/DegreesToKelvin/schema",
+ "kelvin": "293"
+ }
+ }
+ }
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Type": "text/xml; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `text/xml; charset=utf-8`, the [ResponseEnvelope][] is a [Structure][] containing the data.
+
+***
+
+### Executing a request using OAuth client credentials
+
+This example will send a [Soap Request][Soap Request Property] to `https://test-converter.com/xml` using SOAP 1.1 with OAuth authentication using client credentials which requires:
+
+- [SoapMessage][SoapMessage Property] to be a [Soap11Message][]
+- [Http Credentials][Http Credentials Property] to be an [HttpOAuthClientCredentials][]
+
+Note that the result of executing a [Soap Request][Soap Request Property] is dependent on the SOAP service that the request is being made to.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Soap Request][Soap Request Property] | `($)SoapRequest`, with value `{"SoapMessage": {"Action": "https://test-converter.com/DegreesToKelvin", "Envelope": "20", "Version": 11}, "Uri": "https://test-converter.com/xml", "Headers": null, "HttpVersion": "HttpRequestVersion.HTTP11"}`
In this example `($)SoapRequest` has been set up using the following [Expression][]:
`new SoapRequest(uri: "https://test-converter.com/xml", soapMessage: new Soap11Message("https://test-converter.com/DegreesToKelvin", "20"), headers: null, httpVersion: HttpRequestVersion.HTTP11)` | `($)SoapRequest` is a variable of type [SoapRequest][] |
+| [Http Credentials][Http Credentials Property] | `($)HttpCredentials`, with value `{"AccessTokenUri": "https://test-converter.com/oauth2/token", "ClientAuthentication": {"ClientId": "clientId", "ClientSecret": "encryptedClientSecret", "SendAs": "ClientAuthType.Header"}, "Scope": null}`
In this example, `($)HttpCredentials` has been set up using the following [Expression][]:
`new HttpOAuthClientCredentials(accessTokenUri: "https://test-converter.com/oauth2/token", clientAuthentication: new ClientAuthentication("clientId", "encryptedClientSecret", ClientAuthType.Header), scope: null)` | `($)HttpCredentials` is a variable of type [HttpOAuthClientCredentials][]
The [ClientSecret][] property in [ClientAuthentication][] must be encrypted, for more information on how to encrypt the [ClientSecret][], see [EncryptedText][]. |
+| [Soap Response][Soap Response Property] | `($)SoapResponse`, with no value | `($)SoapResponse` will be set to the type [SoapResponse][] |
+
+#### Result
+
+Executing a [Soap Request][Soap Request Property] with a [Uri][] of `https://test-converter.com/xml` using a [Soap11Message][] with an [Action][] of `https://test-converter.com/DegreesToKelvin` results in the variable `($)SoapResponse` being updated to the following:
+
+```json
+{
+ "ResponseEnvelope": {
+ "?xml": {
+ "@version": "1.0",
+ "@encoding": "utf-8"
+ },
+ "soap:Envelope": {
+ "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "@xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
+ "@xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/",
+ "soap:Body": {
+ "DegreesToKelvinResponse": {
+ "@xmlns": "https://test-converter.com/DegreesToKelvin/schema",
+ "kelvin": "293"
+ }
+ }
+ }
+ },
+ "ErrorMessage": null,
+ "Headers": {
+ "Content-Type": "text/xml; charset=utf-8"
+ },
+ "StatusCode": "HttpStatusCode.OK (200)"
+}
+```
+
+Note that as the [Headers][Headers Response] contains a key of `Content-Type` with a value of `text/xml; charset=utf-8`, the [ResponseEnvelope][] is a [Structure][] containing the data.
+
+***
+
+## Properties
+
+### Soap Request
+
+The [Soap Request][Soap Request Property] to execute using the [Http Credentials][Http Credentials Property]. This property contains all of the information in relation to the request to be sent, these are:
+
+- [SoapMessage][SoapMessage Property]
+- [Uri][]
+- [Headers][Headers Request]
+- [HttpVersion][]
+
+SOAP 1.1 and SOAP 1.2 are both supported, which correspond to [SoapMessage][SoapMessage Property] within [SoapRequest][] being a [Soap11Message][] and [Soap12Message][] respectively.
+
+For more information on:
+
+- How to use a [Soap11Message][], see [Executing a request using SOAP 1.1][]
+- How to use a [Soap12Message][], see [Executing a request using SOAP 1.2][]
+- Each of the properties, see [SoapRequest][]
+
+|||
+|----------|----------|
+| Data Type | [SoapRequest][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [SoapRequest][] with value shown below: |
+
+```json
+{
+ "SoapMessage": {
+ "Action": "",
+ "Envelope": "",
+ "Version": 11
+ },
+ "Uri": "",
+ "Headers": null,
+ "HttpVersion": "HttpRequestVersion.HTTP10"
+}
+```
+
+### Http Credentials
+
+The [Http Credentials][Http Credentials Property] object that includes all of the information required for authentication. Mutliple authentication mechanisms are supported which correspond to specific values/data types:
+
+- `null`: No authentication
+- [UserCredentials][]: Basic authentication
+- [HttpOAuthPasswordCredentials][]: OAuth authentication using password credentials
+- [HttpOAuthClientCredentials][]: OAuth authentication using client credentials
+
+Note that when using [HttpOAuthPasswordCredentials][] or [HttpOAuthClientCredentials][] as the [Http Credentials][Http Credentials Property], the Execute Soap Request block automatically handles retrieval of access tokens using the following rules:
+
+- If an access token does not exist, a new access token will be retrieved and used when the block runs.
+- If an access token already exists but is expired, a new access token will be retrieved and used when the block runs.
+- If an access token already exists and is valid, it will be used when the block runs.
+
+|||
+|----------|----------|
+| Data Type | [HttpCredentials][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)HttpCredentials` with no value |
+
+### Soap Response
+
+The [Soap Response][Soap Response Property] object which contains the response returned from the server. This property contains all of the information in relation to the response from the server, these are:
+
+- [ResponseEnvelope][]
+- [ErrorMessage][]
+- [Headers][Headers Response]
+- [StatusCode][]
+
+Note that if the [Headers][Headers Response] contains a key of `Content-Type` with a value containing `json` or `xml`, the [ResponseEnvelope][] will be set to a [Structure][] containing the data.
+
+For more detailed information on each of the properties, see [SoapResponse][].
+
+|||
+|----------|----------|
+| Data Type | [SoapResponse][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)SoapResponse` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [HttpAuthorisationException][] | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [ResourceOwnerPassword][ResourceOwnerPassword Password Credentials] within [HttpOAuthPasswordCredentials][] is invalid. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is invalid. |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is invalid. |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is invalid. |
+| [InvalidRequestException][] | Thrown when the [Uri][] within [Soap Request][Soap Request Property] is not in the correct format or contains invalid characters. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is not in the correct format or contains invalid characters. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is not in the correct format or contains invalid characters. |
+| | Thrown when a header key in [Headers][Headers Request] within [Soap Request][Soap Request Property] is empty (i.e. `""`). |
+| | Thrown when a header key in [Headers][Headers Request] within [Soap Request][Soap Request Property] is restricted. |
+| | Thrown when a header key in [Headers][Headers Request] within [Soap Request][Soap Request Property] is restricted and forbidden. |
+| | Thrown when a header value in [Headers][Headers Request] within [Soap Request][Soap Request Property] could not be assigned to its restricted header key. |
+| | Thrown when a header value in [Headers][Headers Request] within [Soap Request][Soap Request Property] could not be converted to its restricted header key's type. |
+| | Thrown when the [Envelope][] in the [SoapMessage][SoapMessage Property] within [Soap Request][Soap Request Property] is not valid XML. |
+| | Thrown when the [HttpVersion][] within [Soap Request][Soap Request Property] is not one of the specified [HttpRequestVersion][] values (e.g. `(HttpRequestVersion)20`). |
+| [InvalidResponseException][] | Thrown when the [ResponseEnvelope][] within [Soap Response][Soap Response Property] is not valid XML. |
+| [PropertyNullException][] | Thrown when the [Soap Request][Soap Request Property] is `null`. |
+| | Thrown when the [Uri][] within [Soap Request][Soap Request Property] is `null`. |
+| | Thrown when the [SoapMessage][SoapMessage Property] within [Soap Request][Soap Request Property] is `null`. |
+| | Thrown when the [Action][] in the [Soap11Message][] within [Soap Request][Soap Request Property] is `null`. |
+| | Thrown when the [Envelope][] in the [SoapMessage][SoapMessage Property] within [Soap Request][Soap Request Property] is `null`. |
+| | Thrown when the [Username][] within [UserCredentials][] is `null`. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is `null`. |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is `null`. |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientAuthentication][ClientAuthentication Client Credentials] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is `null`. |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is `null`. |
+| [PropertyEmptyException][] | Thrown when the [Uri][] within [Soap Request][Soap Request Property] is empty (i.e. `""`). |
+| | Thrown when the [Username][] within [UserCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Password Credentials] within [HttpOAuthPasswordCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ResourceOwnerUsername][ResourceOwnerUsername Password Credentials] within [HttpOAuthPasswordCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [AccessTokenUri][AccessTokenUri Client Credentials] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ClientId][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+| | Thrown when the [ClientSecret][] in [ClientAuthentication][] within [HttpOAuthClientCredentials][] is empty (i.e. `""`). |
+
+## Remarks
+
+### Known Limitations
+
+None
+
+[Soap Request Property]: {{< ref "#soap-request" >}}
+[Http Credentials Property]: {{< ref "#http-credentials" >}}
+[Soap Response Property]: {{< ref "#soap-response" >}}
+
+[Executing a request using SOAP 1.1]: {{< ref "#executing-a-request-using-soap-11" >}}
+[Executing a request using SOAP 1.2]: {{< ref "#executing-a-request-using-soap-12" >}}
+
+[SoapRequest]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapRequest.MainDoc" >}}
+[SoapMessage Property]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapRequest.SoapMessage" >}}
+[Uri]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapRequest.Uri" >}}
+[Headers Request]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapRequest.Headers" >}}
+[HttpVersion]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapRequest.HttpVersion" >}}
+
+[SoapMessage]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapMessage.MainDoc" >}}
+[Envelope]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapMessage.Envelope" >}}
+
+[Soap11Message]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.Soap11Message.MainDoc" >}}
+[Action]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.Soap11Message.Action" >}}
+
+[Soap12Message]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.Soap12Message.MainDoc" >}}
+
+[HttpCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.HttpCredentials.MainDoc" >}}
+
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+[Username]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Username" >}}
+[Password]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.Password" >}}
+
+[HttpOAuthClientCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.MainDoc" >}}
+[AccessTokenUri Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.AccessTokenUri" >}}
+[ClientAuthentication Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthClientCredentials.ClientAuthentication" >}}
+
+[HttpOAuthPasswordCredentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.MainDoc" >}}
+[ResourceOwnerUsername Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.ResourceOwnerUsername" >}}
+[ResourceOwnerPassword Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.ResourceOwnerPassword" >}}
+[AccessTokenUri Password Credentials]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.HttpOAuthPasswordCredentials.AccessTokenUri" >}}
+
+[ClientAuthentication]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.MainDoc" >}}
+[ClientId]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.ClientId" >}}
+[ClientSecret]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.ClientSecret" >}}
+[SendAs]: {{< url path="Cortex.Reference.DataTypes.Http.Authentication.OAuth.ClientAuthentication.SendAs" >}}
+
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+
+[SoapResponse]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapResponse.MainDoc" >}}
+[ResponseEnvelope]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapResponse.ResponseEnvelope" >}}
+[ErrorMessage]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapResponse.ErrorMessage" >}}
+[Headers Response]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapResponse.Headers" >}}
+[StatusCode]: {{< url path="Cortex.Reference.DataTypes.Http.Soap.SoapResponse.StatusCode" >}}
+
+[HttpRequestVersion]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.MainDoc" >}}
+[HTTP10]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.HTTP10" >}}
+[HTTP11]: {{< url path="Cortex.Reference.DataTypes.Http.HttpRequestVersion.HTTP11" >}}
+
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[HttpAuthorisationException]: {{< url path="Cortex.Reference.Exceptions.Http.HttpAuthorisationException.MainDoc" >}}
+[InvalidRequestException]: {{< url path="Cortex.Reference.Exceptions.Http.InvalidRequestException.MainDoc" >}}
+[InvalidResponseException]: {{< url path="Cortex.Reference.Exceptions.Http.InvalidResponseException.MainDoc" >}}
+
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[API]: {{< url path="Cortex.Reference.Glossary.A-E.API" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/json/_index.md b/content/en/docs/2026.3/Reference/Blocks/json/_index.md
new file mode 100644
index 000000000..e11d8ce65
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/json/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Json"
+linkTitle: "Json"
+description: "Blocks related to working with Json."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/json/convert-json/_index.md b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/_index.md
new file mode 100644
index 000000000..57d24569d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Convert Json"
+linkTitle: "Convert Json"
+description: "Convert json to and from other data types."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-json-to-object-block.md b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-json-to-object-block.md
new file mode 100644
index 000000000..e117a50fd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-json-to-object-block.md
@@ -0,0 +1,248 @@
+---
+title: "Convert Json To Object"
+linkTitle: "Convert Json To Object"
+description: "Converts Json to an Object."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Json_ConvertJson_ConvertJsonToObjectBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Json][Json Property] to an [Object][Object Property].
+
+An additional [Settings][Settings Property] option can be specified to control how the conversion should deal with things such as:
+
+* `null` objects
+* Date Time formats and offsets
+* Number formats
+* Text escaping
+* Type information
+
+For information about the default [Settings][Settings Property] used if none are specified, as well as all other options that can be configured, please see [JsonSerializerSettings][].
+
+## Examples
+
+### Convert Json to a List (without Type information)
+
+This example will convert `"[[1, 2, 3], [4, 5, 6]]"` into a [List][]<[Object][]>.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Json][Json Property] | `($)Json`, with value `"[[1, 2, 3], [4, 5, 6]]"` | `($)Json` is a variable of type [String][] |
+| [Settings][Settings Property] | `($)Settings`, with value `null` | `($)Settings` is a variable of type [JsonSerializerSettings][] |
+| [Object][Object Property] | `($)Object`, with no value | `($)Object` is a variable that will be set to a [dynamic][] value (i.e. in this example to a [List][]<[Object][]>). |
+
+#### Result
+
+Converting `"[[1, 2, 3], [4, 5, 6]]"` to an object results in the variable `($)Object` being updated to the following:
+
+```json
+[
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 5,
+ 6
+ ]
+]
+```
+
+As the Json does not include any type information, `($)Object` will be a [List][]<[Object][]>, rather than a [List][]<[List][]<[Int32][]>>. This is because when performing the conversion there is no type information to tell the converter that the items in the list are [List][]<[Int32][]> data types.
+
+See [Convert Json to a List (with Type information)][] for an example on how to include type information in the Json.
+
+***
+
+### Convert Json to a List (with Type information)
+
+This example will convert `"[[1, 2, 3], [4, 5, 6]]"` into a [List][]<[List][]<[Int32][]>>, rather than a [List][]<[Object][]> as above.
+
+For this to work, type information needs to be included in the Json representation. This can be seen below:
+
+```json
+{
+ "$type": "System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [1,2,3]
+ },
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [4,5,6]
+ }
+ ]
+}
+```
+
+Realistically, this example is only useful if you have already produced Json including type information by using the [Convert Object To Json][] block. If this is the case, you can then convert it back with the correct data types.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Json][Json Property] | `($)Json`, with complex value as shown above | `($)Json` is a variable of type [String][] |
+| [Settings][Settings Property] | `($)Settings`, with value `new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All}` | `($)Settings` is a variable of type [JsonSerializerSettings][] |
+| [Object][Object Property] | `($)Object`, with no value | `($)Object` is a variable that will be set to a [dynamic][] value (i.e. in this example to a [List][]<[List][]<[Int32][]>>). |
+
+#### Result
+
+Converting:
+
+```json
+{
+ "$type": "System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [1,2,3]
+ },
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [4,5,6]
+ }
+ ]
+}
+```
+
+to an object results in the variable `($)Object` being updated to the following:
+
+```json
+[
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 5,
+ 6
+ ]
+]
+```
+
+As the Json does include type information, `($)Object` will be a [List][]<[List][]<[Int32][]>>, rather than a [List][]<[Object][]>.
+
+***
+
+## Properties
+
+### Json
+
+The [Json][Json Property] to convert into an [Object][Object Property].
+
+During the conversion it will be attempted to convert the [Json][Json Property] to the correct data type where possible. If the correct data type cannot be determined, then collection data types will be converted to a [List][]<[dynamic][]>, and other objects will be converted to a [Structure][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Json` with no value |
+
+### Settings
+
+Optional [Settings][Settings Property] that can be specified to control how the conversion should deal with things such as:
+
+* `null` objects
+* Date Time formats and offsets
+* Number formats
+* Text escaping
+
+For information about the default [Settings][Settings Property] used if none are specified, as well as all other options that can be configured, please see [JsonSerializerSettings][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [JsonSerializerSettings][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `new JsonSerializerSettings {}` |
+
+### Object
+
+The [Object][Object Property] that has been converted from [Json][Json Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Object` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [JsonReaderException][] | Thrown when an error occurs reading the [Json][Json Property]. |
+| [JsonSerializationException][] | Thrown when an error occurs converting the [Json][Json Property] to an [Object][Object Property]. |
+| [PropertyEmptyException][] | Thrown when [Json][Json Property] is empty (i.e. `""`). |
+| [PropertyNullException][] | Thrown when [Json][Json Property] is `null`. |
+
+## Remarks
+
+### "{}" Json
+
+If [Json][Json Property] is set to the text `"{}"`, [Object][Object Property] will be set to an empty [Structure][].
+
+### "[]" Json
+
+If [Json][Json Property] is set to the text `"[]"`, [Object][Object Property] will be set to an empty [List][]<[dynamic][]>.
+
+### "null" Json
+
+If [Json][Json Property] is set to the text `"null"`, [Object][Object Property] will be set to `null`.
+
+### Round-tripping
+
+For most data types it should be possible to pass the Json created by a [Convert Object To Json][] block to this block, and then pass the [Object][Object Property] created by this block back to a [Convert Object To Json][] block; this is called round-tripping.
+
+It should be noted however, that not all data types will be able to be round-tripped.
+
+An example of a data type that is not able to be round-tripped is [HttpRequestHeaders][]. As it does not contain a public constructor it will not be able to be converted from its Json representation back into an [HttpRequestHeaders][]; instead a [JsonSerializationException][] will be thrown with a message like: `"Cannot create and populate list type System.Net.Http.Headers.HttpRequestHeaders"`.
+
+[Json Property]: {{< ref "#json" >}}
+[Settings Property]: {{< ref "#settings" >}}
+[Object Property]: {{< ref "#object" >}}
+
+[Convert Json to a List (with Type information)]: {{< ref "#convert-json-to-a-list-with-type-information" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[JsonReaderException]: {{< url path="JsonDotNet.JsonReaderException" >}}
+[JsonSerializationException]: {{< url path="JsonDotNet.JsonSerializationException" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[Convert Object To Json]: {{< url path="Cortex.Reference.Blocks.Json.ConvertJson.ConvertObjectToJson.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[HttpRequestHeaders]: {{< url path="Cortex.Reference.DataTypes.MostCommon.HttpRequestHeaders" >}}
+[JsonSerializerSettings]: {{< url path="Cortex.Reference.DataTypes.Json.JsonSerializerSettings.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-object-to-json-block.md b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-object-to-json-block.md
new file mode 100644
index 000000000..9cef480ae
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/json/convert-json/convert-object-to-json-block.md
@@ -0,0 +1,191 @@
+---
+title: "Convert Object To Json"
+linkTitle: "Convert Object To Json"
+description: "Converts an Object To Json."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Json_ConvertJson_ConvertObjectToJsonBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts an [Object][Object Property] to [Json][Json Property].
+
+An additional [Settings][Settings Property] option can be specified to control how the conversion should deal with things such as:
+
+* `null` objects
+* Date Time formats and offsets
+* Number formats
+* Text escaping
+* Type information
+
+For information about the default [Settings][Settings Property] used if none are specified, as well as all other options that can be configured, please see [JsonSerializerSettings][].
+
+## Examples
+
+### Convert a List to Json (without Type information)
+
+This example will convert `[[1, 2, 3], [4, 5, 6]]` to its Json representation, without including type information.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Object][Object Property] | `($)Object`, with value `[[1, 2, 3], [4, 5, 6]]` | `($)Object` is a variable of type [List][]<[List][]<[Int32][]>> |
+| [Settings][Settings Property] | `($)Settings`, with value `null` | `($)Settings` is a variable of type [JsonSerializerSettings][] |
+| [Json][Json Property] | `($)Json`, with no value | `($)Json` is a variable that will be set to a [String][] value. |
+
+#### Result
+
+Converting `[[1, 2, 3], [4, 5, 6]]` to Json results in the variable `($)Json` being updated to the following:
+
+```json
+"[[1, 2, 3],[4, 5, 6]]"
+```
+
+As the resultant Json does not include any type information, if this Json was then used as input to the [Convert Json To Object][] block, the resultant object would be a [List][]<[Object][]>, rather than a [List][]<[List][]<[Int32][]>>.
+
+See [Convert a List To Json (with Type information)][] for an example on how to include type information in the Json.
+
+***
+
+### Convert a List to Json (with Type information)
+
+This example will convert `[[1, 2, 3], [4, 5, 6]]` to its Json representation, including type information.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Object][Object Property] | `($)Object`, with value `[[1, 2, 3], [4, 5, 6]]` | `($)Object` is a variable of type [List][]<[List][]<[Int32][]>> |
+| [Settings][Settings Property] | `($)Settings`, with value `new JsonSerializerSettings{TypeNameHandling = TypeNameHandling.All}` | `($)Settings` is a variable of type [JsonSerializerSettings][] |
+| [Json][Json Property] | `($)Json`, with no value | `($)Json` is a variable that will be set to a [String][] value. |
+
+#### Result
+
+Converting `[[1, 2, 3], [4, 5, 6]]` to its Json representation (including type information) results in the variable `($)Json` being updated to the following:
+
+```json
+{
+ "$type": "System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [1,2,3]
+ },
+ {
+ "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
+ "$values": [4,5,6]
+ }
+ ]
+}
+```
+
+***
+
+## Properties
+
+### Object
+
+The [Object][Object Property] to convert to [Json][Json Property].
+
+[Object][Object Property] can be any data type.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Object` with no value |
+### Settings
+
+Optional [Settings][Settings Property] that can be specified to control how the conversion should deal with things such as:
+
+* `null` objects
+* Date Time formats and offsets
+* Number formats
+* Text escaping
+
+For information about the default [Settings][Settings Property] used if none are specified, as well as all other options that can be configured, please see [JsonSerializerSettings][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [JsonSerializerSettings][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `new JsonSerializerSettings {Formatting = Formatting.Indented}` |
+
+### Json
+
+The [Json][Json Property] that has been converted from [Object][Object Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Json` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [JsonSerializationException][] | Thrown when an error occurs converting the [Object][Object Property] to [Json][Json Property]. |
+
+## Remarks
+
+### Object is empty Structure or Object
+
+If [Object][Object Property] is set to an empty [Structure][] or [Object][], [Json][Json Property] is set to the text `"{}"`.
+
+### Object is empty List
+
+If [Object][Object Property] is set to an empty [List][], [Json][Json Property] is set to the text `"[]"`.
+
+### Null Object
+
+If [Object][Object Property] is set to `null`, [Json][Json Property] will be set to the text `"null"`.
+
+### Round-tripping
+
+For most data types it should be possible to pass the Json created by this block to the [Convert Json To Object][] block, and then pass the [Object][Object Property] created by the [Convert Json To Object][] block back to this block; this is called round-tripping.
+
+It should be noted however, that not all data types will be able to be round-tripped.
+
+An example of a data type that is not able to be round-tripped is [HttpRequestHeaders][]. As it does not contain a public constructor it will not be able to be converted from its Json representation back into an [HttpRequestHeaders][]; instead a [JsonSerializationException][] will be thrown with a message like: `"Cannot create and populate list type System.Net.Http.Headers.HttpRequestHeaders"`.
+
+[Object Property]: {{< ref "#object" >}}
+[Json Property]: {{< ref "#json" >}}
+[Settings Property]: {{< ref "#settings" >}}
+
+[Convert a List to Json (with Type information)]: {{< ref "#convert-a-list-to-json-with-type-information" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[JsonSerializationException]: {{< url path="JsonDotNet.JsonSerializationException" >}}
+
+[Convert Json To Object]: {{< url path="Cortex.Reference.Blocks.Json.ConvertJson.ConvertJsonToObject.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Object]: {{< url path="Cortex.Reference.DataTypes.All.Object.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[HttpRequestHeaders]: {{< url path="Cortex.Reference.DataTypes.MostCommon.HttpRequestHeaders" >}}
+[JsonSerializerSettings]: {{< url path="Cortex.Reference.DataTypes.Json.JsonSerializerSettings.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/logs/_index.md b/content/en/docs/2026.3/Reference/Blocks/logs/_index.md
new file mode 100644
index 000000000..e051eb041
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/logs/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Logs"
+linkTitle: "Logs"
+description: "Blocks related to creating Logs."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/logs/log-event/_index.md b/content/en/docs/2026.3/Reference/Blocks/logs/log-event/_index.md
new file mode 100644
index 000000000..1880a3453
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/logs/log-event/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Log Event"
+linkTitle: "Log Event"
+description: "Log events to the filesystem."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/logs/log-event/log-event-block.md b/content/en/docs/2026.3/Reference/Blocks/logs/log-event/log-event-block.md
new file mode 100644
index 000000000..16cd51061
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/logs/log-event/log-event-block.md
@@ -0,0 +1,554 @@
+---
+title: "Log Event"
+linkTitle: "Log Event"
+description: "Logs an event to the filesystem."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Logs_LogEvent_LogEventBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Logs.LogEvent.LogEventBlock)
+
+## Description
+
+Logs an [event][EventDetails Property] to the filesystem.
+
+Additional options can be specified:
+
+* [Event Type][EventType Property] can be specified to define the type of event being logged.
+* [Event Severity][EventSeverity Property] can be specified to define the severity of the event being logged.
+* [Started At][StartedAt Property] can be specified to define the Date and Time the event being logged started.
+* [Ended At][EndedAt Property] can be specified to define the Date and Time the event being logged ended.
+
+## Examples
+
+### Log an event
+
+This example will log details about all tasks of a multi-stage process that provisions a new user at a company.
+
+* Process: `"Provision New User"`
+ * Stage: `"Configure Active Directory"`
+ * Task: `"Add User to Azure Active Directory"`
+ * Task: `"Add User to On-Premise Active Directory"`
+ * Stage: `"Configure Email"`
+ * Task: `"Create Outlook Account"`
+ * Task: `"Create Default Signature"`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Event Details][EventDetails Property] | `($)EventDetails`, with value `{"Process":{"Provision New User":{"Stages":[{"Configure Active Directory":{"Tasks":["Add User to Azure Active Directory","Add User to On-Premise Active Directory"]}},{"Configure Email":{"Tasks":["Create Outlook Account","Create Default Signature"]}}]}}}` | `($)EventDetails` is a variable of type [Structure][]. |
+| [Event Type][EventType Property] | `($)EventType`, with value `"User Provisioning"` | `($)EventType` is a variable of type [String][]. |
+| [Event Severity][EventSeverity Property] | `($)EventSeverity`, with value `EventSeverity.Information` | `($)EventSeverity` is a variable of type [Nullable][]<[EventSeverity][]>. |
+| [Started At][StartedAt Property] | `($)StartedAt`, with value of [DateTimeOffset][] that has a text representation of `2021-11-15T10:05:32.0000000Z` | `($)StartedAt` is a variable of type [Nullable][]<[DateTimeOffset][]>. |
+| [Ended At][EndedAt Property] | `($)EndedAt`, with value of [DateTimeOffset][] that has a text representation of `2021-11-15T10:06:12.0000000Z` | `($)EndedAt` is a variable of type [Nullable][]<[DateTimeOffset][]>. |
+
+#### Result
+
+Logging the event results in the following log being written:
+
+{{< highlight go "linenos=table,hl_lines=5 8-9 14-48,linenostart=1" >}}
+{
+ "@t": "2024-09-05T08:06:15.0000000Z",
+ "@mt": "{@Event}",
+ "Event": {
+ "Type": "User Provisioning",
+ "Method": "",
+ "Duration": {
+ "StartedAt": "2024-09-05T08:05:32.0000000+00:00",
+ "EndedAt": "2024-09-05T08:06:12.0000000+00:00",
+ "InSeconds": 40,
+ "$type": "Cortex.Core.Logging.Common.EventDurationDetails, Cortex.Core.Logging"
+ },
+ "Details": {
+ "Process": {
+ "Provision New User": {
+ "Stages": {
+ "$values": [
+ {
+ "Configure Active Directory": {
+ "Tasks": {
+ "$values": [
+ "Add User to Azure Active Directory",
+ "Add User to On-Premise Active Directory"
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ {
+ "Configure Email": {
+ "$values": [
+ "Create Outlook Account",
+ "Create Default Signature"
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ }
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "Tags": {
+ "Cortex": {
+ "Tenant.Name": "default",
+ "System.Name": "default",
+ "Package.Name": "PackageName",
+ "Package.Version": "57b45289-cc81-478c-a176-88d0a6104fb2",
+ "Flow.Id": "c038b421-c7f0-4793-86ad-7bb81801ab9f",
+ "Flow.Name": "FlowName",
+ "Execution.Id": "97a98060-acc2-4d11-bc7b-14989d4cf624",
+ "Workspace.Id": "cf358365-76d8-4100-b58e-4c023563083f",
+ "Block.Id": "422c42a2-4402-430b-8c96-8f0818f2b324",
+ "Block.Name": "LogEventBlock",
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "Custom": {
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.Core.Logging.Common.EventTags, Cortex.Core.Logging"
+ },
+ "Correlation": {
+ "TraceId": "1fd6e5080a25f26b498816933ed91886",
+ "SpanId": "88f321981aa42963",
+ "ParentSpanId": "90e588941f7e20ba",
+ "$type": "Cortex.Core.Logging.Common.EventCorrelationDetails, Cortex.Core.Logging"
+ },
+ "Platform": {
+ "Node": {
+ "Name": "CustomerName.MachineName",
+ "IpAddressOrFqdn": "192.168.1.1",
+ "Versions": {
+ "OperatingSystem": "Microsoft Windows NT 10.0.20348.0",
+ "DotNet": "6.0",
+ "ServiceFabric": "10.0.1816.9590",
+ "NServiceBus": "8.1.6",
+ "Rabbitmq": "3.10.5",
+ "Erlang": "Erlang OTP 24.0 (12.0)",
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.String, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.Core.Logging.ServiceFabric.NodeDetails, Cortex.Core.Logging"
+ },
+ "Application": {
+ "Name": "fabric:/Execution/Services/Engine/32.2.4.24340",
+ "Type": "Cortex.Innovation.Execution",
+ "Version": "19.1.2.24340",
+ "$type": "Cortex.Core.Logging.ServiceFabric.ServiceFabricApplicationDetails, Cortex.Core.Logging"
+ },
+ "Service": {
+ "Name": "fabric:/Execution/Services/Engine/32.2.4.24340/Blocks/46.0.4.24340",
+ "Type": "Execution",
+ "Version": "19.1.2.24340",
+ "PartitionId": "5bf4dc16-4076-46bf-9d20-31cd6d878736",
+ "ReplicaOrInstanceId": "133697171066478481",
+ "$type": "Cortex.Core.Logging.ServiceFabric.ServiceFabricServiceDetails, Cortex.Core.Logging"
+ },
+ "Version": "2024.7",
+ "$type": "Cortex.Core.Logging.ServiceFabric.PlatformDetails, Cortex.Core.Logging"
+ },
+ "$type": "Cortex.Core.Logging.Common.StructuredEventLog, Cortex.Core.Logging"
+ },
+ "SourceContext": "Cortex.ServiceFabric.Service.Execution.ExecutionService"
+}
+{{< / highlight >}}
+
+For information about the format of the logs written, see [Anatomy of a Log][].
+
+For information about where the logs are written to, see [Configuring Logging][].
+
+***
+
+## Properties
+
+### Event Details
+
+The [Event Details][EventDetails Property] to log.
+
+[Event Details][EventDetails Property] can be any object of any data type; it does not have to be a [String][]. Using a data type like a [Structure][] allows you to [create richer logs with a more defined format][Anatomy Of A Log]. This makes them easier to consume, process and query by other systems that consume logs, such as [Grafana][], [ElasticSearch][] and [Splunk][], which are commonly used for log analysis, reporting and dashboarding.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [dynamic][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)EventDetails` with no value |
+
+### Event Type
+
+[Event Type][EventType Property] can be specified to define the type of event being logged.
+
+[Event Type][EventType Property] is a free format text property. If left blank, `null`, or empty (i.e. `""`) it will default to `Cortex.Blocks.Logs.LogEvent.LogEventBlock`.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | No value (defaults to `null`) |
+
+### Event Severity
+
+[Event Severity][EventSeverity Property] can be specified to define the severity of the event being logged.
+
+[Event Severity][EventSeverity Property] can be any of the following predefined values:
+
+* `EventSeverity.Verbose` - Logs that contain the most detailed messages. These messages may contain sensitive application data. These logs should never be enabled in a production environment.
+* `EventSeverity.Debug` - Logs that are used for interactive investigation during development. These logs should primarily contain information useful for debugging and have no long-term value.
+* `EventSeverity.Information` - Logs that track the general path of the flow execution. These logs should have long-term value.
+* `EventSeverity.Warning` - Logs that highlight an abnormal or unexpected event in the path of the flow execution, but do not otherwise cause the flow execution to exit.
+* `EventSeverity.Error` - Logs that highlight when the current flow execution exits due to an error. These should indicate a failure in the current flow execution, not a service-wide or process-wide failure.
+* `EventSeverity.Fatal` - Logs that describe an unrecoverable service or process error, or a catastrophic failure that requires immediate attention.
+
+[Event Severity][EventSeverity Property] can also be left blank or set to `null`, in which case it will default to `EventSeverity.Information`.
+
+Logs with an [Event Severity][EventSeverity Property] of `EventSeverity.Information`, have the event severity omitted from the log that is written to the filesystem. This is to save disk space, as typically the highest volume of logs produced are Information logs. This cannot be changed and is a restriction of the underlying logging system used. All non-Information logs do include the event severity in the log that is written to the filesystem.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Nullable][]<[EventSeverity][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `Information` |
+
+### Started At
+
+[Started At][StartedAt Property] can be specified to define the Date and Time the event being logged started.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+If [Started At][StartedAt Property] is left blank or set to `null`, a value of `null` will be logged.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Nullable][]<[DateTimeOffset][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `DateTimeOffset.UtcNow` |
+
+### Ended At
+
+[Ended At][EndedAt Property] can be specified to define the Date and Time the event being logged ended.
+
+Its text representation will be in the [ISO 8601 Standard][] (e.g. `2021-11-05T08:48:08.0307614+00:00`).
+
+If [Ended At][EndedAt Property] is left blank or set to `null`, a value of `null` will be logged.
+
+For more information about Date and Time, please see [Working with Date and Time][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Nullable][]<[DateTimeOffset][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `DateTimeOffset.UtcNow` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentException][] | Thrown when [Event Severity][EventSeverity Property] is not one of the specified [EventSeverity][] types (e.g. `(EventSeverity)10`). |
+| [PropertyNullException][] | Thrown when [Event Details][EventDetails Property] is `null`. |
+
+## Remarks
+
+### Configuring Logging
+
+Log settings exist for the following {{% ctx %}} Services:
+
+| Service | Default File Location | Description |
+|----------------------------|---------------------------------------|------------------------------------------------------------------------------------------------------------------------|
+| `Execution Service` | `\appsettings.json` | Execution Service is used to execute published flows in a runtime environment (e.g. Development, UAT, Production) |
+
+An example of the log settings can be found below (some settings that do not need to be modified have been omitted):
+
+{{< highlight go "linenos=table,hl_lines=5 11-15,linenostart=1" >}}
+{
+ "Cortex.Blocks.Logs": {
+ "Using": [ "Serilog.Sinks.File" ],
+ "MinimumLevel": {
+ "Default": "Verbose"
+ },
+ "WriteTo": [
+ {
+ "Name": "File",
+ "Args": {
+ "path": "%ProgramData%/Cortex/Logging/LogEventBlock-.json",
+ "rollingInterval": "Day",
+ "fileSizeLimitBytes": 50000000,
+ "rollOnFileSizeLimit": true,
+ "retainedFileCountLimit": 365
+ }
+ }
+ ]
+ }
+}
+{{< / highlight >}}
+
+A list of the main log settings (highlighted above) and an accompanying description can be found below:
+
+| Log Setting | Default Value | Description |
+|-------------|---------------|-------------|
+| `Default` | `"Verbose"` | The default minimum log level that will be logged.Possible options are `"Verbose"`, `"Debug"`, `"Information"`, `"Warning"`, `"Error"`, `"Fatal"`.The order of log levels is `"Verbose"->"Debug"->"Information"->"Warning"->"Error"->"Fatal"`. When setting the default log level, that level and every level to its right will be logged. |
+| `path` | `"%ProgramData%/Cortex/Logging/LogEventBlock-.json"` | The location that logs will be written to.This value supports use of environment variables, as seen in the default value.If any part of the location does not exist, the logging will attempt to create it.The file names written will include a date format after the `-` and before `.json` (e.g. `"LogEventBlock-yyyyMMdd.json"` -> `"LogEventBlock-20210921.json"`)The date format used will be decided by the value specified in `rollingInterval`.The file name may also include a file count number and is added automatically to make sure file names are unique. This can happen if `rollOnFileSizeLimit` is set to `true` and a log file reaches the size specified in `fileSizeLimitBytes`. It can also happen if the log file is locked by another process, preventing it from being written to. |
+| `rollingInterval` | `"Day"` | The time interval at which the logging system will create and start logging to a new log file.Possible options are `"Infinite"`, `"Year"`, `"Month"`, `"Day"`, `"Hour"`, `"Minute"`.`Infinite` means that the log files never roll over based on a time interval. |
+| `fileSizeLimitBytes` | `50000000` | The maximum file size in bytes that the loggging system will write to. Once this size is exceeded the logging system will create and start logging to a new log file.`Null` can be used to mean unlimited size.`rollOnFileSizeLimit` must be set to `true` for this setting to take effect. |
+| `rollOnFileSizeLimit` | `true` | Whether the loggging system should start creating a new log file if the current one reaches the maximum file size specified in `fileSizeLimitBytes`.Possible options are `true` and `false`. |
+| `retainedFileCountLimit` | `365` | The maximum number of files to retain on disk. Once this number is reached, the loggging system will start delete the oldest file. |
+
+Please note that if the appsetting.json file cannot be found for one of the services, the logger will use the same default settings specified above.
+
+### Anatomy of a Log
+
+The format of the logs written by this block are the same as the logs written by the rest of the {{% ctx %}} Services. This is to ensure logging is consistent and done one way within {{% ctx %}}. Hopefully this will make it easier to work with logging, and also make it easier to gain a holistic picture into what has happened to a flow execution throughout its entire lifecycle (i.e. from initial request to returning the response to the caller), rather than just what happens inside of the flow.
+
+An example log can be found below:
+
+```json
+{
+ "@t": "2024-09-05T08:06:15.0000000Z",
+ "@mt": "{@Event}",
+ "@l": "Debug",
+ "Event": {
+ "Type": "User Provisioning",
+ "Method": "",
+ "Duration": {
+ "StartedAt": "2024-09-05T08:05:32.0000000+00:00",
+ "EndedAt": "2024-09-05T08:06:12.0000000+00:00",
+ "InSeconds": 40,
+ "$type": "Cortex.Core.Logging.Common.EventDurationDetails, Cortex.Core.Logging"
+ },
+ "Details": {
+ "Process": {
+ "Provision New User": {
+ "Stages": {
+ "$values": [
+ {
+ "Configure Active Directory": {
+ "Tasks": {
+ "$values": [
+ "Add User to Azure Active Directory",
+ "Add User to On-Premise Active Directory"
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ {
+ "Configure Email": {
+ "$values": [
+ "Create Outlook Account",
+ "Create Default Signature"
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ }
+ ],
+ "$type": "System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "$type": "Cortex.DataTypes.Dictionaries.Structure, Cortex.Core.DataTypes"
+ },
+ "Tags": {
+ "Cortex": {
+ "Tenant.Name": "default",
+ "System.Name": "default",
+ "Package.Name": "PackageName",
+ "Package.Version": "57b45289-cc81-478c-a176-88d0a6104fb2",
+ "Flow.Id": "c038b421-c7f0-4793-86ad-7bb81801ab9f",
+ "Flow.Name": "FlowName",
+ "Execution.Id": "97a98060-acc2-4d11-bc7b-14989d4cf624",
+ "Workspace.Id": "cf358365-76d8-4100-b58e-4c023563083f",
+ "Block.Id": "422c42a2-4402-430b-8c96-8f0818f2b324",
+ "Block.Name": "LogEventBlock",
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "Custom": {
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.Object, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.Core.Logging.Common.EventTags, Cortex.Core.Logging"
+ },
+ "Correlation": {
+ "TraceId": "1fd6e5080a25f26b498816933ed91886",
+ "SpanId": "88f321981aa42963",
+ "ParentSpanId": "90e588941f7e20ba",
+ "$type": "Cortex.Core.Logging.Common.EventCorrelationDetails, Cortex.Core.Logging"
+ },
+ "Platform": {
+ "Node": {
+ "Name": "CustomerName.MachineName",
+ "IpAddressOrFqdn": "192.168.1.1",
+ "Versions": {
+ "OperatingSystem": "Microsoft Windows NT 10.0.20348.0",
+ "DotNet": "6.0",
+ "ServiceFabric": "10.0.1816.9590",
+ "NServiceBus": "8.1.6",
+ "Rabbitmq": "3.10.5",
+ "Erlang": "Erlang OTP 24.0 (12.0)",
+ "$type": "System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[System.String, System.Private.CoreLib]], System.Private.CoreLib"
+ },
+ "$type": "Cortex.Core.Logging.ServiceFabric.NodeDetails, Cortex.Core.Logging"
+ },
+ "Application": {
+ "Name": "fabric:/Execution/Services/Engine/32.2.4.24340",
+ "Type": "Cortex.Innovation.Execution",
+ "Version": "19.1.2.24340",
+ "$type": "Cortex.Core.Logging.ServiceFabric.ServiceFabricApplicationDetails, Cortex.Core.Logging"
+ },
+ "Service": {
+ "Name": "fabric:/Execution/Services/Engine/32.2.4.24340/Blocks/46.0.4.24340",
+ "Type": "Execution",
+ "Version": "19.1.2.24340",
+ "PartitionId": "5bf4dc16-4076-46bf-9d20-31cd6d878736",
+ "ReplicaOrInstanceId": "133697171066478481",
+ "$type": "Cortex.Core.Logging.ServiceFabric.ServiceFabricServiceDetails, Cortex.Core.Logging"
+ },
+ "Version": "2024.7",
+ "$type": "Cortex.Core.Logging.ServiceFabric.PlatformDetails, Cortex.Core.Logging"
+ },
+ "$type": "Cortex.Core.Logging.Common.StructuredEventLog, Cortex.Core.Logging"
+ },
+ "SourceContext": "Cortex.ServiceFabric.Service.Execution.ExecutionService"
+}
+```
+
+A list of each of the log's properties and an accompanying description can be found below:
+
+| Log Property | Description |
+|------------------------------------------------|---------------------------------------------------------------|
+| `@t` | The date and time the log was written. The format is [ISO 8601 Standard][]. |
+| `@mt` | The message template for the log. This is set to log the entire Event. |
+| `@l` | The level for the log. The value of [Event Severity][EventSeverity Property] is used here. |
+| `Event` | The event that was logged. |
+| `Event.Type` | The type of event that was logged. This can be used for log analysis and reporting. The value of [Event Type][EventType Property] is used here. |
+| `Event.Method` | Not currently used for logs generated by the Log Event block. |
+| `Event.Duration` | Contains the date and time the event started at, ended at, and its duration. |
+| `Event.Duration.StartedAt` | The date and time the event started. The format is [ISO 8601 Standard][]. The value of [Started At][StartedAt Property] is used here. |
+| `Event.Duration.EndedAt` | The date and time the event ended. The format is [ISO 8601 Standard][]. The value of [Ended At][EndedAt Property] is used here. |
+| `Event.Duration.InSeconds` | The duration of the event in seconds and is calculated using `Event.Duration.StartedAt` and `Event.Duration.EndedAt` . |
+| `Event.Duration.$type` | The .NET data type used to represent the duration data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Details` | Contains the details of the event. The value of [Event Details][EventDetails Property] is written as a child property of this (e.g. in this example `Event.Details.Process`). |
+| `Event.Details.$type` | The .NET data type used to represent the event details data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Tags` | Contains tags generated by the {{% ctx %}} platform as well as tags generated by the automation solution running on the {{% ctx %}} platform. |
+| `Event.Tags.Cortex` | Contains tags generated by the {{% ctx %}} platform. |
+| `Event.Tags.Cortex.Tenant.Name` | The name of the tenant the flow that generated this log belongs to. |
+| `Event.Tags.Cortex.System.Name` | The name of the system the flow that generated this log belongs to. |
+| `Event.Tags.Cortex.Package.Name` | The name of the package containing the flow that generated this log. |
+| `Event.Tags.Cortex.Package.Version` | The version of the package containing the flow that generated this log. |
+| `Event.Tags.Cortex.Flow.Id` | The ID of the flow containing the block that generated this log. |
+| `Event.Tags.Cortex.Flow.Name` | The name of the flow containing the block that generated this log. |
+| `Event.Tags.Cortex.Execution.Id` | The ID of the execution that generated this log. |
+| `Event.Tags.Cortex.Workspace.Id` | The ID of the workspace containing the block that generated this log. |
+| `Event.Tags.Cortex.Block.Id` | The ID of the block that generated this log. |
+| `Event.Tags.Cortex.Block.Name` | The name of the block that generated this log. |
+| `Event.Tags.Cortex.$type` | The .NET data type used to represent the {{% ctx %}} tags data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Tags.Custom` | Contains custom tags generated by the automation solution running on the {{% ctx %}} platform. |
+| `Event.Tags.Custom.$type` | The .NET data type used to represent the custom tags data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Tags.$type` | The .NET data type used to represent the tags data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Correlation` | Contains details that can be used to correlate related events. E.g. The act of starting a new flow execution may result in multiple {{% ctx %}} Services processing the event. As a result, each service may write its own logs, and additionally the flow developer may also write out multiple logs during the flow execution. The Correlation details allow all of these logs to easily be correlated back together when performing log analysis and reporting to gain a full picture of everything that happened. |
+| `Event.Correlation.TraceId` | ID common to all related logs, so they can be easily correlated together. |
+| `Event.Correlation.SpanId` | Unique ID for each log, so tools like [Grafana][] can display a call stack, showing each step that occurred when processing an event. |
+| `Event.Correlation.ParentSpanId` | The ID of the step that called this step of processing, so tools like [Grafana][] can display a call stack, showing each step that occurred when processing an event. |
+| `Event.Correlation.$type` | The .NET data type used to represent the correlation data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Platform` | Contains the details about the platform in which the log was written. |
+| `Event.Platform.Node` | Contains the details about the node in which the log was written. |
+| `Event.Platform.Node.Name` | The name of the node in which the log was written. |
+| `Event.Platform.Node.IpAddressOrFqdn` | The IP Address or Fully Qualified Domain Name of the node in which the log was written. |
+| `Event.Platform.Node.Versions` | Contains the details about the versions of software running on the node in which the log was written. |
+| `Event.Platform.Node.Versions.OperatingSystem` | The name and version of the Operating system on the node in which the log was written. |
+| `Event.Platform.Node.Versions.DotNet` | The version of .NET used by the node in which the log was written. |
+| `Event.Platform.Node.Versions.ServiceFabric` | The version of Service Fabric used by the node in which the log was written. |
+| `Event.Platform.Node.Versions.NServiceBus` | The version of NServiceBus used by the node in which the log was written. |
+| `Event.Platform.Node.Versions.Rabbitmq` | The version of RabbitMQ used by the node in which the log was written. |
+| `Event.Platform.Node.Versions.Erlang` | The version of Erlang used by the node in which the log was written. |
+| `Event.Platform.Node.Versions.$type` | The .NET data type used to represent the platform node version data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Platform.Node.$type` | The .NET data type used to represent the platform node data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Platform.Application` | Contains the details of the application in which the log was written. |
+| `Event.Platform.Application.Name` | The name of the application in which the log was written. |
+| `Event.Platform.Application.Type` | The type of the application in which the log was written. |
+| `Event.Platform.Application.Version` | The version of the application type in which the log was written. |
+| `Event.Platform.Application.$type` | The .NET data type used to represent the platform application data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Platform.Service` | Contains the details of the service in which the log was written. |
+| `Event.Platform.Service.Name` | The name of the service in which the log was written. |
+| `Event.Platform.Service.Type` | The type of the service in which the log was written. |
+| `Event.Platform.Service.Version` | The version of the service type in which the log was written. |
+| `Event.Platform.Service.PartitionId` | The Partition ID of the service in which the log was written. |
+| `Event.Platform.Service.ReplicaOrInstanceId` | The Replica or Instance ID of the service in which the log was written. |
+| `Event.Platform.Service.$type` | The .NET data type used to represent the service data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.Platform.Version` | The version of {{% ctx %}} that was used to write the log. |
+| `Event.Platform.$type` | The .NET data type used to represent the platform data. This can be ignored and is an artefact of the underlying implementation. |
+| `Event.$type` | The .NET data type used to represent the event data. This can be ignored and is an artefact of the underlying implementation. |
+| `SourceContext` | The .NET data type of the Execution Service. This can be ignored and is an artefact of the underlying implementation. |
+### Null or Empty Event Type
+
+If [Event Type][EventType Property] is left blank, `null`, or empty (i.e. `""`) it will default to `Cortex.Blocks.Logs.LogEvent.LogEventBlock`.
+
+### Null Event Severity
+
+If [Event Severity][EventSeverity Property] is left blank or set to `null`, it will default to `EventSeverity.Information`.
+
+### Null Started At
+
+If [Started At][StartedAt Property] is left blank or set to `null`, a value of `null` will be logged.
+
+### Null Ended At
+
+If [Ended At][EndedAt Property] is left blank or set to `null`, a value of `null` will be logged.
+
+[EventDetails Property]: {{< ref "#event-details" >}}
+[EventType Property]: {{< ref "#event-type" >}}
+[EventSeverity Property]: {{< ref "#event-severity" >}}
+[StartedAt Property]: {{< ref "#started-at" >}}
+[EndedAt Property]: {{< ref "#ended-at" >}}
+
+[Configuring Logging]: {{< ref "#configuring-logging" >}}
+[Anatomy of a Log]: {{< ref "#anatomy-of-a-log" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[ISO 8601 Standard]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+
+[Grafana]: {{< url path="Grafana.MainDoc" >}}
+[ElasticSearch]: {{< url path="ElasticSearch.MainDoc" >}}
+[Splunk]: {{< url path="Splunk.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Nullable]: {{< url path="Cortex.Reference.DataTypes.Other.Nullable.MainDoc" >}}
+[EventSeverity]: {{< url path="Cortex.Reference.DataTypes.Logs.EventSeverity.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/loops/_index.md b/content/en/docs/2026.3/Reference/Blocks/loops/_index.md
new file mode 100644
index 000000000..42361b03e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/loops/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Loops"
+linkTitle: "Loops"
+description: "Blocks used to perform looping."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/loops/for-each/_index.md b/content/en/docs/2026.3/Reference/Blocks/loops/for-each/_index.md
new file mode 100644
index 000000000..8d9e8c1bd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/loops/for-each/_index.md
@@ -0,0 +1,5 @@
+---
+title: "For Each Loop"
+linkTitle: "For Each Loop"
+description: "Blocks used to loop through the items in a collection (i.e. Lists, Dictionaries and Structures)."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/loops/for-each/for-each-loop-block.md b/content/en/docs/2026.3/Reference/Blocks/loops/for-each/for-each-loop-block.md
new file mode 100644
index 000000000..882a7bbfe
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/loops/for-each/for-each-loop-block.md
@@ -0,0 +1,186 @@
+---
+title: "For Each Loop"
+linkTitle: "For Each Loop"
+description: "Loops through all items in the specified collection (i.e. Lists, Dictionaries and Structures)."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Loops_ForEach_ForEachLoopBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Loops.ForEach.ForEachLoopBlock)
+
+## Description
+
+Loops through all items in the specified [Collection][Collection Property] (i.e. Lists, Dictionaries and Structures).
+
+The `"Index"` and `"Value"` of the current item are returned as properties of a [Structure][], which is saved to the [Current Iteration][CurrentIteration Property].
+
+## Examples
+
+### Loop through all items in a list
+
+This example will loop through all items in `["Item1", "Item2", "Item3"]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection][Collection Property] | `($)Collection`, with value `["Item1", "Item2", "Item3"]` | `($)Collection` is a variable of type [IList][]<[String][]> |
+| [Current Iteration][CurrentIteration Property] | `($)CurrentIteration`, with no value | `($)CurrentIteration` is a variable of type [Structure][] |
+
+#### Result
+
+Looping through all items in `["Item1", "Item2", "Item3"]` will result in `3` loops with `($)CurrentIteration` being updated to the following:
+
+1st loop
+
+```json
+{
+ "Index": 0,
+ "Value": "Item1"
+}
+```
+
+2nd loop
+
+```json
+{
+ "Index": 1,
+ "Value": "Item2"
+}
+```
+
+3rd loop
+
+```json
+{
+ "Index": 2,
+ "Value": "Item3"
+}
+```
+
+***
+
+### Loop through all items in a dictionary or structure
+
+This example will loop through all items in `{"Key1": "Value1", "Key2": "Value2", "Key3": "Value3"}`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Collection][Collection Property] | `($)Collection`, with value `{"Key1": "Value1", "Key2": "Value2", "Key3": "Value3"}` | `($)Collection` is a variable of type [IDictionary][]<[String][], [String][]> or [Structure][] |
+| [Current Iteration][CurrentIteration Property] | `($)CurrentIteration`, with no value | `($)CurrentIteration` is a variable of type [Structure][] |
+
+#### Result
+
+Looping through all items in `{"Key1": "Value1", "Key2": "Value2", "Key3": "Value3"}` will result in `3` loops with `($)CurrentIteration` being updated to the following:
+
+1st loop
+
+```json
+{
+ "Index": 0,
+ "Value": {
+ "Key": "Key1",
+ "Value": "Value1"
+ }
+}
+```
+
+2nd loop
+
+```json
+{
+ "Index": 1,
+ "Value": {
+ "Key": "Key2",
+ "Value": "Value2"
+ }
+}
+```
+
+3rd loop
+
+```json
+{
+ "Index": 2,
+ "Value": {
+ "Key": "Key3",
+ "Value": "Value3"
+ }
+}
+```
+
+***
+
+## Properties
+
+### Collection
+
+The [Collection][Collection Property] to loop through.
+
+If [Collection][Collection Property] is empty (i.e. contains no items), no looping will occur.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Collection` with no value |
+
+### Current Iteration
+
+The [Current Iteration][CurrentIteration Property] the looping is at.
+
+[Current Iteration][CurrentIteration Property] is set to a [Structure] on each loop, containing the current item's `"Index"` and `"Value"`. `"Index"` is set to `0` on the first loop, and on each subsequent loop is incremented by `1`.
+
+Looping will continue whilst `"Index"` is less than the number of items in [Collection][Collection Property], with the flow execution exiting via the block's right port (blue loop icon).
+
+Once `"Index"` equals the number of items in [Collection][Collection Property], looping stops, the flow execution exits via the block's bottom port (green tick) and [Current Iteration][CurrentIteration Property] is reset to an empty [Structure][].
+
+If [Current Iteration][CurrentIteration Property] `"Index"` is modified during a loop, it will automatically be set back to its original value immediately before the next loop begins.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Structure][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CurrentIteration` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Collection][Collection Property] is `null`. |
+
+## Remarks
+
+### Empty Collection
+
+If [Collection][Collection Property] is empty (i.e. contains no items), no looping will occur.
+
+[Collection Property]: {{< ref "#collection" >}}
+[CurrentIteration Property]: {{< ref "#current-iteration" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IEnumerable]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/loops/for/_index.md b/content/en/docs/2026.3/Reference/Blocks/loops/for/_index.md
new file mode 100644
index 000000000..98ef5db5a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/loops/for/_index.md
@@ -0,0 +1,5 @@
+---
+title: "For Loop"
+linkTitle: "For Loop"
+description: "Blocks used to loop a specified number of times."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/loops/for/for-loop-block.md b/content/en/docs/2026.3/Reference/Blocks/loops/for/for-loop-block.md
new file mode 100644
index 000000000..8b2f4d4df
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/loops/for/for-loop-block.md
@@ -0,0 +1,254 @@
+---
+title: "For Loop"
+linkTitle: "For Loop"
+description: "Loops a specified number of times based on a given start index, end index and increment."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Loops_For_ForLoopBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Loops.For.ForLoopBlock)
+
+## Description
+
+Loops a specified number of times based on a given [Start Index][StartIndex Property], [End Index][EndIndex Property] and [Increment][Increment Property].
+
+## Examples
+
+### Loop between 0 and 2 incrementing by 1
+
+This example will loop between `0` and `2` incrementing by `1` each loop.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `0` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `2` | `($)EndIndex` is a variable of type [Int32][] |
+| [Increment][Increment Property] | `($)Increment`, with value `1` | `($)Increment` is a variable of type [Int32][] |
+| [Current Index][CurrentIndex Property] | `($)CurrentIndex`, with value `0` | `($)CurrentIndex` is a variable of type [Int32][] that will be incremented by `($)Increment` each loop |
+
+#### Result
+
+Looping between `0` and `2` incrementing by `1` each loop will result in `3` loops with `($)CurrentIndex` being updated to the following:
+
+1st loop
+
+```json
+0
+```
+
+2nd loop
+
+```json
+1
+```
+
+3rd loop
+
+```json
+2
+```
+
+***
+
+### Loop between 10 and 20 incrementing by 5
+
+This example will loop between `10` and `20` incrementing by `5` each loop.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `10` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `20` | `($)EndIndex` is a variable of type [Int32][] |
+| [Increment][Increment Property] | `($)Increment`, with value `5` | `($)Increment` is a variable of type [Int32][] |
+| [Current Index][CurrentIndex Property] | `($)CurrentIndex`, with value `0` | `($)CurrentIndex` is a variable of type [Int32][] that will be incremented by `($)Increment` each loop |
+
+#### Result
+
+Looping between `10` and `20` incrementing by `5` each loop will result in `3` loops with `($)CurrentIndex` being updated to the following:
+
+1st loop
+
+```json
+10
+```
+
+2nd loop
+
+```json
+15
+```
+
+3rd loop
+
+```json
+20
+```
+
+***
+
+### Loop between 20 and 10 incrementing by -5
+
+This example will loop between `20` and `10` incrementing by `-5` each loop.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Start Index][StartIndex Property] | `($)StartIndex`, with value `20` | `($)StartIndex` is a variable of type [Int32][] |
+| [End Index][EndIndex Property] | `($)EndIndex`, with value `10` | `($)EndIndex` is a variable of type [Int32][] |
+| [Increment][Increment Property] | `($)Increment`, with value `-5` | `($)Increment` is a variable of type [Int32][] |
+| [Current Index][CurrentIndex Property] | `($)CurrentIndex`, with value `0` | `($)CurrentIndex` is a variable of type [Int32][] that will be incremented by `($)Increment` each loop |
+
+#### Result
+
+Looping between `20` and `10` incrementing by `-5` each loop will result in `3` loops with `($)CurrentIndex` being updated to the following:
+
+1st loop
+
+```json
+20
+```
+
+2nd loop
+
+```json
+15
+```
+
+3rd loop
+
+```json
+10
+```
+
+***
+
+## Properties
+
+### Start Index
+
+The [Start Index][StartIndex Property] the looping will start at. This is an inclusive index, which means the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### End Index
+
+The [End Index][EndIndex Property] the looping will end at. This is an inclusive index, which means the specified index will be included.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `0` |
+
+### Increment
+
+The [Increment][Increment Property] to be added to [Current Index][CurrentIndex Property] every time the block loops.
+
+[Increment][Increment Property] can be:
+
+* A positive value if [Start Index][StartIndex Property] is less than [End Index][EndIndex Property].
+* A negative value if [Start Index][StartIndex Property] is greater than [End Index][EndIndex Property].
+* A positive or negative value if [Start Index][StartIndex Property] is equal to [End Index][EndIndex Property].
+
+If any of the above are not `true` or [Increment][Increment Property] is `0` then an [InfiniteLoopException][] will be thrown the first time a flow execution executes this block.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | `1` |
+
+### Current Index
+
+The [Current Index][CurrentIndex Property] the looping is at.
+
+[Current Index][CurrentIndex Property] initially gets set to the value of [Start Index][StartIndex Property] on the first loop, and on each subsequent loop is incremented by the value of [Increment][Increment Property].
+
+If [Increment][Increment Property] is a positive value, the block will continue looping whilst [Current Index][CurrentIndex Property] is less than [End Index][EndIndex Property]; with the flow execution exiting via the block's right port (blue loop icon).
+
+If [Increment][Increment Property] is a negative value, the block will continue looping whilst [Current Index][CurrentIndex Property] is greater than [Start Index][StartIndex Property]; with the flow execution exiting via the block's right port (blue loop icon).
+
+When either of the above are not `true` the block stops looping, the flow execution exits via the block's bottom port (green tick) and [Current Index][CurrentIndex Property] is reset to `0`
+
+At this moment, there is a known limitation with [Current Index][CurrentIndex Property], which requires the variable used must have an [Int32][] value assigned to it before the block executes. If it does not then an [InvalidPropertyValueException][] will be thrown the first time a flow execution executes this block.
+
+For information about what an index is, please see [Indexes][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)CurrentIndex` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InfiniteLoopException][] | Thrown when [Increment][Increment Property] is `0`. See [Increment Is Zero][]. |
+| | Thrown when [Increment][Increment Property] has a positive value and [Start Index][StartIndex Property] is greater than [End Index][EndIndex Property]. See [Increment Is Positive][]. |
+| | Thrown when [Increment][Increment Property] has a negative value and [Start Index][StartIndex Property] is less than [End Index][EndIndex Property]. See [Increment Is Negative][]. |
+| [InvalidPropertyValueException][] | Thrown when [Current Index][CurrentIndex Property] does not have an [Int32][] value assigned to it before the block executes. See [Value Is Invalid][]. |
+
+## Remarks
+
+### Start Index and End Index are inclusive
+
+The [Start Index][StartIndex Property] and [End Index][EndIndex Property] properties are both inclusive [indexes][], which means those indexes will be included in the looping range (e.g. if [Start Index][StartIndex Property] is `0` and [End Index][EndIndex Property] is `1`, the block will loop `2` times).
+
+### Start Index greater than End Index
+
+[Start Index][StartIndex Property] can be greater than [End Index][EndIndex Property]. If this is the case, [Increment][Increment Property] must be a negative value. See [Example][StartIndexGreaterThanEndIndex Example] above.
+
+### Known Limitations
+
+The variable used for [Current Index][CurrentIndex Property] must have an [Int32][] value assigned to it before the block executes. If it does not then an [InvalidPropertyValueException][] will be thrown the first time a flow execution executes this block.
+
+[StartIndex Property]: {{< ref "#start-index" >}}
+[EndIndex Property]: {{< ref "#end-index" >}}
+[Increment Property]: {{< ref "#increment" >}}
+[CurrentIndex Property]: {{< ref "#current-index" >}}
+
+[StartIndexGreaterThanEndIndex Example]: {{< ref "#loop-between-20-and-10-incrementing-by--5" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[InfiniteLoopException]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.MainDoc" >}}
+[Increment Is Zero]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.IncrementIsZero" >}}
+[Increment Is Negative]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.IncrementIsNegative" >}}
+[Increment Is Positive]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.IncrementIsPositive" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/microsoft365/_index.md b/content/en/docs/2026.3/Reference/Blocks/microsoft365/_index.md
new file mode 100644
index 000000000..1b6a801db
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/microsoft365/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Microsoft365"
+linkTitle: "Microsoft365"
+description: "Blocks related to working with Microsoft365."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/_index.md b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/_index.md
new file mode 100644
index 000000000..2de0946a1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Outlook"
+linkTitle: "Outlook"
+description: "Blocks related to working with Outlook."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/_index.md b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/_index.md
new file mode 100644
index 000000000..c12558811
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Send Email"
+linkTitle: "Send Email"
+description: "Blocks related to sending Emails."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/send-email-using-microsoft365-block.md b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/send-email-using-microsoft365-block.md
new file mode 100644
index 000000000..cb700400a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/microsoft365/outlook/send-email/send-email-using-microsoft365-block.md
@@ -0,0 +1,278 @@
+---
+title: "Send Email Using Microsoft 365"
+linkTitle: "Send Email Using Microsoft 365"
+description: "Sends an email using the SMTP server hosted by Outlook."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Microsoft365_Outlook_SendEmail_SendEmailUsingMicrosoft365Block.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Connects to the [SMTP][] server hosted by [Outlook][] using the specified [Credentials][Credentials Property], and sends an [Email Message][Email Message Property].
+
+This block only supports authentication via OAuth (using [Microsoft365OAuthCredentials][] or [Microsoft365OAuthCertificateCredentials][]), to send an email using basic authentication, see [Send Email Using SMTP Server][].
+
+## Examples
+
+### Sending an email using client credentials
+
+This example will send an email from `sender@outlook.com` to `recipient@outlook.com` using the [SMTP][] server hosted by [Outlook][].
+
+The OAuth mechanism in this example uses client credentials. Therefore, for this example to work correctly, the [Credentials][Credentials Property] provided must be a [Microsoft365OAuthCredentials][].
+
+For more information on:
+
+- What each of the properties in the [Microsoft365OAuthCredentials][] needs to be, see [Microsoft365OAuthCredentials][]
+- How to set up an [Outlook][] account so that this authentication mechanism can be used, see [Setting up an Outlook account for OAuth authentication using client credentials][]
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@outlook.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@outlook.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Credentials][Credentials Property] | `($)Credentials` with value `{"ClientId": "clientId", "ClientSecret": "encryptedClientSecret", "TenantId": "tenantId", ObjectId: "objectId"}`
In this example `($)Credentials` has been set up using the following [Expression][]:
`new Microsoft365OAuthCredentials(clientId: "clientId", clientSecret: "encryptedClientSecret", tenantId: "tenantId", objectId: "objectId")` | `($)Credentials` is a variable of type [Microsoft365OAuthCredentials][]
The [ClientSecret][ClientSecret Client Credentials] property in the [Microsoft365OAuthCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@outlook.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the connection is closed.
+
+***
+
+### Sending an email using certificate credentials
+
+This example will send an email from `sender@outlook.com` to `recipient@outlook.com` using the [SMTP][] server hosted by [Outlook][].
+
+The OAuth mechanism in this example uses certificate credentials. Therefore, for this example to work correctly:
+
+- [Credentials][Credentials Property] provided must be a [Microsoft365OAuthCertificateCredentials][]
+- [CertificatePath][] must be a path pointing to a certificate accessible from the server executing the flow
+
+For more information on:
+
+- What each of the properties in the [Microsoft365OAuthCertificateCredentials][] needs to be, see [Microsoft365OAuthCertificateCredentials][]
+- How to set up an [Outlook][] account so that this authentication mechanism can be used, see [Setting up an Outlook account for OAuth authentication using certificate credentials][]
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Email Message][Email Message Property] | `($)EmailMessage` with value `{"To": [{"Name": null, "Address": "recipient@outlook.com"}], "From": {"Name": null, "Address": "sender@outlook.com"}, "Cc": [], "Bcc": [], "Priority": null, "Subject": "Example email subject", "BodyFormat": null, "Body": "Example email body", "Attachments": []}`
In this example `($)EmailMessage` has been set up using the following [Expression][]:
`new EmailMessage(to: new List(){ new EmailAddress("recipient@outlook.com") }, from: new EmailAddress("sender@outlook.com"), cc: null, bcc: null, priority: null, subject: "Example email subject", bodyFormat: null, body: "Example email body", attachments: null)` | `($)EmailMessage` is a variable of type [EmailMessage][]
As [Priority][] and [BodyFormat][] are `null`, the email will be sent with a [Text][] body and [Normal][] priority.|
+| [Credentials][Credentials Property] | `($)Credentials` with value `{"CertificatePath": "C:\\certificate.pfx", "CertificatePassword": "encryptedPassword", "ClientId": "clientId", "TenantId": "tenantId", "ObjectId": "objectId"}`
In this example `($)Credentials` has been set up using the following [Expression][]:
`new Microsoft365OAuthCertificateCredentials(certificatePath: @"C:\certificate.pfx", certificatePassword: "encryptedPassword", clientId: "clientId", tenantId: "tenantId", objectId: "objectId")` | `($)Credentials` is a variable of type [Microsoft365OAuthCertificateCredentials][]
The [CertificatePassword][] property in the [Microsoft365OAuthCertificateCredentials][] must be encrypted, for more information on how to encrypt the password, see [EncryptedText][]. |
+
+#### Result
+
+An email with [Normal][] priority is sent from `sender@outlook.com` to `recipient@outlook.com` with a subject of `"Example email subject"` and a [Text][] body of `"Example email body"`, and then the connection is closed.
+
+***
+
+## Properties
+
+### Email Message
+
+The [Email Message][Email Message Property] to send via the [SMTP][] server hosted by [Outlook][]. This property contains all of the information in relation to the email to be sent, these are:
+
+- [To][]
+- [From][]
+- [Cc][]
+- [Bcc][]
+- [Priority][]
+- [Subject][]
+- [BodyFormat][]
+- [Body][]
+- [Attachments][]
+
+Note that if the properties [Priority][] and [BodyFormat][] are set to `null` when [creating an EmailMessage using a constructor][], the email will be sent with [Normal][] priority and with a [Text][] body.
+
+For more detailed information on each of the properties, see [EmailMessage][].
+
+|||
+|----------|----------|
+| Data Type | [EmailMessage][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [EmailMessage][] with value shown below: |
+
+```json
+{
+ "To": [
+ {
+ "Name": null,
+ "Address": ""
+ }
+ ],
+ "From": {
+ "Name": "",
+ "Address": ""
+ },
+ "Cc": [],
+ "Bcc": [],
+ "Priority": "EmailMessagePriority.Normal",
+ "Subject": "",
+ "BodyFormat": "EmailMessageBodyFormat.Text",
+ "Body": "",
+ "Attachments": []
+}
+```
+
+### Credentials
+
+The [Credentials][Credentials Property] object that includes all of the information required to connect to an [SMTP][] server hosted by [Outlook][]. There are two data types that can be used, which depends on the desired OAuth mechanism:
+
+- [Microsoft365OAuthCredentials][]: Using client credentials. For information on:
+ - What each of the properties in the [Microsoft365OAuthCredentials][] needs to be, see [Microsoft365OAuthCredentials][]
+ - How to set up an [Outlook][] account so that this authentication mechanism can be used, see [Setting up an Outlook account for OAuth authentication using client credentials][]
+- [Microsoft365OAuthCertificateCredentials][]: Using certificate credentials. For information on:
+ - What each of the properties in the [Microsoft365OAuthCertificateCredentials][], see [Microsoft365OAuthCertificateCredentials][]
+ - How to set up an [Outlook][] account so that this authentication mechanism can be used, see [Setting up an Outlook account for OAuth authentication using certificate credentials][]
+
+Note that the Send Email Using Microsoft 365 block automatically handles retrieval of access tokens using the following rules:
+
+- If an access token does not exist, a new access token will be retrieved and used when the block runs.
+- If an access token already exists but is expired, a new access token will be retrieved and used when the block runs.
+- If an access token already exists and is valid, it will be used when the block runs.
+
+It is recommended to use a [Variable][] for [Credentials][Credentials Property] when it will be used across multiple Send Email Using Microsoft 365 blocks, as using a variable will allow for reuse of the same access token. Using a [Literal][] to set the [Credentials][Credentials Property] will cause the access token to only be used once and a new acccess token will be requested for every Send Email Using Microsoft 365 block.
+
+|||
+|----------|----------|
+| Data Type | [Microsoft365Credentials][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Microsoft365OAuthCredentials][] with value shown below: |
+
+```json
+{
+ "ClientId": "",
+ "ClientSecret": "",
+ "TenantId": "",
+ "ObjectId": "",
+}
+```
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [ArgumentException][] |Thrown when [BodyFormat][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessageBodyFormat][] values (e.g. `(EmailMessageBodyFormat)10`).|
+| |Thrown when [Priority][] within the [Email Message][Email Message Property] is not one of the specified [EmailMessagePriority][] values (e.g. `(EmailMessagePriority)10`).|
+| [CryptographicException][] | Thrown when an incorrect [CertificatePath][] is provided within [Microsoft365OAuthCertificateCredentials][]. |
+| | Thrown when an incorrect [CertificatePassword][] is provided within [Microsoft365OAuthCertificateCredentials][]. |
+| [FileNotFoundException][] |Thrown when a non-existent file path is provided in [Attachments][] within [Email Message][Email Message Property]. |
+| [IOException][] |Thrown when the desired socket is held by another process; re-running the flow typically solves this. |
+| [MsalServiceException][] | Thrown when an invalid [ClientId][ClientId Client Credentials] is provided within [Microsoft365OAuthCredentials][]. |
+| | Thrown when an invalid [ClientSecret][ClientSecret Client Credentials] is provided within [Microsoft365OAuthCredentials][]. |
+| | Thrown when an invalid [TenantId][TenantId Client Credentials] is provided within [Microsoft365OAuthCredentials][]. |
+| | Thrown when an invalid [ClientId][ClientId Certificate Credentials] is provided within [Microsoft365OAuthCertificateCredentials][]. |
+| | Thrown when an invalid [TenantId][TenantId Certificate Credentials] is provided within [Microsoft365OAuthCertificateCredentials][]. |
+| [PropertyNullException][] |Thrown when the [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [To][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [From][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is `null`. |
+| |Thrown when the [Credentials][Credentials Property] is `null`. |
+| |Thrown when the [ClientId][ClientId Client Credentials] within [Microsoft365OAuthCredentials][] is `null`. |
+| |Thrown when the [ClientSecret][ClientSecret Client Credentials] within [Microsoft365OAuthCredentials][] is `null`. |
+| |Thrown when the [TenantId][TenantId Client Credentials] within [Microsoft365OAuthCredentials][] is `null`. |
+| |Thrown when the [ObjectId][ObjectId Client Credentials] within [Microsoft365OAuthCredentials][] is `null`. |
+| |Thrown when the [CertificatePath][] within [Microsoft365OAuthCertificateCredentials][] is `null`. |
+| |Thrown when the [CertificatePassword][] within [Microsoft365OAuthCertificateCredentials][] is `null`. |
+| |Thrown when the [ClientId][ClientId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is `null`. |
+| |Thrown when the [TenantId][TenantId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is `null`. |
+| |Thrown when the [ObjectId][ObjectId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is `null`. |
+| [PropertyEmptyException][] |Thrown when the [To][] within [Email Message][Email Message Property] is empty (i.e. `[]`). |
+| |Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is empty (i.e. `""`). |
+| |Thrown when the [ClientId][ClientId Client Credentials] within [Microsoft365OAuthCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [ClientSecret][ClientSecret Client Credentials] within [Microsoft365OAuthCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [TenantId][TenantId Client Credentials] within [Microsoft365OAuthCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [ObjectId][ObjectId Client Credentials] within [Microsoft365OAuthCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [CertificatePath][] within [Microsoft365OAuthCertificateCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [CertificatePassword][] within [Microsoft365OAuthCertificateCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [ClientId][ClientId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [TenantId][TenantId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is empty (i.e. `""`). |
+| |Thrown when the [ObjectId][ObjectId Certificate Credentials] within [Microsoft365OAuthCertificateCredentials][] is empty (i.e. `""`). |
+| [ServiceException][] | Thrown when an invalid [ObjectId][ObjectId Client Credentials] is provided within [Microsoft365OAuthCredentials][]. |
+| | Thrown when an invalid [ObjectId][ObjectId Certificate Credentials] is provided within [Microsoft365OAuthCertificateCredentials][]. |
+| | Thrown when trying to send an email as a user that the client application does not have rights to send as. |
+| | Thrown when the [Address][] in an [EmailAddress][] within [Email Message][Email Message Property] is not of the correct format ([RFC 5321][]). |
+| [UnauthorizedAccessException][] |Thrown when access is denied to a file provided in [Attachments][] within [Email Message][Email Message Property]. |
+
+## Remarks
+
+### Known Limitations
+
+None
+
+[Email Message Property]: {{< ref "#email-message" >}}
+[Credentials Property]: {{< ref "#credentials" >}}
+
+[EmailMessage]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.MainDoc" >}}
+[To]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.To" >}}
+[From]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.From" >}}
+[Cc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Cc" >}}
+[Bcc]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Bcc" >}}
+[Priority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Priority" >}}
+[Subject]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Subject" >}}
+[BodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.BodyFormat" >}}
+[Body]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Body" >}}
+[Attachments]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.Attachments" >}}
+[creating an EmailMessage using a constructor]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessage.CreateAnEmailMessage" >}}
+
+[EmailAddress]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.MainDoc" >}}
+[Address]: {{< url path="Cortex.Reference.DataTypes.Email.EmailAddress.Address" >}}
+
+[EmailMessagePriority]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.MainDoc" >}}
+[Normal]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessagePriority.Normal" >}}
+
+[EmailMessageBodyFormat]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.MainDoc" >}}
+[Text]: {{< url path="Cortex.Reference.DataTypes.Email.EmailMessageBodyFormat.Text" >}}
+
+[Microsoft365Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365Credentials.MainDoc" >}}
+
+[Microsoft365OAuthCredentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCredentials.MainDoc" >}}
+[ClientId Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCredentials.ClientId" >}}
+[ClientSecret Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCredentials.ClientSecret" >}}
+[TenantId Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCredentials.TenantId" >}}
+[ObjectId Client Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCredentials.ObjectId" >}}
+
+[Microsoft365OAuthCertificateCredentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.MainDoc" >}}
+[CertificatePath]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.CertificatePath" >}}
+[CertificatePassword]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.CertificatePassword" >}}
+[ClientId Certificate Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.ClientId" >}}
+[TenantId Certificate Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.TenantId" >}}
+[ObjectId Certificate Credentials]: {{< url path="Cortex.Reference.DataTypes.Microsoft365.Authentication.OAuth.Microsoft365OAuthCertificateCredentials.ObjectId" >}}
+
+[EncryptedText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptedText.MainDoc" >}}
+
+[ArgumentException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentException" >}}
+[CryptographicException]: {{< url path="MSDocs.DotNet.Api.System.Security.Cryptography.CryptographicException.MainDoc" >}}
+[FileNotFoundException]: {{< url path="MSDocs.DotNet.Api.System.IO.FileNotFoundException" >}}
+[IOException]: {{< url path="MSDocs.DotNet.Api.System.IO.IOException" >}}
+[MsalServiceException]: {{< url path="MSDocs.DotNet.Api.Microsoft.Identity.Client.MsalServiceException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[ServiceException]: {{< url path="MSDocs.DotNet.Api.Microsoft.Graph.ServiceException.MainDoc" >}}
+[UnauthorizedAccessException]: {{< url path="MSDocs.DotNet.Api.System.UnauthorizedAccessException" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[Send Email Using SMTP Server]: {{< url path="Cortex.Reference.Blocks.Email.SendEmail.SendEmailUsingSmtpServer.MainDoc" >}}
+
+[Setting up an Outlook account for OAuth authentication using client credentials]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Email.Authentication.SettingUpClientCredentialsOutlook" >}}
+[Setting up an Outlook account for OAuth authentication using certificate credentials]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Email.Authentication.SettingUpCertificateCredentialsOutlook" >}}
+
+[SMTP]: {{< url path="Cortex.Reference.Glossary.P-T.SMTP" >}}
+[Outlook]: {{< url path="Cortex.Reference.Glossary.K-O.Outlook" >}}
+[RFC 5321]: {{< url path="IETF.Email.RFC5321" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/objects/_index.md b/content/en/docs/2026.3/Reference/Blocks/objects/_index.md
new file mode 100644
index 000000000..24753ebe5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/objects/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Objects"
+linkTitle: "Objects"
+description: "Blocks common to all object data types."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/_index.md b/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/_index.md
new file mode 100644
index 000000000..b1b72c032
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Convert Object"
+linkTitle: "Convert Object"
+description: "Convert an object to other data types."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/convert-object-to-text-block-1.md b/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/convert-object-to-text-block-1.md
new file mode 100644
index 000000000..8f487f889
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/objects/convert-object/convert-object-to-text-block-1.md
@@ -0,0 +1,250 @@
+---
+title: "Convert Object To Text"
+linkTitle: "Convert Object To Text"
+description: "Converts an object to text by replacing all `{Property}` format parameters in a specified format template with the Object's corresponding property value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Objects_ConvertObject_ConvertObjectToTextBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts the given [Object][Object Property] to [Text][Text Property].
+
+It does this by replacing all `{Property}` format parameters in the specified [Format Template][FormatTemplate Property] with the corresponding property value from the given [Object][Object Property].
+
+An additional [Format Provider][FormatProvider Property] option can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting).
+
+## Examples
+
+### Convert Structure to Text
+
+This example will convert:
+
+```json
+{
+ "LastPaymentAmount": 99.99,
+ "PercentagePaidOff": 0.8000,
+ "PercentageRemaining": 0.2000,
+ "TotalPaidOff": 350.99,
+ "TotalRemaining": 40
+}
+```
+
+to text, based on the following format template:
+
+```json
+"Your latest payment of {LastPaymentAmount:C2} has been received. You have paid {PercentagePaidOff:P0} of your total and have {TotalRemaining:C2} outstanding."
+```
+
+The format parameter `{LastPaymentAmount:C2}` will display the `99.99` as U.S currency to two decimal places (i.e. `$99.99`):
+
+* `LastPaymentAmount` - is replaced by the value of the `"LastPaymentAmount"` property (i.e. `99.99`).
+* `C` - indicates to include the currency symbol for the specified culture (i.e. `$`).
+* `2` - indicates to format the value to two decimal places.
+
+The format parameter `{PercentagePaidOff:P0}` will display the `0.8000` as a percentage to zero decimal places (i.e. `80 %`):
+
+* `PercentagePaidOff` - is replaced by the value of the `"PercentagePaidOff"` (i.e. `0.8000`).
+* `P` - indicates the value should be formatted as a percentage.
+* `0` - indicates to format the percentage value to zero decimal places.
+
+The format parameter `{TotalRemaining:C2}` will display the `40` as U.S currency to two decimal places (i.e. `$40.00`):
+
+* `TotalRemaining` - is replaced by the value of the `"TotalRemaining"` property (i.e. `40`).
+* `C` - indicates to include the currency symbol for the specified culture (i.e. `$`).
+* `2` - indicates to format the value to two decimal places.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Object][Object Property] | `($)Object`, with value `{"LastPaymentAmount":99.99, "PercentagePaidOff":0.8000, "PercentageRemaining":0.2000, "TotalPaidOff":350.99, "TotalRemaining":40}` | `($)Object` is a variable of type [Structure][] |
+| [Format Template][FormatTemplate Property] | `($)FormatTemplate`, with value `"Your latest payment of {LastPaymentAmount:C2} has been received. You have paid {PercentagePaidOff:P0} of your total and have {TotalRemaining:C2} outstanding."` | `($)FormatTemplate` is a variable of type [String][] |
+| [Format Provider][FormatProvider Property] | `($)FormatProvider`, with value `new CultureInfo("en-US")` | `($)FormatProvider` is a variable of type [IFormatProvider][] |
+| [Text][Text Property] | `($)Text`, with no value | `($)Text` is a variable that will be set to a [String][] value |
+
+#### Result
+
+Converting:
+
+```json
+{
+ "LastPaymentAmount": 99.99,
+ "PercentagePaidOff": 0.8000,
+ "PercentageRemaining": 0.2000,
+ "TotalPaidOff": 350.99,
+ "TotalRemaining": 40
+}
+```
+
+to text, based on the following format template:
+
+```json
+"Your latest payment of {LastPaymentAmount:C2} has been received. You have paid {PercentagePaidOff:P0} of your total and have {TotalRemaining:C2} outstanding."
+```
+
+results in the variable `($)Text` being updated to the following:
+
+```json
+"Your latest payment of $99.99 has been received. You have paid 80 % of your total and have $40.00 outstanding."
+```
+
+***
+
+## Properties
+
+### Object
+
+The [Object][Object Property] to convert to [Text][Text Property].
+
+All `{Property}` format parameters which match a property name in the [Object][Object Property] will be replaced by that property's value.
+
+The values of matching properties do not have to be text, they can be any data type. Any non-text value will be converted to its text representation when it is replaced.
+
+For information about how types are converted to their text representation please see [Converting Objects To Text][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TObject][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Object` with no value |
+
+### Format Template
+
+[Format Template][FormatTemplate Property] can be specified to define the format of the resultant [Text][Text Property].
+
+All `{Property}` format parameters in [Format Template][FormatTemplate Property] will be replaced with the corresponding property value from the [Object][Object Property].
+
+`{Property}` format parameters are case-sensitive, so must exactly match the property name in the [Object][Object Property]; those that do not will not be replaced.
+
+If [Format Template][FormatTemplate Property] is specified but does not contain any `{Property}` format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), [Text][Text Property] will be set to the value of [Convert.ToString(Object, Format Provider)][Convert ToString].
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Format Provider
+
+[Format Provider][FormatProvider Property] can be specified to define the cultural rules used to control the formatting (e.g. `new CultureInfo("en-US")` will apply American English rules to the formatting.).
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IFormatProvider][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | `CultureInfo.InvariantCulture` |
+
+### Text
+
+The formatted [Text][Text Property] that results from replacing all `{Property}` format parameters in [Format Template][FormatTemplate Property] with their corresponding property value from the given [Object][Object Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Text` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [FormatException][] | Thrown when [Format Template][FormatTemplate Property] contains a format parameter that is invalid or not well-formed (e.g. `"Cost is {TotalCost:Q2}`, as `"Q"` is not a [valid format parameter][]). |
+| [PropertyNullException][] | Thrown when [Object][Object Property] is `null`. |
+
+## Remarks
+
+### Text Formatting
+
+Please note that changes to operating system settings, could result in some of the examples above displaying different results.
+
+For information about format templates and parameters, please see [Text Formatting][].
+
+### Null or Empty Format Template
+
+If [Format Template][FormatTemplate Property] is specified but does not contain any `{Property}` format parameters, nothing is replaced; [Text][Text Property] will be set to the value of [Format Template][FormatTemplate Property].
+
+If [Format Template][FormatTemplate Property] is not specified, `null` or empty (i.e. `""`), [Text][Text Property] will be set to the value of [Convert.ToString(Object, Format Provider)][Convert ToString].
+
+### Null Format Provider
+
+If [Format Provider][FormatProvider Property] is not specified or `null`, `CultureInfo.InvariantCulture` will be used; `CultureInfo.InvariantCulture` is associated with the English language but not with any country/region. For more information, please see [Invariant Culture rules][].
+
+### Nested Properties
+
+Format parameters support nested properties, which means given an object like the following:
+
+```json
+{
+ "LastPaymentAmount": 99.99,
+ "PaidOff": {
+ "Percentage": 0.8000,
+ "Total": 350.99
+ },
+ "Remaining": {
+ "Remaining": 0.2000,
+ "Total": 40
+ }
+}
+```
+
+that nested property values such as PaidOff.Total can be accessed. This is done by using the following format parameter syntax:
+
+```json
+"{PaidOff.Total}"
+```
+
+### Known Limitations
+
+Currently the block does not support indexing into properties (i.e. `ListProperty[0]` or `DictionaryProperty["key"]`).
+
+[Object Property]: {{< ref "#object" >}}
+[FormatTemplate Property]: {{< ref "#format-template" >}}
+[FormatProvider Property]: {{< ref "#format-provider" >}}
+[Text Property]: {{< ref "#text" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[Convert ToString]: {{< url path="MSDocs.DotNet.Api.System.Convert.ToStringObjectFormatProvider" >}}
+
+[Converting Objects To Text]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.ConvertingObjectsToText.MainDoc" >}}
+[Invariant Culture rules]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Culture.InvariantCulture.MainDoc" >}}
+[Text Formatting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.MainDoc" >}}
+[Valid Format Parameter]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.Formatting.FormatTemplates" >}}
+
+[TObject]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[IFormatProvider]: {{< url path="Cortex.Reference.DataTypes.Text.IFormatProvider.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/_index.md b/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/_index.md
new file mode 100644
index 000000000..88c2803c9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Copy Object"
+linkTitle: "Copy Object"
+description: "Copy an object."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/copy-object-block-1.md b/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/copy-object-block-1.md
new file mode 100644
index 000000000..91ffdbbe6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/objects/copy-object/copy-object-block-1.md
@@ -0,0 +1,112 @@
+---
+title: "Copy Object"
+linkTitle: "Copy Object"
+description: "Copies an Object."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Objects_CopyObject_CopyObjectBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Makes a [Copy][Copy Property] of an [Object][Object Property].
+
+Any type of object can be copied, including Lists, Dictionaries, Structures etc.
+
+A deep copy will be performed, which means if the [Object][Object Property] contains other objects, they are also copied. This is as opposed to a shallow copy, which only makes a copy of the [Object][Object Property]; in a shallow copy contained objects are not copied, they are left as the original.
+
+## Examples
+
+### Copy a List
+
+This example will make a copy of `[[1, 2, 3], [4, 5, 6]]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Object][Object Property] | `($)Object`, with value `[[1, 2, 3], [4, 5, 6]]` | `($)Object` is a variable of type [List][]<[List][]<[Int32][]>> |
+| [Copy][Copy Property] | `($)Copy`, with no value | `($)Copy` is a variable that will be set to the type of the item (i.e. [List][]<[List][]<[Int32][]>>) |
+
+#### Result
+
+Making a copy of `[[1, 2, 3], [4, 5, 6]]` results in the variable `($)Copy` being updated to the following:
+
+```json
+[
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 5,
+ 6
+ ]
+]
+```
+
+Note that `($)Copy` is an exact copy. If `($)Copy` has new items added to it, items updated in it, or items removed from it, the original that `($)Copy` was copied from will not be affected.
+
+***
+
+## Properties
+
+### Object
+
+The [Object][Object Property] to make the [Copy][Copy Property] of.
+
+Any type of object can be copied, including Lists, Dictionaries, Structures etc.
+
+A deep copy will be performed, which means if the [Object][Object Property] contains other objects, they are also copied. This is as opposed to a shallow copy, which only makes a copy of the [Object][Object Property]; in a shallow copy contained objects are not copied, they are left as the original.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TObject][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Object` with no value |
+
+### Copy
+
+The [Copy][Copy Property] of the [Object][Object Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TObject][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Copy` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Null Object
+
+If [Object][Object Property] is not provided or is set to `null`, [Copy][Copy Property] will be set to `null`.
+
+[Object Property]: {{< ref "#object" >}}
+[Copy Property]: {{< ref "#copy" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TObject]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/_index.md
new file mode 100644
index 000000000..d143d831b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Queues"
+linkTitle: "Queues"
+description: "Blocks related to working with Queues."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/_index.md
new file mode 100644
index 000000000..1f22e687a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Dequeue Item(s)"
+linkTitle: "Dequeue Item(s)"
+description: "Removes and returns an item or multiple items from a queue."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-item-block-2.md b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-item-block-2.md
new file mode 100644
index 000000000..6ee7cde20
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-item-block-2.md
@@ -0,0 +1,155 @@
+---
+title: "Dequeue Item"
+linkTitle: "Dequeue Item"
+description: "Removes and returns the Item at the beginning of a Queue."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_DequeueItem_DequeueItemBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes and returns the [Item][Item Property] at the beginning of a [Queue][Queue Property].
+
+## Examples
+
+### Dequeue an Item from a Queue containing Items with different priorities
+
+This example will dequeue an item from a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1`, `"Item 0"` with a priority of `0` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 0", "Priority": 0}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [String][]) |
+
+#### Result
+
+Dequeueing an item from `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 0", "Priority": 0}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Item` being updated to the following:
+
+```json
+"Item -1"
+```
+
+and the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item 0",
+ "Priority": 0
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Dequeue an Item from a Queue containing Items with the same priority
+
+This example will dequeue an item from a [QueueWithPriority][]<[Int32][], [Int32][]> that contains `1` with a priority of `0`, `2` with a priority of `0` and `3` with a priority of `0`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": 1, "Priority": 0}, {"Item": 2, "Priority": 0}, {"Item": 3, "Priority": 0}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[Int32][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to the type of the item (i.e. [Int32]) |
+
+#### Result
+
+Dequeueing an item from `{"Items": [{"Item": 1, "Priority": 0}, {"Item": 2, "Priority": 0}, {"Item": 3, "Priority": 0}], "PriorityComparer": {}}` results in the variable `($)Item` being updated to the following:
+
+```json
+1
+```
+
+and the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": 2,
+ "Priority": 0
+ },
+ {
+ "Item": 3,
+ "Priority": 0
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to dequeue an [Item][Item Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Item
+
+The [Item][Item Property] at the beginning of the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Item` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyEmptyException][] | Thrown when [Queue][Queue Property] contains no items.|
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] is `null`. |
+
+## Remarks
+
+None
+
+[Queue Property]: {{< ref "#queue" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-items-block-2.md
new file mode 100644
index 000000000..98f344eb2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/dequeue-item/dequeue-items-block-2.md
@@ -0,0 +1,176 @@
+---
+title: "Dequeue Items"
+linkTitle: "Dequeue Items"
+description: "Removes and returns Items at the beginning of a Queue."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_DequeueItem_DequeueItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Removes and returns [Items][Items Property] at the beginning of a [Queue][Queue Property].
+
+Each item is removed and returned to [Items][Items Property] in the same order as they were in the [Queue][Queue Property].
+
+## Examples
+
+### Dequeue Count of Items from a Queue containing items with different priorities
+
+This example will dequeue `2` items from a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1`, `"Item 0"` with a priority of `0` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 0", "Priority": 0}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Count][Count Property] | `($)Count`, with value `2` | `($)Count` is a variable of type [Int32][] |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to a [List][]<[String][]> value |
+
+#### Result
+
+Dequeueing `2` items from `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 0", "Priority": 0}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Items` being updated to the following:
+
+```json
+["Item -1", "Item 0"]
+```
+
+and the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Dequeue Count of Items from a Queue containing items with the same priority
+
+This example will dequeue `3` items from a [QueueWithPriority][]<[Int32][], [Int32][]> that contains `1` with a priority of `0`, `2` with a priority of `0`, `3` with a priority of `0` and `4` with a priority of `0`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": 1, "Priority": 0}, {"Item": 2, "Priority": 0}, {"Item": 3, "Priority": 0}, {"Item": 4, "Priority": 0}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[Int32][], [Int32][]> |
+| [Count][Count Property] | `($)Count`, with value `3` | `($)Count` is a variable of type [Int32][] |
+| [Items][Items Property] | `($)Items`, with no value | `($)Items` is a variable that will be set to a [List][]<[Int32][]> value |
+
+#### Result
+
+Dequeueing `3` items from `{"Items": [{"Item": 1, "Priority": 0}, {"Item": 2, "Priority": 0}, {"Item": 3, "Priority": 0}, {"Item" : 4, "Priority": 0}], "PriorityComparer": {}}` results in the variable `($)Items` being updated to the following:
+
+```json
+[1, 2, 3]
+```
+
+and the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": 4,
+ "Priority": 0
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to dequeue the [Items][Items Property] from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Count
+
+The [Count][Count Property] of [Items][Items Property] to dequeue.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+### Items
+
+The [Items][Items Property] at the beginning of the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TItem][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyEmptyException][] | Thrown when [Queue][Queue Property] contains no items.|
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] is `null`. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Count][Count Property] is greater than the count of items in [Queue][Queue Property]. |
+
+## Remarks
+
+### Negative Count
+
+If [Count][Count Property] is negative, all items are dequeued from [Queue][Queue Property] to [Items][Items Property].
+
+### Zero Count
+
+If [Count][Count Property] is `0`, no items are dequeued and [Items][Items Property] is set to an empty list (i.e. `[]`).
+
+[Queue Property]: {{< ref "#queue" >}}
+[Count Property]: {{< ref "#count" >}}
+[Items Property]: {{< ref "#items" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/_index.md
new file mode 100644
index 000000000..a92a80839
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Enqueue Item(s)"
+linkTitle: "Enqueue Item(s)"
+description: "Add an item or multiple items to a queue."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-item-block-2.md b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-item-block-2.md
new file mode 100644
index 000000000..249156260
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-item-block-2.md
@@ -0,0 +1,211 @@
+---
+title: "Enqueue Item"
+linkTitle: "Enqueue Item"
+description: "Adds an Item to a Queue at the specified Priority."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_EnqueueItem_EnqueueItemBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds an [Item][Item Property] to a [Queue][Queue Property] at the specified [Priority][Priority Property].
+
+## Examples
+
+### Enqueue an Item to an empty Queue
+
+This example will enqueue `"Some Value"` with a priority of `0` to an empty [QueueWithPriority][]<[String][], [Int32][]>.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with value `"Some Value"` | `($)Item` is a variable of type [String][] |
+| [Priority][Priority Property] | `($)Priority`, with value `0` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"Some Value"` with priority `0` to `{"Items": [], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Some Value",
+ "Priority": 0
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Enqueue an Item to a Queue already containing Items
+
+This example will enqueue `"Some Value"` with a priority of `0` to a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with value `"Some Value"` | `($)Item` is a variable of type [String][] |
+| [Priority][Priority Property] | `($)Priority`, with value `0` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"Some Value"` with priority `0` to `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item -1",
+ "Priority": -1
+ },
+ {
+ "Item": "Some Value",
+ "Priority": 0
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Enqueue an Item to a Queue with the same Priority as an existing Item
+
+This example will enqueue `"Some Value"` with a priority of `1` to a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with value `"Some Value"` | `($)Item` is a variable of type [String][] |
+| [Priority][Priority Property] | `($)Priority`, with value `1` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"Some Value"` with priority `1` to `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item -1",
+ "Priority": -1
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ },
+ {
+ "Item": "Some Value",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+As `"Some Value"` and `"Item 1"` have the same [Priority][Priority Property], they are put in the order that they were added to the [Queue][Queue Property], so `"Some Value"` is placed behind `"Item 1"`.
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to add the [Item][Item Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Item
+
+The [Item][Item Property] to be added to the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Item` with no value |
+
+### Priority
+
+The [Priority][Priority Property] of the [Item][Item Property] being added to the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TPriority][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | Defaults to `null` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [InvalidPropertyValueException][] | Thrown when [Item][Item Property] is `null` and [Queue][Queue Property] only accepts non-nullable value types. See [Value Is Invalid][]. |
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] is `null`. |
+
+## Remarks
+
+None
+
+[Queue Property]: {{< ref "#queue" >}}
+[Item Property]: {{< ref "#item" >}}
+[Priority Property]: {{< ref "#priority" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[default]: {{< url path="MSDocs.DotNet.Api.System.Comparer.Default" >}}
+
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-items-block-2.md
new file mode 100644
index 000000000..613571b00
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/enqueue-item/enqueue-items-block-2.md
@@ -0,0 +1,240 @@
+---
+title: "Enqueue Items"
+linkTitle: "Enqueue Items"
+description: "Adds Items to a Queue at the specified Priority."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_EnqueueItem_EnqueueItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Adds [Items][Items Property] to a [Queue][Queue Property] at the specified [Priority][Priority Property].
+
+Each item is added to the [Queue][Queue Property] in the same order as they are in [Items][Items Property].
+
+## Examples
+
+### Enqueue multiple Items to an empty Queue
+
+This example will enqueue `"a"`, `"b"` and `"c"` with a priority of `0` to an empty [QueueWithPriority][]<[String][], [Int32][]>.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Items][Items Property] | `($)Items`, with value `["a", "b", "c"]` | `($)Items` is a variable of type [List][]<[String][]> |
+| [Priority][Priority Property] | `($)Priority`, with value `0` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"a"`, `"b"` and `"c"` with priority `0` to `{"Items": [], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "a",
+ "Priority": 0
+ },
+ {
+ "Item": "b",
+ "Priority": 0
+ },
+ {
+ "Item": "c",
+ "Priority": 0
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Enqueue multiple Items to a Queue already containing Items
+
+This example will enqueue `"a"`, `"b"` and `"c"` with a priority of `0` to a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Items][Items Property] | `($)Items`, with value `["a", "b", "c"]` | `($)Items` is a variable of type [List][]<[String][]> |
+| [Priority][Priority Property] | `($)Priority`, with value `0` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"a"`, `"b"` and `"c"` with priority `0` to `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item -1",
+ "Priority": -1
+ },
+ {
+ "Item": "a",
+ "Priority": 0
+ },
+ {
+ "Item": "b",
+ "Priority": 0
+ },
+ {
+ "Item": "c",
+ "Priority": 0
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+### Enqueue multiple Items to a Queue with the same Priority as an existing Item
+
+This example will enqueue `"a"`, `"b"` and `"c"` with a priority of `1` to a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Items][Items Property] | `($)Items`, with value `["a", "b", "c"]` | `($)Items` is a variable of type [List][]<[String][]> |
+| [Priority][Priority Property] | `($)Priority`, with value `1` | `($)Priority` is a variable of type [Int32][] |
+
+#### Result
+
+Adding `"a"`, `"b"` and `"c"` with priority `1` to `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Queue` being updated to the following:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item -1",
+ "Priority": -1
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ },
+ {
+ "Item": "a",
+ "Priority": 1
+ },
+ {
+ "Item": "b",
+ "Priority": 1
+ },
+ {
+ "Item": "c",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+As the added values and `"Item 1"` have the same [Priority][Priority Property], they are put in the order that they were added to the [Queue][Queue Property], so `"a"`, `"b"` and `"c"` are placed behind `"Item 1"`.
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to add the [Items][Items Property] to.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Items
+
+The [Items][Items Property] to be added to the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IEnumerable<TItem>][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Items` with no value |
+
+### Priority
+
+The [Priority][Priority Property] of the [Items][Items Property] being added to the [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TPriority][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | Defaults to `null` |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] or [Items][Items Property] is `null`. |
+
+## Remarks
+
+### Empty Items
+
+If [Items][Items Property] is empty (i.e. `[]`) there is nothing to add, so no operation is performed.
+
+[Queue Property]: {{< ref "#queue" >}}
+[Items Property]: {{< ref "#items" >}}
+[Priority Property]: {{< ref "#priority" >}}
+
+[Indexes]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Indexes.MainDoc" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[default]: {{< url path="MSDocs.DotNet.Api.System.Comparer.Default" >}}
+
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[IEnumerable<TItem>]: {{< url path="Cortex.Reference.DataTypes.Collections.IEnumerable_TItem.MainDoc" >}}
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[CannotModifyReadOnlyListException]: {{< url path="Cortex.Reference.Exceptions.Lists.CannotModifyReadOnlyListException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[InvalidPropertyValueException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.MainDoc" >}}
+[Value Is Invalid]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidPropertyValueException.ValueIsInvalid" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/get-count/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/get-count/_index.md
new file mode 100644
index 000000000..2fb3d1df1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/get-count/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Get Count(s) of Items"
+linkTitle: "Get Count(s) of Items"
+description: "Get the count(s) of items in a queue."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/get-count/get-count-of-all-items-block-2.md b/content/en/docs/2026.3/Reference/Blocks/queues/get-count/get-count-of-all-items-block-2.md
new file mode 100644
index 000000000..f48cc1785
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/get-count/get-count-of-all-items-block-2.md
@@ -0,0 +1,102 @@
+---
+title: "Get Count Of All Items"
+linkTitle: "Get Count Of All Items"
+description: "Gets the count of all items in a Queue."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_GetCount_GetCountOfAllItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Gets the [Count][Count Property] of all items in a [Queue][Queue Property].
+
+## Examples
+
+### Get Count of all items in a Queue
+
+This example will get the count of all items in a [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` | `($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Count][Count Property] | `($)Count`, with no value | `($)Count` is a variable that will be set to an [Int32][] value |
+
+#### Result
+
+Getting the count of all items in `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Count` being updated to the following:
+
+```json
+2
+```
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to get the [Count][Count Property] of all items from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Count
+
+The [Count][Count Property] of all items in [Queue][Queue Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Int32][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Count` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] is `null`. |
+
+## Remarks
+
+### Empty List
+
+If [Queue][Queue Property] is empty (i.e. `{"Items": [], "PriorityComparer": {}}`), the variable specified in the [Count][Count Property] property is set to `0`.
+
+[Queue Property]: {{< ref "#queue" >}}
+[Count Property]: {{< ref "#count" >}}
+
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/_index.md
new file mode 100644
index 000000000..1b7c59da4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Peek Item(s)"
+linkTitle: "Peek Item(s)"
+description: "Gets the item or multiple items at the beginning of a queue without removing them."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/peek-item-block.md b/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/peek-item-block.md
new file mode 100644
index 000000000..b1506ce63
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/peek-item/peek-item-block.md
@@ -0,0 +1,116 @@
+---
+title: "Peek Item"
+linkTitle: "Peek Item"
+description: "Gets the item at the beginning of a queue without removing it."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_PeekItem_PeekItemBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
(Cortex.Blocks.Queues.PeekItem.PeekItemBlock`2)
+
+## Description
+
+Gets the [Item][Item Property] at the beginning of a [Queue][queue property] without removing it.
+
+## Examples
+
+### Peek the Item at the beginning of the Queue
+
+This example will peek [QueueWithPriority][]<[String][], [Int32][]> that contains `"Item -1"` with a priority of `-1` and `"Item 1"` with a priority of `1` and returns the Item with the minimal priority.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Queue][Queue Property] | `($)Queue`, with value `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` |`($)Queue` is a variable of type [QueueWithPriority][]<[String][], [Int32][]> |
+| [Item][Item Property] | `($)Item`, with no value | `($)Item` is a variable that will be set to type of the Item (i.e. [String][]) |
+
+#### Result
+
+Peeking `{"Items": [{"Item": "Item -1", "Priority": -1}, {"Item": "Item 1", "Priority": 1}], "PriorityComparer": {}}` results in the variable `($)Item` being updated to:
+
+```json
+"Item -1"
+```
+
+and `($)Queue` still has the value:
+
+```json
+{
+ "Items": [
+ {
+ "Item": "Item -1",
+ "Priority": -1
+ },
+ {
+ "Item": "Item 1",
+ "Priority": 1
+ }
+ ],
+ "PriorityComparer": {}
+}
+```
+
+***
+
+## Properties
+
+### Queue
+
+The [Queue][Queue Property] to peek from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [QueueWithPriority][]<[TItem][], [TPriority][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Queue` with no value |
+
+### Item
+
+The [Item][Item Property] with minimal priority.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TItem][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Item` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyEmptyException][] | Thrown when [Queue][Queue Property] contains no items.|
+| [PropertyNullException][] | Thrown when [Queue][Queue Property] is `null`. |
+
+## Remarks
+
+None
+
+[Queue Property]: {{< ref "#queue" >}}
+[Item Property]: {{< ref "#item" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TPriority]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[QueueWithPriority]: {{< url path="Cortex.Reference.DataTypes.Collections.QueueWithPriority.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/_index.md b/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/_index.md
new file mode 100644
index 000000000..0a570cc57
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Remove Item(s)"
+linkTitle: "Remove Item(s)"
+description: "Removes an item or multiple items from a queue."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/remove-all-items-block.md b/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/remove-all-items-block.md
new file mode 100644
index 000000000..8237c530a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/queues/remove-item/remove-all-items-block.md
@@ -0,0 +1,86 @@
+---
+title: "Remove All Items"
+linkTitle: "Remove All Items"
+description: "Removes all items from a queue."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Queues_RemoveItem_RemoveAllItemsBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for a specified [Duration][Duration Property].
+
+## Examples
+
+### Wait for duration
+
+This example will wait for `30` seconds.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Duration][Duration Property] | `($)Duration`, with value of `{"Years": 0, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 30, "Milliseconds": 0}` | `($)Duration` is a variable of type [TimePeriod][] |
+
+#### Result
+
+The block will wait for `30` seconds before completing, at which stage the flow execution will proceed to the next block.
+
+***
+
+## Properties
+
+### Duration
+
+The [Duration][Duration Property] to wait for.
+
+[Duration][Duration Property] can have positive and negative components where components are:
+
+* Years
+* Months
+* Days
+* Hours
+* Minutes
+* Seconds
+* Milliseconds
+
+When waiting for [Duration][Duration Property], the block will calculate the date time to wait until by adding the [Duration][Duration Property] to the current date time. It will first add years, followed by months, days, hours, minutes, seconds and finally milliseconds.
+
+When adding months, if the current day component is greater than the last day in the resultant month, it will update the day to the last day for that month (e.g. adding one month onto `2021-01-31T23:59:59+00:00` will equate to `2021-02-28T23:59:59+00:00`).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TimePeriod][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | Years: `0` Months: `0` Days: `0` Hours: `0` Minutes: `0` Seconds: `0` Milliseconds: `0`|
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [ArgumentOutOfRangeException][] | Thrown when any of the values or the sum of components of [Duration][Duration Property] are out of range. |
+| [PropertyValueOutOfRangeException][] | Thrown when [Duration][Duration Property] is negative (i.e. the sum of the components of [Duration][Duration Property] is less than `0` milliseconds). |
+
+## Remarks
+
+None
+
+[Duration Property]: {{< ref "#duration" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[ArgumentOutOfRangeException]: {{< url path="MSDocs.DotNet.Api.System.ArgumentOutOfRangeException" >}}
+
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/ssh/_index.md b/content/en/docs/2026.3/Reference/Blocks/ssh/_index.md
new file mode 100644
index 000000000..118737e8e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/ssh/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Ssh"
+linkTitle: "Ssh"
+description: "Blocks related to working with SSH."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/_index.md b/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/_index.md
new file mode 100644
index 000000000..aece5ec5d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute Ssh Command"
+linkTitle: "Execute Ssh Command"
+description: "Blocks related to executing SSH commands."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/execute-ssh-command-block.md b/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/execute-ssh-command-block.md
new file mode 100644
index 000000000..721ccefbe
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/ssh/execute-ssh-command/execute-ssh-command-block.md
@@ -0,0 +1,316 @@
+---
+title: "Execute Ssh Command"
+linkTitle: "Execute Ssh Command"
+description: "Executes an SSH command on the specified host."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Ssh_ExecuteSshCommand_ExecuteSshCommandBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Connects to a host using the [Ssh Session Details][Ssh Session Details Property], and executes a [Command][Command Property], returning the [Response][Response Property] and [Ssh Logs][Ssh Logs Property].
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the host is closed or is kept open for use on subsequent Execute Ssh Command blocks.
+
+## Examples
+
+### Execute a Command using UserCredentials
+
+This example will execute a [Command][Command Property] on the server with the following details:
+
+- Host - `"localhost"`
+- Port - `22`
+- Domain - `"domain"`
+- Username - `"username"`
+- Password - `"password"`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command` with value `"ipconfig"` | `($)Command` is a variable of type [EncryptableText][] |
+| [Ssh Session Details][Ssh Session Details Property] | `($)SshSessionDetails` with value `{"Host": "localhost", "Port": 22, "Credentials": {"Domain": "domain", "Username": "username", "Password": "encryptedPassword"}, "TerminalPrompt": ".*[>\|\$\|#]"}`
In this example `($)SshSessionDetails` has been set up using the following [Expression][]:
`new SshSessionDetails("localhost", 22, new UserCredentials("domain", "username", "encryptedPassword"), $@".*[>\|\$\|#]")` | `($)SshSessionDetails` is a variable of type [SshSessionDetails][] |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Configuration Settings][Configuration Settings Property] | `($)ConfigurationSettings`, with no value | `($)ConfigurationSettings` is a variable of type [Dictionary][]<[String][], [EncryptableText][]> |
+| [Response][Response Property] | `($)Response`, with no value | `($)Response` will be set to the type [String][] |
+| [Ssh Logs][Ssh Logs Property] | `($)SshLogs`, with no value | `($)SshLogs` will be set to the type [SshLogs][] |
+
+#### Result
+
+Running the [Command][Command Property] results in the variable `($)Response` being updated to the following:
+
+```text
+Windows IP Configuration
+
+Ethernet adapter Ethernet 3:
+
+Connection-specific DNS Suffix. : reddog.microsoft.com
+Link-local IPv6 Address. . . . . : fe80::78eb:a051:2b84:e8bd%6
+IPv4 Address. . . . . . . . . . . : 10.3.0.4
+Subnet Mask . . . . . . . . . . . : 255.255.255.0
+Default Gateway . . . . . . . . . : 10.3.0.1
+```
+
+It also results in the variable `($)SshLogs` being updated to the following:
+
+```json
+{
+ "WelcomeMessage": "Last login: Tue Mar 1 06:50:23 2022 from 10.8.0.224",
+ "Logs": "[Info] Sending local version: \"SSH-2.0-IPWorks SSH Client 2020\".\r\n[Info] Read remote version string: \"SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2\".\r\n[Info] Beginning key exchange.[Info] Sending local version: \"SSH-2.0-IPWorks SSH Client 2020\".\r\n[Info] Read remote version string: \"SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2\".\r\n[Info] Beginning key exchange..."
+}
+```
+
+Note that more logs are included in this example, but have been omitted from `($)SshLogs.Logs`.
+
+***
+
+### Execute a Command using SshCertificateCredentials
+
+This example will execute a [Command][Command Property] on the server with the following details:
+
+- Host - `"localhost"`
+- Port - `22`
+- Domain - `"domain"`
+
+The server can be connected to using a valid certificate.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command` with value `"ipconfig"` | `($)Command` is a variable of type [EncryptableText][] |
+| [Ssh Session Details][Ssh Session Details Property] | `($)SshSessionDetails` with value `{"Host": "localhost", "Port": 22, "Credentials": {"Domain": "domain", "Username": "username", "CertificatePath": "C:\\Certificate.pfx", "CertificatePassword": "encryptedCertificatePassword"}, "TerminalPrompt": ".*[>\|\$\|#]"}`
In this example `($)SshSessionDetails` has been set up using the following [Expression][]:
`new SshSessionDetails("localhost", 22, new SshCertificateCredentials("domain", "username", @"C\Certificate.pfx", "encryptedCertificatePassword"), $@".*[>\|\$\|#]")` | `($)SshSessionDetails` is a variable of type [SshSessionDetails][] |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Configuration Settings][Configuration Settings Property] | `($)ConfigurationSettings`, with no value | `($)CloseSession` is a variable of type [Dictionary][]<[String][], [EncryptableText][]> |
+| [Response][Response Property] | `($)Response`, with no value | `($)Response` will be set to the type [String][] |
+| [Ssh Logs][Ssh Logs Property] | `($)SshLogs`, with no value | `($)SshLogs` will be set to the type [SshLogs][] |
+
+#### Result
+
+Running the [Command][Command Property] results in the variable `($)Response` being updated to the following:
+
+```text
+Windows IP Configuration
+
+Ethernet adapter Ethernet 3:
+
+Connection-specific DNS Suffix. : reddog.microsoft.com
+Link-local IPv6 Address. . . . . : fe80::78eb:a051:2b84:e8bd%6
+IPv4 Address. . . . . . . . . . . : 10.3.0.4
+Subnet Mask . . . . . . . . . . . : 255.255.255.0
+Default Gateway . . . . . . . . . : 10.3.0.1
+```
+
+It also results in the variable `($)SshLogs` being updated to the following:
+
+```json
+{
+ "WelcomeMessage": "Last login: Tue Mar 1 06:50:23 2022 from 10.8.0.224",
+ "Logs": "[Info] Sending local version: \"SSH-2.0-IPWorks SSH Client 2020\".\r\n[Info] Read remote version string: \"SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2\".\r\n[Info] Beginning key exchange.[Info] Sending local version: \"SSH-2.0-IPWorks SSH Client 2020\".\r\n[Info] Read remote version string: \"SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2\".\r\n[Info] Beginning key exchange..."
+}
+```
+
+Note that more logs are included in this example, but have been omitted from `($)SshLogs.Logs`.
+
+***
+
+## Properties
+
+### Command
+
+The [Command][Command Property] that will be executed on the [Host][SshSessionDetails Host] specified in the [Ssh Session Details][Ssh Session Details Property].
+
+|||
+|----------|----------|
+| Data Type | [EncryptableText][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Ssh Session Details
+
+The [Ssh Session Details][Ssh Session Details Property] object that includes all of the information required to open and maintain a SSH session. This property contains all of the information in relation to the server the [Command][Command Property] will be executed on, these are:
+
+- [Host][SshSessionDetails Host]
+- [Port][SshSessionDetails Port]
+- [Credentials][SshSessionDetails Credentials]
+- [TerminalPrompt][SshSessionDetails TerminalPrompt]
+
+|||
+|----------|----------|
+| Data Type | [SshSessionDetails][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)SshSessionDetails` with no value |
+
+### Close Session
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the [Host][SshSessionDetails Host] is closed or is kept open for use on subsequent Execute Ssh Command blocks, this defaults to `false` if left blank, please see [Closing Sessions][] for more information.
+
+|||
+|----------|----------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+### Configuration Settings
+
+The [Configuration Settings][Configuration Settings Property] for the SSH connection and execution.
+
+|||
+|----------|----------|
+| Data Type | [IDictionary][]<[String][], [dynamic][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | [IDictionary][]<[String][], [dynamic][]> with value shown below: |
+
+```csharp
+new Dictionary {
+ { "TerminalWidth", "200" },
+ { "TerminalType", "vt100" },
+ { "Timeout", "60" },
+ { "EndOfLineCharacters", "\r" },
+ { "CancelCommand", "CtrlC" },
+ { "ControlCharactersToClean", @"\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)(g?)|[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]" },
+}
+```
+
+### Response
+
+The SSH [Response][Response Property] that is returned from the execution of the [Command][Command Property] on the [Host][SshSessionDetails Host] specified in the [Ssh Session Details][Ssh Session Details Property].
+
+|||
+|----------|----------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Response` with no value |
+
+### Ssh Logs
+
+The [Ssh Logs][Ssh Logs Property] that are returned from the execution of the [Command][Command Property] on the host specified in the [Ssh Session Details][Ssh Session Details Property]. This property contains all of the information in relation to the logs returned by the [Command][Command Property], these are:
+
+- [WelcomeMessage][]
+- [TerminalPromptMatch][]
+- [Logs][]
+
+|||
+|----------|----------|
+| Data Type | [SshLogs][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Variable][] |
+| Default Value | `($)SshLogs` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [PropertyNullException][] | Thrown when [Command][Command Property] is `null`. |
+|| Thrown when the [Ssh Session Details][Ssh Session Details Property] is `null`. |
+|| Thrown when the [Host][SshSessionDetails Host] within the [Ssh Session Details][Ssh Session Details Property] is `null`. |
+|| Thrown when the [Credentials][SshSessionDetails Credentials] within the [Ssh Session Details][Ssh Session Details Property] is `null`. |
+|| Thrown when using [SshCertificateCredentials][], the CertificatePath in the specified [Credentials][SshSessionDetails Credentials] within the [Ssh Session Details][Ssh Session Details Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when the specified [Host][SshSessionDetails Host] within the [Ssh Session Details][Ssh Session Details Property] is empty. |
+|| Thrown when the CertificatePath in the specified [Credentials][SshSessionDetails Credentials] within the [Ssh Session Details][Ssh Session Details Property] is empty. |
+| [PropertyValueOutOfRangeException][] | Thrown when the specified [Port][SshSessionDetails Port] within the [Ssh Session Details][Ssh Session Details Property] is below 1 or above 65535. |
+| [SshClientException][] | Thrown when one or more settings in [Configuration Settings][Configuration Settings Property] are invalid. (includes a dictionary of SettingName: ExceptionMessage from IPWorksSSHSshClientException) |
+|| Thrown when the specified [Host][SshSessionDetails Host] within the [Ssh Session Details][Ssh Session Details Property] is invalid. |
+|| Thrown when the specified [Port][SshSessionDetails Port] within the [Ssh Session Details][Ssh Session Details Property] is invalid. |
+|| Thrown when the server host key has not been accepted. |
+|| Thrown when using [UserCredentials][], the specified domain, username or password within [Credentials][SshSessionDetails Credentials] is invalid. |
+|| Thrown when using [SshCertificateCredentials][], the specified Domain, Username, CertificatePath or CertificatePassword is invalid. |
+|| Thrown when the [Host][SshSessionDetails Host] exits without using [Close Session][Close Session Property], returning the response received up to the point the host exited the session. |
+| [SshResponseException][] | Thrown if the specified [TerminalPrompt][SshSessionDetails TerminalPrompt] does not match the terminal prompt on the host causing the execution to timeout or the timeout was too short to allow for data to be received. |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of the regular expression pattern-matching exceeds the time-out interval. |
+| [RegexParsingFailedException][] | Thrown when [TerminalPrompt][SshSessionDetails TerminalPrompt] within [Ssh Session Details][Ssh Session Details Property] contains invalid regex. |
+
+## Remarks
+
+### Opening Sessions
+
+The Execute Ssh Command block automatically handles creating and opening a session for the specified [Ssh Session Details][Ssh Session Details Property] using the following rules:
+
+- If a session does not exist, a new session will be created, opened and used when the block runs.
+- If a session already exists but is closed, the session will be opened and used when the block runs.
+- If a session already exists and is open, the session will be used when the block runs.
+
+For information on how to explicitly close a session, please see [Closing Sessions][].
+
+### Closing Sessions
+
+Sessions can be explicitly closed by setting [Close Session][Close Session Property] to `true`. This causes the session to be closed after the [Command][Command Property] has been executed.
+
+For information on how to open a session, please see [Opening Sessions][].
+
+### Using the TerminalPromptMatch Within SshLogs to Reach the End of a Prompt
+
+[SshLogs][] includes a TerminalPromptMatch property that represents any string within the returned logs that matches the TerminalPrompt property within the [SshSessionDetails][].
+
+Some prompts within SSH require multiple interactions before reaching the end of the prompt. The TerminalPromptMatch can be used to make decisions or loop within a flow sending further input to the Ssh Command to navigate to the end of the prompt.
+
+### Known Limitations
+
+None
+
+[Command Property]: {{< ref "#command" >}}
+[Ssh Session Details Property]: {{< ref "#ssh-session-details" >}}
+[Close Session Property]: {{< ref "#close-session" >}}
+[Configuration Settings Property]: {{< ref "#configuration-settings" >}}
+[Response Property]: {{< ref "#response" >}}
+[Ssh Logs Property]: {{< ref "#ssh-logs" >}}
+
+[Opening Sessions]: {{< ref "#opening-sessions" >}}
+[Closing Sessions]: {{< ref "#closing-sessions" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[EncryptableText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptableText.MainDoc" >}}
+
+[SshCertificateCredentials]: {{< url path="Cortex.Reference.DataTypes.Ssh.Authentication.SshCertificateCredentials.MainDoc" >}}
+
+[SshSessionDetails]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshSessionDetails.MainDoc" >}}
+[SshSessionDetails Host]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshSessionDetails.Host" >}}
+[SshSessionDetails Port]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshSessionDetails.Port" >}}
+[SshSessionDetails Credentials]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshSessionDetails.Credentials" >}}
+[SshSessionDetails TerminalPrompt]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshSessionDetails.TerminalPrompt" >}}
+[Logs]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshLogs.Logs" >}}
+[WelcomeMessage]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshLogs.WelcomeMessage" >}}
+[TerminalPromptMatch]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshLogs.TerminalPromptMatch" >}}
+
+[SshLogs]: {{< url path="Cortex.Reference.DataTypes.Ssh.SshLogs.MainDoc" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[SshClientException]: {{< url path="Cortex.Reference.Exceptions.Ssh.SshClientException" >}}
+[SshResponseException]: {{< url path="Cortex.Reference.Exceptions.Ssh.SshResponseException" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/_index.md b/content/en/docs/2026.3/Reference/Blocks/tasks/_index.md
new file mode 100644
index 000000000..34e7041e1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Tasks"
+linkTitle: "Tasks"
+description: "Blocks related to working with Tasks."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/_index.md b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/_index.md
new file mode 100644
index 000000000..fa369cb34
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Cancel Task(s)"
+linkTitle: "Cancel Task(s)"
+description: "Cancel a Task or multiple Tasks."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-all-tasks-block-2.md b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-all-tasks-block-2.md
new file mode 100644
index 000000000..1af757797
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-all-tasks-block-2.md
@@ -0,0 +1,171 @@
+---
+title: "Cancel All Tasks"
+linkTitle: "Cancel All Tasks"
+description: "Cancels all Tasks in a list."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Tasks_CancelTask_CancelAllTasksBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Cancels the execution of all [Tasks][Tasks Property] in a specified list.
+
+## Examples
+
+### Cancel a list of running Tasks
+
+This example will cancel the executions of all tasks in a list; the list contains two [IExecutionTasks][IExecutionTask] that represent asynchronous executions of other flows. Both [IExecutionTasks][IExecutionTask] represent a flow that waits for 5 seconds then sets an output variable `ResultVariable` to `"ResultValue"`. The [Cancel All Tasks][CancelAllTasks] block begins execution 1 second after the asynchronous flows have started, so the flows get cancelled before each `ResultVariable` is set.
+
+When the [Cancel All Tasks][CancelAllTasks] block begins, the [IExecutionTasks][IExecutionTask] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Tasks][Tasks Property] | `($)Tasks`, with value `[($)ExecutionTask1, ($)ExecutionTask2]` | `($)Tasks` is a variable of type [List][]<[IExecutionTask][]> |
+
+#### Result
+
+Cancelling all [IExecutionTasks][IExecutionTask] 1 second after they have started, results in the flows they represent being cancelled and the properties of each [IExecutionTask][IExecutionTask] in `($)Tasks` being updated to the following:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": true,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": true,
+ "Status": "Cancelled",
+ "Exception": {
+ "Exception Type": "FlowExecutionStoppedException",
+ "Message": "Flow execution has been stopped!",
+ "FlowId": "00000000-0000-0000-0000-000000000000",
+ "ExecutionId": "00000000-0000-0000-0000-000000000000"
+ }
+}
+```
+
+***
+
+### Cancel a list of completed Tasks
+
+This example will cancel the executions of all tasks in a list; the list contains two [IExecutionTasks][IExecutionTask] that represent asynchronous executions of other flows. Both [IExecutionTasks][IExecutionTask] represent a flow that waits for 5 seconds then sets an output variable `ResultVariable` to `"ResultValue"`. The [Cancel All Tasks][CancelAllTasks] block begins execution 6 seconds after the asynchronous flows have started, so the flows complete and set their `ResultVariable` before they could be cancelled.
+
+When the [Cancel All Tasks][CancelAllTasks] block begins, the [IExecutionTasks][IExecutionTask] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Tasks][Tasks Property] | `($)Tasks`, with value `[($)ExecutionTask1, ($)ExecutionTask2]` | `($)Tasks` is a variable of type [List][]<[IExecutionTask][]> |
+
+#### Result
+
+Cancelling all [IExecutionTasks][IExecutionTask] has no effect as the flows they represent were completed and their properties remain unchanged.
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+## Properties
+
+### Tasks
+
+The list of Tasks to cancel.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[ITask][]<[TResult][]>> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Tasks` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyContainsNullItemException][] | Thrown when any Task in [Tasks][Tasks Property] is `null`.|
+| [PropertyEmptyException][] | Thrown when [Tasks][Tasks Property] contains no items.|
+| [PropertyNullException][] | Thrown when [Tasks][Tasks Property] is `null`.|
+
+## Remarks
+
+### Cancelling a Task That Has Already Been Cancelled
+
+If the Task being cancelled has already been cancelled, this block will do nothing and the status of the Task will remain `"Cancelled"`.
+
+### Cancelling a Task That Has Been Completed
+
+If the Task being cancelled has already been completed, this block will do nothing and the status of the Task will remain `"RanToCompletion"`.
+
+### Cancelling a Task That Has Thrown an Exception
+
+If the Task being cancelled has thrown an exception during execution, this block will do nothing and the status of the Task will remain `"Faulted"`.
+
+[Tasks Property]: {{< ref "#tasks" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[TTask]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[TResult]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyContainsNullItemException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyContainsNullItemException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[IExecutionTask]: {{< url path="Cortex.Reference.DataTypes.Tasks.IExecutionTask.MainDoc" >}}
+[ITask]: {{< url path="Cortex.Reference.DataTypes.Tasks.ITask.MainDoc" >}}
+[CancelAllTasks]: {{< ref "#cancel-all-tasks" >}}
+[RunFlowAsync]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlowAsync.MainDoc" >}}
+
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-task-block-1.md b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-task-block-1.md
new file mode 100644
index 000000000..cca4bb9b0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/cancel-task/cancel-task-block-1.md
@@ -0,0 +1,163 @@
+---
+title: "Cancel Task"
+linkTitle: "Cancel Task"
+description: "Cancels a Task."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Tasks_CancelTask_CancelTaskBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Cancels the execution of the specified [Task][Task Property].
+
+## Examples
+
+### Cancel a running Task
+
+This example will cancel an [IExecutionTask][] that represents the asynchronous execution of another flow. The flow this [IExecutionTask][] represents waits for 5 seconds then sets an output variable `ResultVariable` to `"ResultValue"`. The [Cancel Task Block][CancelTask] begins execution 1 second after the asynchronous flow has started, so the flow gets cancelled before `ResultVariable` is set.
+
+When the [Cancel Task Block][CancelTask] begins, the [IExecutionTask][] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Task][Task Property] | `($)Task`, with a value that represents the asynchronous execution of another flow | `($)Task` is a variable of type [IExecutionTask][] |
+
+#### Result
+
+Cancelling the [IExecutionTask][] 1 second after it has started, results in the flow it represents being cancelled and the properties of `($)Task` being updated to the following:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": true,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": true,
+ "Status": "Cancelled",
+ "Exception": {
+ "Exception Type": "FlowExecutionStoppedException",
+ "Message": "Flow execution has been stopped!",
+ "FlowId": "00000000-0000-0000-0000-000000000000",
+ "ExecutionId": "00000000-0000-0000-0000-000000000000"
+ }
+}
+```
+
+***
+
+### Cancel a completed Task
+
+This example will cancel an [IExecutionTask][] that represents the asynchronous execution of another flow. The flow this [IExecutionTask][] represents waits for 5 seconds then sets the output variable `ResultVariable` to `"ResultValue"`. The [Cancel Task Block][CancelTask] begins execution 6 seconds after the asynchronous flow has started, so the flow completes and sets `ResultVariable` before it could be cancelled.
+
+When the [Cancel Task Block][CancelTask] begins, the [IExecutionTask][] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Task][Task Property] | `($)Task`, with a value that represents the asynchronous execution of another flow | `($)Task` is a variable of type [IExecutionTask][] |
+
+#### Result
+
+Cancelling the [IExecutionTask][] has no effect as the flow it represents was completed and its properties remain unchanged.
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+## Properties
+
+### Task
+
+The [Task][Task Property] to cancel.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ITask][]<[TResult][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Task` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Task][Task Property] is `null`.|
+
+## Remarks
+
+### Cancelling a Task That Has Already Been Cancelled
+
+If the [Task][Task Property] being cancelled has already been cancelled, this block will do nothing and the status of the [Task][Task Property] will remain `"Cancelled"`.
+
+### Cancelling a Task That Has Been Completed
+
+If the [Task][Task Property] being cancelled has already been completed, this block will do nothing and the status of the [Task][Task Property] will remain `"RanToCompletion"`.
+
+### Cancelling a Task That Has Thrown an Exception
+
+If the [Task][Task Property] being cancelled has thrown an exception during execution, this block will do nothing and the status of the [Task][Task Property] will remain `"Faulted"`.
+
+[Task Property]: {{< ref "#task" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+
+[TResult]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[IExecutionTask]: {{< url path="Cortex.Reference.DataTypes.Tasks.IExecutionTask.MainDoc" >}}
+[ITask]: {{< url path="Cortex.Reference.DataTypes.Tasks.ITask.MainDoc" >}}
+[CancelTask]: {{< ref "#cancel-task" >}}
+[RunFlowAsync]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlowAsync.MainDoc" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/_index.md b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/_index.md
new file mode 100644
index 000000000..0d2464a6d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wait For Task(s)"
+linkTitle: "Wait For Task(s)"
+description: "Wait for a task or multiple tasks."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-all-tasks-block-2.md b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-all-tasks-block-2.md
new file mode 100644
index 000000000..1b2f5b7e8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-all-tasks-block-2.md
@@ -0,0 +1,282 @@
+---
+title: "Wait For All Tasks"
+linkTitle: "Wait For All Tasks"
+description: "Waits for multiple Tasks to complete and returns their Results."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Tasks_WaitForTask_WaitForAllTasksBlock_2.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for all of the specified [Tasks][Tasks Property] to finish and returns a list of all [Results][Results Property].
+
+## Examples
+
+### Wait for multiple running Tasks
+
+This example will wait for three instances of an [IExecutionTask][] that represent asynchronous executions of other flows. The flows that the [IExecutionTask][]'s represent waits for 2 seconds, 4 seconds and 6 seconds respectively and then sets the output variable `TimeWaited` equal to the amount of seconds the flow waited. The [Wait For All Tasks][] block begins execution 1 second after the asynchronous flows are started.
+
+When the [Wait For All Tasks][] block begins, the [IExecutionTask][]'s will have the following properties:
+
+```json
+
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Tasks][Tasks Property] | `($)Tasks`, with value that represents a list of asynchronous executions of another flow | `($)Tasks` is a variable of type [IList][]<[IExecutionTask][]> |
+| [Results][Results Property] | `($)Results`, with no value | `($)Results` is a variable of type [IList][]<[Structure][]> |
+
+#### Result
+
+Waiting for the [IExecutionTask][]'s 1 second after they have started, results in the execution containing the [Wait For All Tasks][] block to wait for all tasks to complete, pausing for 5 seconds and then the variable `($)Results` being updated to the following:
+
+```json
+[
+ {
+ "TimeWaited": 2
+ },
+ {
+ "TimeWaited": 4
+ },
+ {
+ "TimeWaited": 6
+ }
+]
+```
+
+After the [Wait For All Tasks][] block finishes, the tasks in `($)Tasks` will be in the following state:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+### Wait for multiple completed Tasks
+
+This example will wait for three instances of an [IExecutionTask][] that represent asynchronous executions of other flows. The flows that the [IExecutionTask][]'s represent waits for 2 seconds, 4 seconds and 6 seconds respectively and then sets the output variable `TimeWaited` equal to the amount of seconds the flow waited. The [Wait For All Tasks][] block begins execution 7 seconds after the asynchronous flows are started, therefore starting after all the executions have already completed.
+
+When the [Wait For All Tasks][] block begins, the [IExecutionTask][]'s will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Tasks][Tasks Property] | `($)Tasks`, with value that represents a list of asynchronous executions of another flow | `($)Tasks` is a variable of type [IList][]<[IExecutionTask][]> |
+| [Results][Results Property] | `($)Results`, with no value | `($)Results` is a variable of type [IList][]<[Structure][]> |
+
+#### Result
+
+Waiting for the [IExecutionTask][]'s 7 seconds after they have started, results in the execution containing the [Wait For All Tasks][] block to not wait and the variable `($)Results` being immediately updated to the following:
+
+```json
+[
+ {
+ "TimeWaited": 2
+ },
+ {
+ "TimeWaited": 4
+ },
+ {
+ "TimeWaited": 6
+ }
+]
+```
+
+After the [Wait For All Tasks][] block finishes, the tasks in `($)Tasks` will remain unchanged:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+## Properties
+
+### Tasks
+
+The list of [Tasks][Tasks Property] being waited for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[ITask][]<[TResult][]>> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Tasks` with no value |
+
+### Results
+
+The list of [Results][Results Property] of all the [Tasks][Tasks Property] being waited for.
+
+The order of the [Results][Results Property] in the list will match the order of the [Tasks][Tasks Property] (ie. The Result of the Task at index 0, will also be at index 0).
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [IList][]<[TResult][]> |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Results` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Tasks][Tasks Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when [Tasks][Tasks Property] is empty. |
+| [PropertyContainsNullItemException][] | Thrown when one or more items in the list of [Tasks][Tasks Property] is `null`. |
+| [AggregateTaskException][] | Thrown when one or more items in [Tasks][Tasks Property] throws an exception. |
+
+## Remarks
+
+### Waiting for Tasks that have been cancelled
+
+If one or more tasks in the [Tasks][Tasks Property] being waited on has already been cancelled or is cancelled whilst being waited on, this block will wait until all [Tasks][Tasks Property] are complete, then throw an [AggregateTaskException][] containing the cancellation exception(s). Please see [Waiting for a Task that has thrown an exception][WaitingException Remark] for more details.
+
+### Waiting for a Task that has been completed
+
+If one or more tasks in the [Tasks][Tasks Property] being waited on has completed, this block will wait for all [Tasks][Tasks Property] to complete before returning the [Results][Results Property].
+
+### Waiting for a Task that has thrown an exception
+
+If one or more tasks in the [Tasks][Tasks Property] being waited on has already thrown an exception during execution or throws an exception whilst being waited on, this block will wait until all [Tasks][Tasks Property] are complete, then throw an [AggregateTaskException][].
+
+The [AggregateTaskException][] has the property [TaskExceptions][] of type [IDictionary][]<[Int32][],[Exception][]>. This property contains a list of all exceptions thrown by the tasks as index/exception pairs, mapping the exception thrown to the index of the task that threw it.
+
+Below is an example of the value of [TaskExceptions][] after the first and third tasks both threw a [FlowException][]:
+```json
+{
+ "0": {
+ "Exception Type": "FlowException",
+ "Message": "This flow threw an exception.",
+ "HelpLink": "https://docs.wearecortex.com/docs/2023.5/reference/exceptions/flows/flow-exception"
+ },
+ "2": {
+ "Exception Type": "FlowException",
+ "Message": "This flow threw an exception.",
+ "HelpLink": "https://docs.wearecortex.com/docs/2023.5/reference/exceptions/flows/flow-exception"
+ }
+}
+```
+
+To get the [Results][Results Property] of the [Tasks][Tasks Property] that did not throw an exception, you would need to use another [Wait For All Tasks][] block to wait on only the tasks that didn't throw an exception. Below is example showing the simplist method of doing so:
+
+{{< figure src="/images/WaitForAllTasksExample.png" title="Example Flow For Getting Only Successful Results" >}}
+
+1. Wait For All Tasks Block
+ * This block waits for three execution tasks in the variable `Tasks` to complete.
+ * The first and third execution throw an exception.
+ * The block throws an [AggregateTaskException][].
+ * See [Wait For All Tasks][] block.
+2. Handle Block Exception Block
+ * This block handles the [AggregateTaskException][].
+ * It saves the exception to the variable `AggregateTaskException`.
+ * See [Handle Block Exception][] block.
+3. Remove Items At Indexes Block
+ * This block removes all items at specific indexes from a list.
+ * The indexes to be removed are the indexes of the tasks that threw an exception.
+ * The [List][] property is set to `Tasks`.
+ * The [Indexes][] property is set to `AggregateTaskException.TaskExceptions.Keys`.
+ * See [Remove Items At Indexes] block.
+4. Wait For All Tasks Block
+ * This block waits on the new list of [Tasks][Tasks Property].
+ * The list now only contains only one task, the previously second task, as it did not throw an exception.
+ * See [Wait For All Tasks][] block.
+5. Workspace Block
+ * This workspace then uses the successful results for something.
+ * See [Workspace][] block.
+
+[Tasks Property]: {{< ref "#tasks" >}}
+[Results Property]: {{< ref "#results" >}}
+[WaitingException Remark]: {{< ref "#waiting-for-a-task-that-has-thrown-an-exception" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TResult]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[Wait For All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForAllTasksBlock.MainDoc" >}}
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Remove Items At Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtIndexes.MainDoc" >}}
+[Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+
+[List]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtIndexes.List" >}}
+[Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtIndexes.Indexes" >}}
+
+[IExecutionTask]: {{< url path="Cortex.Reference.DataTypes.Tasks.IExecutionTask.MainDoc" >}}
+[ITask]: {{< url path="Cortex.Reference.DataTypes.Tasks.ITask.MainDoc" >}}
+[IList]: {{< url path="Cortex.Reference.DataTypes.Collections.IList.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyContainsNullItemException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyContainsNullItemException.MainDoc" >}}
+[AggregateTaskException]: {{< url path="Cortex.Reference.Exceptions.Tasks.AggregateTaskException.MainDoc" >}}
+
+[TaskExceptions]: {{< url path="Cortex.Reference.Exceptions.Tasks.AggregateTaskException.TaskExceptions" >}}
+
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+[FlowException]: {{< url path="Cortex.Reference.Exceptions.Flows.FlowException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-task-block-1.md b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-task-block-1.md
new file mode 100644
index 000000000..4915bbd8c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/tasks/wait-for-task/wait-for-task-block-1.md
@@ -0,0 +1,196 @@
+---
+title: "Wait For Task"
+linkTitle: "Wait For Task"
+description: "Waits for a Task to complete and returns the Result."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Tasks_WaitForTask_WaitForTaskBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Waits for the specified [Task][Task Property] to finish and returns the [Result][Result Property] from the [Task][Task Property].
+
+## Examples
+
+### Wait for a running Task
+
+This example will wait for an [IExecutionTask][] that represents the asynchronous execution of another flow. The flow this [IExecutionTask][] represents waits for 5 seconds and then sets the output variable `ResultVariable` to `"ResultValue"`. The [Wait For Task][] block begins execution 1 second after the asynchronous flow is started.
+
+When the [Wait For Task][] block begins, the [IExecutionTask][] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": false,
+ "IsCompletedSuccessfully": false,
+ "IsFaulted": false,
+ "Status": "Running",
+ "Exception": null
+}
+
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Task][Task Property] | `($)Task`, with value that represents the asynchronous execution of another flow | `($)Task` is a variable of type [IExecutionTask][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` is a variable of type [Structure][] |
+
+#### Result
+
+Waiting for the [IExecutionTask][] 1 second after it is started, results in the execution containing the [Wait For Task][] block to wait for the task to complete, pausing for 4 seconds and then the variable `($)Result` being updated to the following:
+
+```json
+{
+ "ResultVariable": "ResultValue"
+}
+```
+
+After the [Wait For Task][] block finishes, the `($)Task` will be in the following state:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+### Wait for a completed Task
+
+This example will wait for an [IExecutionTask][] that represents the asynchronous execution of another flow. The flow this [IExecutionTask][] represents waits for 5 seconds and then sets the output variable `ResultVariable` to `"ResultValue"`. The [Wait For Task][] block begins execution 6 seconds after the asynchronous flow is started, therefore starting after the execution has already completed.
+
+When the [Wait For Task][] block begins, the [IExecutionTask][] will have the following properties:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Task][Task Property] | `($)Task`, with value that represents the asynchronous execution of another flow | `($)Task` is a variable of type [IExecutionTask][] |
+| [Result][Result Property] | `($)Result`, with no value | `($)Result` is a variable of type [Structure][] |
+
+#### Result
+
+Waiting for the [IExecutionTask][] 6 seconds after it is started, results in the execution containing the [Wait For Task][] block to not wait and the variable `($)Result` being immediately updated to the following:
+
+```json
+{
+ "ResultVariable": "ResultValue"
+}
+```
+
+After the [Wait For Task][] block finishes, the `($)Task` will remain unchanged:
+
+```json
+{
+ "ExecutionId": "00000000-0000-0000-0000-000000000000",
+ "Id": "00000000-0000-0000-0000-000000000000",
+ "IsCancelled": false,
+ "IsCompleted": true,
+ "IsCompletedSuccessfully": true,
+ "IsFaulted": false,
+ "Status": "RanToCompletion",
+ "Exception": null
+}
+```
+
+***
+
+## Properties
+
+### Task
+
+The [Task][Task Property] being waited for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [ITask][]<[TResult][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Task` with no value |
+
+### Result
+
+The [Result][Result Property] of the [Task][Task Property] being waited for.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TResult][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Result` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Task][Task Property] is `null`. |
+
+## Remarks
+
+### Waiting for a Task that has been cancelled
+
+If the [Task][Task Property] being waited on has already been cancelled or is cancelled whilst being waited on, this block will re-throw the cancellation exception.
+
+### Waiting for a Task that has been completed
+
+If the [Task][Task Property] being waited on has completed, this block will not wait and immediately return the [Task][Task Property]'s result.
+
+### Waiting for a Task that has thrown an exception
+
+If the [Task][Task Property] being waited on has already thrown an exception during execution or throws an exception whilst being waited on, this block will re-throw the exception.
+
+[Task Property]: {{< ref "#task" >}}
+[Result Property]: {{< ref "#result-2" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TResult]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[IExecutionTask]: {{< url path="Cortex.Reference.DataTypes.Tasks.IExecutionTask.MainDoc" >}}
+[ITask]: {{< url path="Cortex.Reference.DataTypes.Tasks.ITask.MainDoc" >}}
+[Wait For Task]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForTask.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/telnet/_index.md b/content/en/docs/2026.3/Reference/Blocks/telnet/_index.md
new file mode 100644
index 000000000..35cb370dd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/telnet/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Telnet"
+linkTitle: "Telnet"
+description: "Blocks related to working with Telnet."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/_index.md b/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/_index.md
new file mode 100644
index 000000000..11e33bc25
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Execute Telnet Command"
+linkTitle: "Execute Telnet Command"
+description: "Blocks related to executing Telnet commands."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/execute-telnet-command-block.md b/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/execute-telnet-command-block.md
new file mode 100644
index 000000000..865511403
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/telnet/execute-telnet-command/execute-telnet-command-block.md
@@ -0,0 +1,420 @@
+---
+title: "Execute Telnet Command"
+linkTitle: "Execute Telnet Command"
+description: "Executes a Telnet command on the specified host."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Telnet_ExecuteTelnetCommand_ExecuteTelnetCommandBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future; this will include further examples and remarks.{{% /alert %}}
+
+## Description
+
+Connects to a host using the [Telnet Session Details][Telnet Session Details Property], and executes a [Command][Command Property], returning the [Response][Response Property] and [Telnet Logs][Telnet Logs Property].
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the [Host] is closed or is kept open for use on subsequent Execute Telnet Command blocks.
+
+## Examples
+
+### Execute a Command
+
+This example will execute a [Command][Command Property] on the server with the following details:
+
+- [Host] - `"localhost"`
+- [Port] - `23`
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Command][Command Property] | `($)Command` with value `"ipconfig"` | `($)Command` is a variable of type [EncryptableText][] |
+| [Telnet Session Details][Telnet Session Details Property] | `($)TelnetSessionDetails` with value `{"Host": "localhost", "Port": 23, "TerminalPrompt": "(.*(~(.*[\r\n]?)\$\|>))"}`
In this example `($)TelnetSessionDetails` has been set up using the following [Expression][]:
`new TelnetSessionDetails("localhost", 23, @"(.*(~(.*[\r\n]?)\$\|>))")` | `($)TelnetSessionDetails` is a variable of type [TelnetSessionDetails][] |
+| [Close Session][Close Session Property] | `($)CloseSession` with value `true` | `($)CloseSession` is a variable of type [Boolean][] |
+| [Configuration Settings][Configuration Settings Property] | `($)ConfigurationSettings`, with no value | `($)ConfigurationSettings` is a variable of type [Dictionary][]<[String][], [EncryptableText][]> |
+| [Response][Response Property] | `($)Response`, with no value | `($)Response` will be set to the type [String][] |
+| [Telnet Logs][Telnet Logs Property] | `($)TelnetLogs`, with no value | `($)TelnetLogs` will be set to the type [TelnetLogs][] |
+
+#### Result
+
+Running the [Command][Command Property] results in the variable `($)Response` being updated to the following:
+
+```text
+Windows IP Configuration
+
+Ethernet adapter Ethernet 3:
+
+Connection-specific DNS Suffix. : reddog.microsoft.com
+Link-local IPv6 Address. . . . . : fe80::78eb:a051:2b84:e8bd%6
+IPv4 Address. . . . . . . . . . . : 10.3.0.4
+Subnet Mask . . . . . . . . . . . : 255.255.255.0
+Default Gateway . . . . . . . . . : 10.3.0.1
+```
+
+It also results in the variable `($)TelnetLogs` being updated to the following:
+
+```json
+{
+ "WelcomeMessage": "Welcome to Microsoft Telnet Server.",
+ "TerminalPromptMatch": "C:/Users/TelnetUser>",
+ "Logs": "[Info] Connecting to Localhost.\r\n[Info] Connected to LocalHost.\r\n[Info] Welcome message received.\r\n[Info] Command sent.\r\n[Info] Terminal Prompt found.\r\n[Info] Disconnected from Localhost."
+}
+```
+
+Note that more logs are included in this example, but have been omitted from `($)TelnetLogs.Logs`.
+
+***
+
+## Properties
+
+### Command
+
+The [Command][Command Property] that will be executed on the [Host][TelnetSessionDetails Host] specified in the [Telnet Session Details][Telnet Session Details Property].
+
+|||
+|----------|----------|
+| Data Type | [EncryptableText][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | `$@""` |
+
+### Telnet Session Details
+
+The [Telnet Session Details][Telnet Session Details Property] object that includes all of the information required to open and maintain a Telnet session. This property contains all of the information in relation to the server the [Command][Command Property] will be executed on, these are:
+
+- [Host][TelnetSessionDetails Host]
+- [Port][TelnetSessionDetails Port]
+- [TerminalPrompt][TelnetSessionDetails TerminalPrompt]
+
+|||
+|----------|----------|
+| Data Type | [TelnetSessionDetails][] |
+| Property Type | [InputOutput][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TelnetSessionDetails` with no value |
+
+### Close Session
+
+[Close Session][Close Session Property] can be specified to choose whether the session on the [Host][TelnetSessionDetails Host] is closed or is kept open for use on subsequent Execute Telnet Command blocks, this defaults to `false` if left blank, please see [Closing Sessions][] for more information.
+
+|||
+|----------|----------|
+| Data Type | [Boolean][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][] |
+| Default Value | [Boolean][] with value `true` |
+
+### Configuration Settings
+
+The [Configuration Settings][Configuration Settings Property] for the Telnet connection and execution.
+
+For a full list of configuration settings please see [TelnetConfigurationSettings][].
+
+|||
+|----------|----------|
+| Data Type | [IDictionary][]<[String][], [EncryptableText][]> |
+| Property Type | [Input][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Expression][] |
+| Default Value | [IDictionary][]<[String][], [EncryptableText][]> with value shown below: |
+
+```csharp
+new Dictionary {
+ { "Timeout", "60" },
+ { "EndOfLineCharacters", "\r\n" },
+ { "CancelCommand", "CtrlC" },
+ { "ControlCharactersToClean", @"\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)(g?)|[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]" },
+}
+```
+
+### Response
+
+The Telnet [Response][Response Property] that is returned from the execution of the [Command][Command Property] on the [Host][TelnetSessionDetails Host] specified in the [Telnet Session Details][Telnet Session Details Property].
+
+|||
+|----------|----------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Response` with no value |
+
+### Telnet Logs
+
+The [Telnet Logs][Telnet Logs Property] that are returned from the execution of the [Command][Command Property] on the host specified in the [Telnet Session Details][Telnet Session Details Property]. This property contains all of the information in relation to the logs returned by the [Command][Command Property], these are:
+
+- [WelcomeMessage]
+- [TerminalPromptMatch]
+- [Logs]
+
+|||
+|----------|----------|
+| Data Type | [TelnetLogs][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `true` |
+| Default Editor | [Variable][] |
+| Default Value | `($)TelnetLogs` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|--------------------------------------|-------------|
+| [PropertyNullException][] | Thrown when [Command][Command Property] is `null`. |
+|| Thrown when the [Telnet Session Details][Telnet Session Details Property] is `null`. |
+|| Thrown when the [Host][TelnetSessionDetails Host] within the [Telnet Session Details][Telnet Session Details Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when the specified [Host][TelnetSessionDetails Host] within the [Telnet Session Details][Telnet Session Details Property] is empty. |
+| [PropertyValueOutOfRangeException][] | Thrown when the specified [Port][TelnetSessionDetails Port] within the [Telnet Session Details][Telnet Session Details Property] is below 1 or above 65535. |
+| [TelnetClientException][] | Thrown when one or more settings in [Configuration Settings][Configuration Settings Property] are invalid. (includes a dictionary of SettingName: ExceptionMessage from IPWorksTelnetException) |
+|| Thrown when the specified [Host][TelnetSessionDetails Host] within the [Telnet Session Details][Telnet Session Details Property] is invalid. |
+|| Thrown when the specified [Port][TelnetSessionDetails Port] within the [Telnet Session Details][Telnet Session Details Property] is invalid. |
+| [TelnetServerException][] | Thrown when the [Host][TelnetSessionDetails Host] exits without using [Close Session][Close Session Property], returning the response received up to the point the host exited the session. |
+| [RegexMatchTimeoutException][] | Thrown when the execution time of the regular expression pattern-matching exceeds the time-out interval. |
+| [RegexParsingFailedException][] | Thrown when [TerminalPrompt][TelnetSessionDetails TerminalPrompt] within [Telnet Session Details][Telnet Session Details Property] contains invalid regex. |
+
+## Remarks
+
+### Empty Command
+
+If the [Command][Command Property] is empty, it will act as an enter command on the terminal.
+
+### Null or Empty Terminal Prompt
+
+If the [TerminalPrompt] is null or empty then it defaults to `(.*(~(.*[\r\n]?)\$|>))` (Windows and Linux friendly default).
+
+### Terminal Prompt Match
+
+The [TerminalPromptMatch] in the [TelnetLogs] will output the exact terminal prompt that was matched by the [TerminalPrompt] regex.
+
+### Telnet Response
+
+The response will contain all output after the [Command][Command Property] and before the next terminal prompt.
+
+Control characters are removed from the response.
+
+For Windows machines before Windows Server 2019 or Windows 10 (build 1809) using Telnet Server, the returned data comes back in an less usable format.
+
+### Default Telnet Port
+
+The default port is 23.
+
+### Opening Sessions
+
+The Execute Telnet Command block automatically handles creating and opening a session for the specified [Telnet Session Details][Telnet Session Details Property] using the following rules:
+
+- If a session does not exist, a new session will be created, opened and used when the block runs.
+- If a session already exists but is closed, the session will be opened and used when the block runs.
+- If a session already exists and is open, the session will be used when the block runs.
+
+For information on how to explicitly close a session, please see [Closing Sessions][].
+
+### Closing Sessions
+
+Sessions can be explicitly closed by setting [Close Session][Close Session Property] to `true`. This causes the session to be closed after the [Command][Command Property] has been executed.
+
+For information on how to open a session, please see [Opening Sessions][].
+
+### Inactivity Timeout
+
+The inactivity timeout specifies the number of seconds after which to timeout. This is reset every time new data is received.
+
+Timeout must be a positive [Int32] integer and smaller or equal to [Int32.MaxValue][] (`2147483647`), otherwise a [TelnetResponseException] will be thrown.
+
+The default inactivity timeout is 60 seconds.
+
+To change the default inactivity timeout, use the `Timeout` [Configuration Settings][Configuration Settings Property] e.g.
+
+```csharp
+new Dictionary
+{
+ { "Timeout", "10"},
+}
+```
+
+### Terminal Type
+
+The default terminal type is set by the [Host].
+
+To change the default terminal type, use the `TerminalType` [Configuration Settings][Configuration Settings Property] e.g.
+
+```csharp
+new Dictionary
+{
+ { "TerminalType", "vt100"},
+}
+```
+
+### Terminal Window Size
+
+The default terminal window size is set by the [Host].
+
+To change the terminal window size, use the `TerminalWidth` and `TerminalHeight` [Configuration Settings][Configuration Settings Property] e.g.
+
+```csharp
+new Dictionary
+{
+ { "TerminalWidth", "500"},
+ { "TerminalHeight", "50"},
+}
+```
+
+If `TerminalWidth` is set but not `TerminalHeight`, `TerminalHeight` defaults to 50.
+
+If `TerminalHeight` is set but not `TerminalWidth`, `TerminalWidth` defaults to 500.
+
+Depending on the [Host] you are connecting to, the values supported for `TerminalWidth` and `TerminalHeight` may differ. If values provided are invalid the host may return a response stating such.
+
+`TerminalWidth` and `TerminalHeight` must be positive [Int32] integers and smaller or equal to [Int32.MaxValue][] (`2147483647`), otherwise a [TelnetClientException] will be thrown.
+
+### End Of Line Characters
+
+On certain hosts it is required to send one or more characters e.g. `\r` or `\r\n` after each command. End of line characters can be used to achieve this and are automatically appended to the [Command][Command Property].
+
+The default end of line characters are `\r\n`, which on most systems will ensure that the [Command][Command Property] is executed. If the default does not work it can be set through the [Configuration Settings][Configuration Settings Property] using the `EndOfLineCharacters` setting e.g.
+
+```csharp
+new Dictionary
+{
+ { "EndOfLineCharacters", "\r\n"},
+}
+```
+
+If an invalid value is provided the [Command][Command Property] will not be executed and will timeout after the [Inactivity Timeout][] has been reached.
+
+### Handling Commands That Return Interactive Prompts
+
+Some commands can return interactive prompts (e.g. `press enter for more...`). In these cases, you must set the [TerminalPrompt][] within [SessionDetails][Telnet Session Details Property] to match the prompt which requires interaction, as well as the end of response prompt (e.g `press enter for more\.\.\.|(.*(~(.*[\r\n]?)\$|>))`). The [TerminalPromptMatch][] within the [TelnetLogs][] can then be used to determine whether the full response has been returned or not; if not, further commands need to be sent to continue receiving the response.
+
+### Do, Dont, Will and Wont Options
+
+Do, Dont, Will and Wont codes allows negotiation between the client and the telnet server of options for the telnet connection.
+
+They are set as a semicolon separated list in the [Configuration Settings][Configuration Settings Property] with each as a key e.g
+
+```csharp
+new Dictionary
+{
+ { "Do", "0;1"},
+}
+```
+
+The above example shows how to enable the [echo option][] and [binary transmission option][]. For a full list of Do, Dont, Will and Wont codes please see [Telnet Options][].
+
+### Configuration Settings
+
+[Configuration Settings][Configuration Settings Property] are in PascalCase (e.g. `CloseStreamAfterTransfer`).
+
+For a full list of configuration settings please see [TelnetConfigurationSettings][].
+
+### Cancel Command
+
+The cancel command is sent to the [Host][TelnetSessionDetails Host] by {{% ctx %}} when an execution times out so the [Host][TelnetSessionDetails Host] can stop the execution and allow other commands to be executed on that session.
+
+The default cancel command is `Ctrl-C`. If the default does not work it can be set through the [Configuration Settings][Configuration Settings Property] using the `CancelCommand` setting e.g.
+
+```csharp
+ new Dictionary
+{
+ { "CancelCommand", "CtrlC" },
+}
+```
+
+The supported cancel commands are: `CtrlA`, `CtrlB`, `CtrlC`,`CtrlD`,`CtrlE`,`CtrlF`,`CtrlG`,`CtrlH`,`CtrlI`,`CtrlJ`,`CtrlK`,`CtrlL`,`CtrlM`,`CtrlN`,`CtrlO`,`CtrlP`,`CtrlQ`,`CtrlR`,`CtrlS`,`CtrlT`,`CtrlU`,`CtrlV`,`CtrlW`,`CtrlX`,`CtrlY`,`CtrlZ`,`Ctrl[`,`Ctrl\`,`Ctrl]`,`Ctrl^`,`Ctrl_`.
+
+The above commands are also case insensitive and can be in various formats (e.g. `CtrlA` can also be specified as `ctrlA`, `Ctrl-A`, `Ctrl+A`).
+
+If `CancelCommand` is empty then its not sent to the host.
+
+### Proxies
+
+Communication via a proxy can be achieved through the following [Configuration Settings][Configuration Settings Property]:
+
+- [FirewallType][TelnetFirewallTypes] - The type of proxy to connect through (required).
+- [FirewallHost][TelnetFirewallHost] - The name or IP address of the proxy (required).
+- [FirewallPort][TelnetFirewallPort] - The TCP port of the proxy (optional). The default depends on the [FirewallType][TelnetFirewallTypes] specified.
+- [FirewallUser][TelnetFirewallUser] - The username to use if the proxy requires authentication (optional).
+- [FirewallPassword][TelnetFirewallPassword] - The password to use if the proxy requires authentication (optional).
+
+The below example shows how to connect through a SOCKS5 proxy (`3`) hosted on `FirewallHost.com` and on port `1080`.
+
+```csharp
+ new Dictionary
+ {
+ { "FirewallHost", "FirewallHost.com" },
+ { "FirewallType", "3" },
+ { "FirewallPort", "1080" },
+}
+```
+
+### Known Limitations
+
+None
+
+[Command Property]: {{< ref "#command" >}}
+[Telnet Session Details Property]: {{< ref "#telnet-session-details" >}}
+[Close Session Property]: {{< ref "#close-session" >}}
+[Configuration Settings Property]: {{< ref "#configuration-settings" >}}
+[Response Property]: {{< ref "#response" >}}
+[Telnet Logs Property]: {{< ref "#telnet-logs" >}}
+
+[Opening Sessions]: {{< ref "#opening-sessions" >}}
+[Closing Sessions]: {{< ref "#closing-sessions" >}}
+[Configuration Settings]: {{< ref "#configuration-settings" >}}
+[Inactivity Timeout]: {{< ref "#inactivity-timeout" >}}
+[Terminal Type]: {{< ref "#terminal-type" >}}
+[Command]: {{< ref "#configuration-settings" >}}
+
+[IDictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.IDictionary.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[EncryptableText]: {{< url path="Cortex.Reference.DataTypes.Text.EncryptableText.MainDoc" >}}
+
+[TelnetSessionDetails]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.MainDoc" >}}
+[TelnetSessionDetails Host]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.Host" >}}
+[TelnetSessionDetails Port]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.Port" >}}
+[TelnetSessionDetails TerminalPrompt]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.TerminalPrompt" >}}
+[Host]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.Host" >}}
+[Port]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.Port" >}}
+[Logs]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetLogs.Logs" >}}
+[WelcomeMessage]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetLogs.WelcomeMessage" >}}
+[TerminalPromptMatch]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetLogs.TerminalPromptMatch" >}}
+
+[TelnetLogs]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetLogs.MainDoc" >}}
+
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Int32.MaxValue]: {{< url path="MSDocs.DotNet.Api.System.Int32.MaxValue" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyValueOutOfRangeException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyValueOutOfRangeException.MainDoc" >}}
+[RegexMatchTimeoutException]: {{< url path="MSDocs.DotNet.Api.System.Text.RegularExpressions.RegexMatchTimeoutException" >}}
+[RegexParsingFailedException]: {{< url path="Cortex.Reference.Exceptions.Text.Regex.RegexParsingFailedException.MainDoc" >}}
+[TerminalPrompt]: {{< url path="Cortex.Reference.DataTypes.Telnet.TelnetSessionDetails.TerminalPrompt" >}}
+
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[Telnet Options]: {{< url path="RFC.Docs.Telnet.Options.MainDoc" >}}
+[echo option]: {{< url path="RFC.Docs.Telnet.Options.Echo" >}}
+[binary transmission option]: {{< url path="RFC.Docs.Telnet.Options.BinaryTransmission" >}}
+[TelnetConfigurationSettings]: {{< url path="IPWorks.TelnetConfigurationSettings" >}}
+[TelnetFirewallTypes]: {{< url path="IPWorks.TelnetFirewallTypes" >}}
+[TelnetFirewallHost]: {{< url path="IPWorks.TelnetFirewallHost" >}}
+[TelnetFirewallPort]: {{< url path="IPWorks.TelnetFirewallPort" >}}
+[TelnetFirewallUser]: {{< url path="IPWorks.TelnetFirewallUser" >}}
+[TelnetFirewallPassword]: {{< url path="IPWorks.TelnetFirewallPassword" >}}
+[TelnetServerException]: {{< url path="Cortex.Reference.Exceptions.Telnet.TelnetServerException.MainDoc" >}}
+[TelnetClientException]: {{< url path="Cortex.Reference.Exceptions.Telnet.TelnetClientException.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/variables/_index.md b/content/en/docs/2026.3/Reference/Blocks/variables/_index.md
new file mode 100644
index 000000000..e9d011dc5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/variables/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Variables"
+linkTitle: "Variables"
+description: "Blocks related to working with Variables."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/_index.md b/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/_index.md
new file mode 100644
index 000000000..9c2999ce5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Set Variable"
+linkTitle: "Set Variable"
+description: "Blocks that are used to set Variables."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/set-variable-block-1.md b/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/set-variable-block-1.md
new file mode 100644
index 000000000..bd0e6ec5f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/variables/set-variable/set-variable-block-1.md
@@ -0,0 +1,202 @@
+---
+title: "Set Variable"
+linkTitle: "Set Variable"
+description: "Sets a Variable to a given Value."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Variables_SetVariable_SetVariableBlock_1.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sets a [Variable][Variable Property] to a given [Value][Value Property].
+
+Any type of [Value][Value Property] can be set, including Lists, Dictionaries, Structures etc.
+
+If a [Variable][Variable Property] is set to the [Value][Value Property] of another [Variable][Variable Property] that is a [Reference Type][Reference Types] then they will refer to the same instance. This means that if either [Variable][Variable Property] has new items added to it, items updated in it, or items removed from it, then both will be affected, please see [Reference Types][] for more information.
+
+If a [Variable][Variable Property] is set to the [Value][Value Property] of another [Variable][Variable Property] that is a [Value Type][Value Types] then they will refer to different instances. This means that if either [Variable][Variable Property] is updated, then only the updated variable will be affected, please see [Value Types][] for more information.
+
+## Examples
+
+### Setting a Variable
+
+This example will set a [Variable][Variable Property] to a list of `[[1, 2, 3], [4, 5, 6]]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | [Value][Value Property], with value `[[1, 2, 3], [4, 5, 6]]` | The [Value][Value Property] is of type [List][]<[List][]<[Int32][]>> |
+| [Variable][Variable Property] | `($)Variable`, with no value | `($)Variable` is a variable that will be set to the type of the value (i.e. [List][]<[List][]<[Int32][]>>) |
+
+#### Result
+
+Setting `($)Variable` to `[[1, 2, 3], [4, 5, 6]]` results in the variable `($)Variable` being updated to the following:
+
+```json
+[
+ [
+ 1,
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 5,
+ 6
+ ]
+]
+```
+
+***
+
+### Overwriting a Variable
+
+This example will overwrite an existing [Variable][Variable Property] that has the text value `"A text value"`, to a list value of `[1, 2, 3]`.
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | [Value][Value Property], with value `[1, 2, 3]` | The [Value][Value Property] is of type [List][]<[Int32]> |
+| [Variable][Variable Property] | `($)Variable`, with value `"A text value"` | `($)Variable` is a variable that will be set to the type of the value (i.e. [List][]<[Int32][]>) |
+
+#### Result
+
+Setting `($)Variable` to `[1, 2, 3]` results in the variable `($)Variable` being updated to the following:
+
+```json
+[
+ 1,
+ 2,
+ 3
+]
+```
+
+***
+
+Note that `($)Variable` is overwritten, any data previously stored within the variable will be lost.
+
+### Overwriting a Variable Property
+
+This example will update the `Items` property within an existing [Variable][Variable Property] that has the text value `"A text value"`, to a list of `[1, 2, 3]`.
+
+`($)Variable` has an initial value of:
+
+```json
+{
+ "Items": "A text value",
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Value][Value Property] | [Value][Value Property], with value `[1, 2, 3]` | The [Value][Value Property] is of type [List][]<[Int32][]> |
+| [Variable][Variable Property] | `($)Variable.Items`, with value `"A text value"` | `($)Variable.Items` is a property within variable that will be set to the type of the value (i.e. [List][]<[Int32][]>) |
+
+#### Result
+
+Setting the `($)Variable.Items` property to `[1, 2, 3]` results in the `($)Variable` being updated to the following:
+
+```json
+{
+ "Items": [
+ 1,
+ 2,
+ 3
+ ]
+}
+```
+
+Note that `($)Variable.Items` is overwritten, any data previously stored within the property will be lost.
+
+***
+
+## Properties
+
+### Value
+
+The [Value][Value Property] to set the [Variable][Variable Property] to.
+
+A [Variable][Variable Property] can be set to any type of object, including Lists, Dictionaries, Structures etc.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TValue][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Expression][] |
+| Default Value | No value (defaults to `null`) |
+
+### Variable
+
+The [Variable][Variable Property] that will be set to the [Value][Value Property].
+
+If a [Variable][Variable Property] is set to the [Value][Value Property] of another [Variable][Variable Property] that is a [Reference Type][Reference Types] then they will refer to the same instance. This means that if either [Variable][Variable Property] has new items added to it, items updated in it, or items removed from it, then both will be affected, please see [Reference Types][] for more information.
+
+If a [Variable][Variable Property] is set to the [Value][Value Property] of another [Variable][Variable Property] that is a [Value Type][Value Types] then they will refer to different instances. This means that if either [Variable][Variable Property] is updated, then only the updated variable will be affected, please see [Value Types][] for more information.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [TValue][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Variable` with no value |
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Initialising Variables
+
+If the Set Variable block is used to set a [Variable][Variable Property] that is not initialised, the [Variable][Variable Property] will be initialised with the given [Value][Value Property] when the block is run.
+
+### Overwriting Variables
+
+If the Set Variable block is used to set a [Variable][Variable Property] that is already initialised and has a [Value][Value Property], the [Variable][Variable Property] will be overwritten with the new [Value][Value Property] when the block is run.
+
+A property of a [Variable][Variable Property] can also be overwritten, instead of the whole object. This is shown in the example above, [Overwriting a Variable Property][]
+
+### Variable Scope
+
+Each workspace has its own scope; as a result, variables can be defined that only exist and are accessible in this workspace and any of its sub-workspaces. On exiting a workspace any variables defined for the workspace's scope are deleted.
+
+The Set Variable block can only set a [Variable][Variable Property] that is accessible from its scope.
+
+For information about variables and scope, please see [Variables][].
+
+### Null Value
+
+If [Value][Value Property] is not provided or is set to null, [Variable][Variable Property] will be set to null.
+
+[Variable Property]: {{< ref "#variable" >}}
+[Value Property]: {{< ref "#value" >}}
+[Overwriting a Variable Property]: {{< ref "#overwriting-a-variable-property" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[TValue]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+
+[Reference Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.ReferenceTypes" >}}
+[Value Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.ValueTypes" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/wireless/_index.md b/content/en/docs/2026.3/Reference/Blocks/wireless/_index.md
new file mode 100644
index 000000000..8e014fc7f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/wireless/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wireless"
+linkTitle: "Wireless"
+description: "Blocks related to moving the execution."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/_index.md b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/_index.md
new file mode 100644
index 000000000..c7a90e900
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wireless Receiver"
+linkTitle: "Wireless Receiver"
+description: "Blocks related to receiving an execution."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/wireless-receiver-block.md b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/wireless-receiver-block.md
new file mode 100644
index 000000000..46a69d439
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-receiver/wireless-receiver-block.md
@@ -0,0 +1,53 @@
+---
+title: "Wireless Receiver"
+linkTitle: "Wireless Receiver"
+description: "Receives executions."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Wireless_WirelessReceiver_WirelessReceiverBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Receives executions from [Wireless Sender][Wireless Sender Block] blocks.
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; selection of the [Wireless Receiver][Wireless Receiver Block Property] block in [Wireless Sender][Wireless Sender Block] blocks is done based on description so it should be set to something appropriate and unique.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Wireless Block Scope
+
+The Wireless blocks are scoped to the workspace that they are placed in; as a result, [Wireless Sender][Wireless Sender Block] blocks will only be able to select [Wireless Receiver][Wireless Receiver Block] blocks that are placed in the same workspace as itself.
+
+### Multiple Wireless Senders with same Wireless Receiver
+
+Multiple [Wireless Sender][Wireless Sender Block] blocks can send executions to the same [Wireless Receiver][Wireless Receiver Block] block.
+
+### Multiple Wireless Receivers with same Description
+
+If there are multiple [Wireless Receiver][Wireless Receiver Block] blocks with the same Description in the same scope, the [Guid][] of those blocks will be shown in the dropdown entries of the [Wireless Receiver Block][Wireless Receiver Block Property] property's [Literal][Literal Editor] editor in the [Wireless Sender][Wireless Sender Block] block.
+
+### Known Limitations
+
+None
+
+[Guid]: {{< url path="Cortex.Reference.DataTypes.Other.Guid.MainDoc" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Wireless Sender Block]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessSender.WirelessSender.MainDoc" >}}
+[Wireless Receiver Block]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessReceiver.WirelessReceiver.MainDoc" >}}
+[Wireless Receiver Block Property]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessSender.WirelessSender.WirelessReceiverProperty" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/_index.md b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/_index.md
new file mode 100644
index 000000000..c1bff71f6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Wireless Sender"
+linkTitle: "Wireless Sender"
+description: "Blocks related to sending an execution."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/wireless-sender-block.md b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/wireless-sender-block.md
new file mode 100644
index 000000000..dd9389846
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/wireless/wireless-sender/wireless-sender-block.md
@@ -0,0 +1,88 @@
+---
+title: "Wireless Sender"
+linkTitle: "Wireless Sender"
+description: "Sends an execution to a specific block."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Wireless_WirelessSender_WirelessSenderBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Sends the execution to the specified [Wireless Receiver][Wireless Receiver Block] block.
+
+## Examples
+
+### Sending an Execution to a Wireless Receiver
+
+This example is for a flow containing two [Wireless Receiver][Wireless Receiver Block] blocks with descriptions set to `Receiver 1` and `Receiver 2` as well as a [Wireless Sender][Wireless Sender Block] block with the following properties:
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Wireless Receiver Block][Wireless Receiver Property] | [Wireless Receiver Block][Wireless Receiver Property], with value `Receiver 1` | [Wireless Receiver Block][Wireless Receiver Property] is of type [WirelessReceiverBlockReference][] |
+
+#### Result
+
+Once an execution is started and it reaches the [Wireless Sender][Wireless Sender Block] block the execution will jump to the [Wireless Receiver][Wireless Receiver Block] block with description `Receiver 1`.
+
+## Properties
+
+### Wireless Receiver Block
+
+The [Wireless Receiver][Wireless Receiver Block] block that the execution will be sent to.
+
+The [Literal Editor][] is the only editor available for this property, and it provides the developer a list of all available [Wireless Receiver][Wireless Receiver Block] blocks in the current workspace to choose from.
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [WirelessReceiverBlockReference][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Literal][Literal Editor] |
+| Default Value | No value (defaults to `null`) |
+
+## Exceptions
+
+| Name | Description |
+|------|-------------|
+| [WirelessReceiverBlockNotFoundException][] | Thrown when the specified [Wireless Receiver][Wireless Receiver Property] block has been deleted. See [Wireless Receiver Block Not Found][WirelessReceiverExceptionBlockNotFound]. |
+| | Thrown when [Wireless Receiver][Wireless Receiver Property] block has not been selected. See [Wireless Receiver Property Empty][WirelessReceiverExceptionPropertyEmpty]. |
+
+## Remarks
+
+### Wireless Block Scope
+
+The Wireless blocks are scoped to the workspace that they are placed in; as a result, [Wireless Sender][Wireless Sender Block] blocks will only be able to select [Wireless Receiver][Wireless Receiver Block] blocks that are placed in the same workspace as itself.
+
+### Multiple Wireless Senders with same Wireless Receiver
+
+Multiple [Wireless Sender][Wireless Sender Block] blocks can send executions to the same [Wireless Receiver][Wireless Receiver Block] block.
+
+### Multiple Wireless Receivers with same Description
+
+If there are multiple [Wireless Receiver][Wireless Receiver Block] blocks with the same Description in the same scope, the [Guid][] of those blocks will be shown in the dropdown entries of the [Literal][Literal Editor] editor of the [Wireless Receiver Block][Wireless Receiver Property] property.
+
+### Known Limitations
+
+#### The Wireless Receiver Block Property can only use the Literal Editor
+
+The Literal Editor is the only editor available for the [Wireless Receiver Block Property][Wireless Receiver Property]
+
+In future this limitation may be removed.
+
+[Guid]: {{< url path="Cortex.Reference.DataTypes.Other.Guid.MainDoc" >}}
+[Wireless Receiver Property]: {{< ref "#wireless-receiver-block" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Wireless Sender Block]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessSender.WirelessSender.MainDoc" >}}
+[Wireless Receiver Block]: {{< url path="Cortex.Reference.Blocks.Wireless.WirelessReceiver.WirelessReceiver.MainDoc" >}}
+[WirelessReceiverBlockReference]: {{< url path="Cortex.Reference.DataTypes.Wireless.WirelessReceiverBlockReference.MainDoc" >}}
+[WirelessReceiverBlockNotFoundException]: {{< url path="Cortex.Reference.Exceptions.Wireless.WirelessReceiverBlockNotFoundException.MainDoc" >}}
+[WirelessReceiverExceptionBlockNotFound]: {{< url path="Cortex.Reference.Exceptions.Wireless.WirelessReceiverBlockNotFoundException.BlockNotFound" >}}
+[WirelessReceiverExceptionPropertyEmpty]: {{< url path="Cortex.Reference.Exceptions.Wireless.WirelessReceiverBlockNotFoundException.PropertyEmpty" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/_index.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/_index.md
new file mode 100644
index 000000000..02d2c9a3d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Workspaces"
+linkTitle: "Workspaces"
+description: "Blocks used to organise flows and group related logic and actions together."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/_index.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/_index.md
new file mode 100644
index 000000000..fa6587356
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/_index.md
@@ -0,0 +1,5 @@
+---
+title: "End Workspace"
+linkTitle: "End Workspace"
+description: "Blocks that indicate the end of a workspace."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/end-workspace-block.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/end-workspace-block.md
new file mode 100644
index 000000000..32c4249a6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/end-workspace/end-workspace-block.md
@@ -0,0 +1,45 @@
+---
+title: "End Workspace"
+linkTitle: "End Workspace"
+description: "Indicates the end of a workspace."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Workspaces_EndWorkspace_EndWorkspaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Indicates the end of a workspace; when a flow execution reaches this block it will exit the workspace, and all variables declared in the [scope][WorkspaceScope] of the workspace are deleted.
+
+A workspace can contain any number of these blocks, and they can be placed anywhere in the workspace.
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; typically this will be left blank for this block.
+
+A breakpoint can be added to this block when debugging.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Workspace Scope
+
+Each workspace has its own scope; as a result, variables can be defined that only exist and are accessible in this workspace and any of its sub-workspaces. On exiting a workspace any variables defined for the workspace's scope are deleted.
+
+For information about variables and scope, please see [Variables][].
+
+[WorkspaceScope]: {{< ref "#workspace-scope" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/_index.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/_index.md
new file mode 100644
index 000000000..8a383367c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Start Workspace"
+linkTitle: "Start Workspace"
+description: "Blocks that indicate the start of a workspace."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/start-workspace-block.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/start-workspace-block.md
new file mode 100644
index 000000000..996d8e618
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/start-workspace/start-workspace-block.md
@@ -0,0 +1,45 @@
+---
+title: "Start Workspace"
+linkTitle: "Start Workspace"
+description: "Indicates the start of a workspace."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Workspaces_StartWorkspace_StartWorkspaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Indicates the start of a workspace; when a flow execution reaches this block it will create a new [scope][WorkspaceScope] for the workspace.
+
+This is always the first block in a workspace. It cannot be deleted, and a workspace can only contain one of these blocks.
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; typically this will be left blank for this block.
+
+A breakpoint can be added to this block when debugging.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Workspace Scope
+
+Each workspace has its own scope; as a result, variables can be defined that only exist and are accessible in this workspace and any of its sub-workspaces. On exiting a workspace any variables defined for the workspace's scope are deleted.
+
+For information about variables and scope, please see [Variables][].
+
+[WorkspaceScope]: {{< ref "#workspace-scope" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/_index.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/_index.md
new file mode 100644
index 000000000..09a5c0e9b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Workspace"
+linkTitle: "Workspace"
+description: "Blocks that represent a new workspace."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/workspace-block.md b/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/workspace-block.md
new file mode 100644
index 000000000..2ee8ddde1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/workspaces/workspace/workspace-block.md
@@ -0,0 +1,79 @@
+---
+title: "Workspace"
+linkTitle: "Workspace"
+description: "Represents a new workspace."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Workspaces_Workspace_WorkspaceBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+This block represents a new workspace; when a flow execution reaches this block it will move to the [Start Workspace][] block within this block's workspace; each workspace has its own [scope][WorkspaceScope].
+
+The [Workspace][] block can be used to organise block logic into smaller steps with distinct functions. When a new [Workspace][] block is placed on a flow, it will contain a [Start Workspace][] and [End Workspace][] block within its workspace.
+
+If a [Workspace][] block is copied and pasted its workspace is also copied, along with all blocks and variables within its [scope][WorkspaceScope].
+
+The block has no block specific properties, but it does have the `Description` property that is common to all blocks. This allows users to give each block a description; typically this will be left blank for this block. Any description given will become the name for this block's [scope][WorkspaceScope]
+
+A breakpoint can be added to this block when debugging.
+
+## Examples
+
+No examples for the block.
+
+## Properties
+
+No properties for the block, other than the `Description` property that is common to all blocks, and the `Block Timeout` property that is common to most blocks.
+
+## Exceptions
+
+No exceptions are thrown by the block.
+
+## Remarks
+
+### Block Restrictions
+
+A workspace can contain any number of blocks. The only restrictions within a workspace are that there can only be one [Start Workspace][] block and one [Handle Workspace Exception][] block within a workspace.
+
+Starting a flow that contains more than one of the restricted blocks within a workspace will cause a [Validation Error][Validation Errors] to occur.
+
+### Unhandled Exceptions
+
+If an exception thrown by a block is not handled by any connected [Handle Block Exception blocks][], it will be passed to the [Handle Workspace Exception][] block on the same workspace.
+
+If the workspace does not contain a [Handle Workspace Exception][] block it will be rethrown by the [Workspace][] block the workspace belongs to.
+
+This process repeats until:
+
+* The exception is handled, or
+* The exception reaches the flow's top-level workspace, is not handled by any [Handle Block Exception blocks][] and the top-level workspace does not contain a [Handle Workspace Exception][] block. At this stage, the exception is handled by the flow's [Handle Flow Exception][] block.
+
+If an exception occurs within the workspace of the [Handle Flow Exception][] block and is not handled, the flow will end with a status of Error.
+
+{{< figure src="/images/flow-error-status.png" >}}
+
+For more information about chaining of exception handling blocks and passing of exceptions, please see [Exception Handling][].
+
+### Workspace Scope
+
+Each workspace has its own scope; as a result, variables can be defined that only exist and are accessible in this workspace and any of its sub-workspaces. On exiting a workspace any variables defined for the workspace's scope are deleted.
+
+For information about variables and scope, please see [Variables][].
+
+[WorkspaceScope]: {{< ref "#workspace-scope" >}}
+
+[Start Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.StartWorkspace.StartWorkspace.MainDoc" >}}
+[End Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.EndWorkspace.EndWorkspace.MainDoc" >}}
+[Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+
+[Exception Handling]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Validation Errors]: {{< url path="Cortex.Reference.Messages.Validation.Errors.MainDoc" >}}
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Blocks/xml/_index.md b/content/en/docs/2026.3/Reference/Blocks/xml/_index.md
new file mode 100644
index 000000000..14b4020e2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/xml/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Xml"
+linkTitle: "Xml"
+description: "Blocks related to working with Xml."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/_index.md b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/_index.md
new file mode 100644
index 000000000..98cd5d6a2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Convert Xml"
+linkTitle: "Convert Xml"
+description: "Convert xml to and from other data types."
+---
diff --git a/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-structure-to-xml-block.md b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-structure-to-xml-block.md
new file mode 100644
index 000000000..e4d5d08ac
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-structure-to-xml-block.md
@@ -0,0 +1,368 @@
+---
+title: "Convert Structure To Xml"
+linkTitle: "Convert Structure To Xml"
+description: "Converts a Structure To Xml."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Xml_ConvertXml_ConvertStructureToXmlBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts a [Structure][Structure Property] to [Xml][Xml Property].
+
+Each top-level [Key][Keys] will be converted using the following rules:
+
+* [Keys][] become [Nodes][Xml Nodes]
+* [Items][] become the values of the corresponding node.
+
+Each inner key will be converted using the following rules:
+
+* Inner keys become inner nodes within their parent node.
+* Items of inner keys become the values of the corresponding inner nodes.
+
+For example:
+
+``` json
+"topLevelNode": {
+ "innerNode" : "innerNodeValue"
+}
+```
+
+will be converted into:
+
+``` xml
+@"
+ innerNodeValue
+"
+```
+
+## Examples
+
+### Convert a Structure To Xml
+
+This example will convert the [Structure][Structure Property] below to its [Xml][Xml Property] representation.
+
+``` json
+{
+ "node1" : "1",
+ "node2" : "2",
+ "node3" : "3"
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Structure][Structure Property] | `($)Structure`, with value `{{ "node1" : "1"}, {"node2" : "2"}, {"node3" : "3"}}` | `($)Structure` is a variable of type [Structure][] |
+| [Xml][Xml Property] | `($)Xml`, with no value | `($)Xml` is a variable that will be set to a [String][] value. |
+
+#### Result
+
+Converting:
+
+``` json
+{
+ "node1" : "1",
+ "node2" : "2",
+ "node3" : "3"
+}
+```
+
+to [Xml][Xml Property] results in the variable `($)Xml` being updated to the following:
+
+``` xml
+@"
+ 1
+ 2
+ 3
+"
+```
+
+* The `"Cortex_DataTypes_Dictionaries_Structure"` root node is added as there is no single top-level key.
+* The `"node1"` [Key][Keys] is converted into a child node of `"Cortex_DataTypes_Dictionaries_Structure"` with its corresponding [Item][Items] as the value.
+* The `"node2"` [Key][Keys] is converted into a child node of `"Cortex_DataTypes_Dictionaries_Structure"` with its corresponding [Item][Items] as the value.
+* The `"node3"` [Key][Keys] is converted into a child node of `"Cortex_DataTypes_Dictionaries_Structure"` with its corresponding [Item][Items] as the value.
+
+***
+
+### Convert a Complex Structure to Xml
+
+This example will convert the [Structure][Structure Property] below to its [Xml][Xml Property] representation. This scenario is unlikely unless [Xml][Xml Property] has been converted to a [Structure][Structure Property] and is being [Round-Tripped][Round Tripping].
+
+``` json
+{
+ "topLevelKey": {
+ "@topLevelAttribute" : "exampleAttribute",
+ "innerKey" : {
+ "@innerNodeAttribute" : "exampleInnerNodeAttribute",
+ "nestedKey": "nested key text",
+ "#text": "inner key text"
+ },
+ "id": [
+ 1,
+ 2,
+ 3
+ ],
+ }
+}
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Structure][Structure Property] | `($)Structure`, with value`"{"topLevelNode": {"@topLevelAttribute" : "exampleAttribute", "innerNode" : { "@innerNodeAttribute" : "exampleInnerNodeAttribute", "nestedNode": "nested node text", "#text": "inner node text" }, "id": [ 1, 2, 3 ], } }"` | `($)Structure` is a variable of type [Structure][] |
+| [Xml][Xml Property] | `($)Xml`, with no value | `($)Xml` is a variable that will be set to a [String][] value. |
+
+#### Result
+
+Converting:
+
+``` json
+{
+ "topLevelKey": {
+ "@topLevelAttribute" : "exampleAttribute",
+ "innerKey" : {
+ "@innerNodeAttribute" : "exampleInnerNodeAttribute",
+ "nestedKey": "nested key text",
+ "#text": "inner key text"
+ },
+ "id": [
+ 1,
+ 2,
+ 3
+ ],
+ }
+}
+```
+
+to [Xml][Xml Property] results in the variable `($)Xml` being updated to the following:
+
+``` xml
+@"
+
+ nested key text
+ inner key text
+
+ 1
+ 2
+ 3
+"
+```
+
+* The key `"topLevelKey"` is converted into the `"topLevelKey"` node.
+* The key `"@topLevelAttribute"` is converted into the `"topLevelAttribute"` attribute with its corresponding item as the value.
+* The key `"innerKey"` is converted into the `"innerKey"` node.
+* The key `"@innerNodeAttribute"` is converted into the `"innerNodeAttribute"` attribute with its corresponding item as the value.
+* The key `"nestedKey"` is converted into the `"nestedKey"` node with its corresponding item as the value.
+* The key `"#text"` is converted into the value of the `"innerKey"` key with its corresponding item as the value.
+* The key `"id"` is converted into three `"id"` nodes with each corresponding item as their values.
+
+***
+
+## Properties
+
+### Structure
+
+The [Structure][Structure Property] to convert into [Xml][Xml Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Structure][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Structure` with no value |
+
+### Xml
+
+The [Xml][Xml Property] that has been converted from the [Structure][Structure Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Xml` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Structure][Structure Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when [Structure][Structure Property] does not contain any items. |
+| [XmlSerializationException][] | Thrown when [Structure][Structure Property] has a key that is an empty string. |
+|| Thrown when the [Structure][Structure Property] includes an invalid xml declaration key (e.g. `"?xml"` can only accept the following attributes: `"@version"`, `"@encoding"` and `"@standalone"`.) or an invalid document type definition key (e.g. `"!DOCTYPE"` can only accept the following attributes: `"@name"`, `"@public"`, `"@system"` and `"@internalSubset"`). |
+|| Thrown when the [Structure][Structure Property] includes an xml declaration key (e.g. `"?xml"`) with an attribute that has an invalid [Basic Data Type][Basic Data Types]. (e.g. `Key: "@version", Value: false`, where `"@version"` must be a numeric value). |
+|| Thrown when the [Structure][Structure Property] includes a document type definition key (e.g. `"!DOCTYPE"`) that has an attribute with an invalid [Basic Data Type][Basic Data Types]. (e.g. `Key: "@name", Value: 22`, where `"@name"` must be a text value). |
+|| Thrown when the [Structure][Structure Property] includes an attribute key with a [Complex Data Type][Complex Data Types] as a value. (e.g. `Key: "@name", Value: new UserCredentials{...}`). |
+
+## Remarks
+
+### Attributes
+
+If a [Node][Xml Nodes] requires an attribute, the attribute is defined by a [Key][Keys] where the key is the attribute name with an `"@"` before it and the [Item][Items] is the attribute data, for example:
+
+``` json
+{
+ "node": {
+ "@attribute": "Attribute Value",
+ "innernode": "Inner Node Value"
+ }
+}
+```
+
+The [Structure][Structure Property] example above would be converted to the following [Xml][Xml Property].
+
+``` xml
+@"
+ Inner Node Value
+"
+```
+
+### Basic Data Types within Attribute Keys
+
+Attribute keys may only have [Basic Data Types][] as shown in the example below. An [XmlSerializationException][] will be thrown if [Complex Data Type][Complex Data Types] is used as an attribute key.
+
+``` json
+{
+ "node": {
+ "@validAttribute": "Attribute Value",
+ "@invalidAttribute": new ComplexDataType("Invalid"),
+ }
+}
+```
+
+### Key Restrictions
+
+An Xml declaration key (e.g. `"?xml"`) can only accept the following attributes: `"@version"`, `"@encoding"` and `"@standalone"`.
+
+A document type definition key (e.g. `"!DOCTYPE"`) can only accept the following attributes: `"@name"`, `"@public"`, `"@system"` and `"@internalSubset"`.
+
+`"$id"`, `"$ref"`, `"$type"`, `"$value"` and `"values"` are reserved words and should not be used as keys.
+
+### Text Nodes
+
+If a key contains a structure as its item, the inner keys are converted into [Nodes][Xml Nodes] with their corresponding items as the values. The key `"#text"` is converted into value of its parent node.
+
+``` json
+{
+ "node": {
+ "innerNode": {
+ "@attrubute": "attributeValue",
+ "#text": "Inner Node Value"
+ },
+ "#text": "Node Value"
+ }
+}
+```
+
+The [Structure][Structure Property] example above would be converted to the following [Xml][Xml Property].
+
+``` xml
+@"
+
+ Inner Node Value
+
+ Node Value
+"
+```
+
+### Duplicate Nodes at the Same Level
+
+If there are multiple duplicate nodes at the same level, they are defined using a [Key][Keys] where the key is the duplicated node name and the [Item][Items] is a list of each of the corresponding duplicate node's values, for example:
+
+``` json
+{
+ "node": {
+ "duplicateNode": ["First Duplicate Node", "Second Duplicate Node"],
+ "distinctNode": "Distinct Node"
+ }
+}
+```
+
+The [Structure][Structure Property] example above would be converted to the following [Xml][Xml Property].
+
+``` xml
+@"
+
+ First Duplicate Node
+
+
+ Second Duplicate Node
+
+
+ Distinct Node
+
+"
+```
+
+### Using Non-Alphanumeric Symbols within Node Names
+
+Any non-alphanumeric symbol (i.e. symbols that are not `"0"` to `"9"`, `"a"` to `"z"`, or `"A"` to `"Z"`) will be converted to their respective Unicode values when used within a [Key][Keys]. For example, `"!"` and `"&"` are both non-alphanumeric symbols and would be converted to `"x0021"` and `"x0026"` respectively.
+
+For more information on characters and their Unicode values please see [Character Sets][]
+
+### Round-tripping
+
+It should be possible to pass the [Xml][Xml Property] created by this block to the [Convert Xml To Structure][] block, and then pass the [Structure][Structure Property] created by the [Convert Xml To Structure][] block back to this block, as long all values within the [Xml][Xml Property] are [Strings][String]; this is called round-tripping.
+
+### Node
+
+`""` is added as a root node when the [Structure][Structure Property] has more than one top-level key to ensure that valid [Xml][Xml Property] is produced.
+
+``` json
+{
+ "node1" : "1",
+ "node2" : "2",
+ "node3" : "3"
+}
+```
+
+The [Structure][Structure Property] example above would be converted to the following [Xml][Xml Property].
+
+``` xml
+@"
+ 1
+ 2
+ 3
+"
+```
+
+[Convert Xml To Structure]: {{< url path="Cortex.Reference.Blocks.Xml.ConvertXml.ConvertXmlToStructure.MainDoc" >}}
+
+[Structure Property]: {{< ref "#structure" >}}
+[Xml Property]: {{< ref "#xml" >}}
+[Round Tripping]: {{< ref "#round-tripping" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[XmlSerializationException]: {{< url path="Cortex.Reference.Exceptions.Xml.XmlSerializationException" >}}
+
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Items]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Items.MainDoc" >}}
+[Complex Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.ComplexDataTypes" >}}
+[Basic Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.BasicDataTypes" >}}
+
+[Character Sets]: {{< url path="W3.CharacterSets" >}}
+[Xml Nodes]: {{< url path="W3.XmlNodes" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-xml-to-structure-block.md b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-xml-to-structure-block.md
new file mode 100644
index 000000000..13c1f0eae
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Blocks/xml/convert-xml/convert-xml-to-structure-block.md
@@ -0,0 +1,332 @@
+---
+title: "Convert Xml To Structure"
+linkTitle: "Convert Xml To Structure"
+description: "Converts Xml to a Structure."
+---
+
+{{< figure src="/blocks/Cortex_Blocks_Xml_ConvertXml_ConvertXmlToStructureBlock.png" alt="Icon" class="block-icon" >}}
+
+# {{% param title %}}
+
+
+
+## Description
+
+Converts [Xml][Xml Property] to a [Structure][Structure Property].
+
+Each top-level [Node][Xml Nodes] will be converted using the following rules:
+
+* Node names become [Keys][]
+* Node values become [Items][]
+
+Each inner [Node][Xml Nodes] will be converted using the following rules:
+
+* Inner node names become [Keys][] within the top-level node's [Item][Items]
+* Inner node values become the corresponding [Item][Items] for their [Key][Keys]
+
+For example:
+
+``` xml
+@"
+ innerNodeValue
+"
+```
+
+will be converted into:
+
+``` json
+"topLevelNode": {
+ "innerNode" : "innerNodeValue"
+}
+```
+
+## Examples
+
+### Convert Xml to a Structure
+
+This example will convert the [Xml][Xml Property] below to its [Structure][Structure Property] representation.
+
+``` xml
+@"
+
+ nested node text
+ inner node text
+
+ 1
+ 2
+ 3
+"
+```
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Xml][Xml Property] | `($)Xml`, with value `"nested node textinner node text123"` | `($)Xml` is a variable of type [String][] |
+| [Structure][Structure Property] | `($)Structure`, with no value | `($)Structure` is a variable that will be set to a [Structure][] value |
+
+#### Result
+
+Converting:
+
+``` xml
+@"
+
+ nested node text
+ inner node text
+
+ 1
+ 2
+ 3
+"
+```
+
+ to a [Structure][Structure Property] results in the variable `($)Structure` being updated to the following:
+
+``` json
+{
+ "topLevelNode": {
+ "@topLevelAttribute" : "exampleAttribute",
+ "innerNode" : {
+ "@innerNodeAttribute" : "exampleInnerNodeAttribute",
+ "nestedNode": "nested node text",
+ "#text": "inner node text"
+ },
+ "id": [
+ 1,
+ 2,
+ 3
+ ],
+ }
+}
+```
+
+* The node `"topLevelNode"` is converted into the `"topLevelNode"` key.
+* The attribute `"topLevelAttribute"` is converted into the `"@topLevelAttribute"` key with its corresponding value as the item.
+* The node `"innerNode"` is converted into the `"innerNode"` key.
+* The attribute `"innerNodeAttribute"` is converted into the `"@innerNodeAttribute"` key with its corresponding value as the item.
+* The node `"nestedNode"` is converted into the `"nestedNode"` key with its corresponding value as the item.
+* The value of `"innerNode"` is converted into the `"#text"` key with its corresponding value as the item.
+* The three `"id"` nodes are converted into a single `"id"` key with each corresponding value being an entry of the item list.
+
+***
+
+### Convert Round-tripped Xml to a Structure
+
+This example will convert the [Xml][Xml Property] below to its [Structure][Structure Property] representation.
+This example will only occur when a [Structure][Structure Property] is Converted to [Xml][Xml Property] using the [Convert Structure To Xml][] block and is then converted again using this block. This is called [Round-Tripping][].
+
+#### Properties
+
+| Property | Value | Notes |
+|--------------------|---------------------------|------------------------------------------|
+| [Xml][Xml Property] | `($)Xml`, with value `"123"` | `($)Xml` is a variable of type [String][] |
+| [Structure][Structure Property] | `($)Structure`, with no value | `($)Structure` is a variable that will be set to a [Structure][] value |
+
+#### Result
+
+Converting:
+
+``` xml
+@"
+ 1
+ 2
+ 3
+"
+```
+
+to a [Structure][Structure Property] results in the variable `($)Structure` being updated to the following:
+
+``` json
+{
+ "node1" : "1",
+ "node2" : "2",
+ "node3" : "3"
+}
+```
+
+* The `"Cortex_DataTypes_Dictionaries_Structure"` root node is removed and the child nodes are all at the root level.
+* The `"node1"` [Node][Xml Nodes] is converted into a [Key][Keys] of `"node1"` with its corresponding value as the [Item][Items].
+* The `"node2"` [Node][Xml Nodes] is converted into a [Key][Keys] of `"node2"` with its corresponding value as the [Item][Items].
+* The `"node3"` [Node][Xml Nodes] is converted into a [Key][Keys] of `"node3"` with its corresponding value as the [Item][Items].
+
+***
+
+## Properties
+
+### Xml
+
+The [Xml][Xml Property] to convert into a [Structure][Structure Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [String][] |
+| Property Type | [Input][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Xml` with no value |
+
+### Structure
+
+The [Structure][Structure Property] that has been converted from the [Xml][Xml Property].
+
+| | |
+|--------------------|---------------------------|
+| Data Type | [Structure][] |
+| Property Type | [Output][] |
+| Is [Advanced][] | `false` |
+| Default Editor | [Variable][] |
+| Default Value | `($)Structure` with no value |
+
+## Exceptions
+
+The exceptions thrown by the block can be found below:
+
+| Name | Description |
+|----------|----------|
+| [PropertyNullException][] | Thrown when [Xml][Xml Property] is `null`. |
+| [PropertyEmptyException][] | Thrown when [Xml][Xml Property] is empty (i.e. `""`). |
+| [XmlSerializationException][] | Thrown when the [Xml][Xml Property] is not valid (i.e the Xml contains an ampersand symbol or is missing a root node). |
+
+## Remarks
+
+### Attributes
+
+If a [Node][Xml Nodes] has an attribute, the attribute is converted to a [Key][Keys] where the key is the attribute name with an `"@"` before it and the value is the attribute data, for example:
+
+``` xml
+@"
+ Inner Node Value
+"
+```
+
+The [Xml][Xml Property] example above would be converted to the following [Structure][Structure Property]
+
+``` json
+{
+ "node": {
+ "@attribute": "Attribute Value",
+ "innernode": "Inner Node Value"
+ }
+}
+```
+
+### Text Nodes
+
+If a node contains a value and inner nodes or attributes, the inner nodes and attributes are converted into [Keys][] with their corresponding values as the [Items][]. The value of the node is converted into the `"#text"` key with its value as the item.
+
+``` xml
+@"
+
+ Inner Node Value
+
+ Node Value
+"
+```
+
+The [Xml][Xml Property] example above would be converted to the following [Structure][Structure Property].
+
+``` json
+{
+ "node": {
+ "innerNode": {
+ "@attrubute": "attributeValue",
+ "#text": "Inner Node Value"
+ },
+ "#text": "Node Value"
+ }
+}
+```
+
+### Duplicate Nodes at the Same Level
+
+If a node contains duplicate nodes at the same level, they are converted into a [Key][Keys] where the key is the duplicated node name and the [Item][Items] is a list of each of the corresponding duplicate node's values, for example:
+
+``` xml
+@"
+
+ First Duplicate Node
+
+
+ Second Duplicate Node
+
+
+ Distinct Node
+
+"
+```
+
+The [Xml][Xml Property] example above would be converted to the following [Structure][Structure Property].
+
+``` json
+{
+ "node": {
+ "duplicateNode": ["First Duplicate Node", "Second Duplicate Node"],
+ "distinctNode": "Distinct Node"
+ }
+}
+```
+
+### Using Non-Alphanumeric Symbols within Node Names
+
+Any non-alphanumeric symbol (i.e. symbols that are not `"0"` to `"9"`, `"a"` to `"z"`, or `"A"` to `"Z"`) will be converted to their respective Unicode values when used within a node name. For example, `"!"` and `"&"` are both non-alphanumeric symbols and would be converted to `"x0021"` and `"x0026"` respectively.
+
+For more information on characters and their Unicode values please see [Character Sets][]
+
+### Round-tripping
+
+It should be possible to pass the [Structure][Structure Property] created by this block to the [Convert Structure To Xml][] block, and then pass the [Xml][Xml Property] created by the [Convert Structure To Xml][] block back to this block, as long all values within the [Xml][Xml Property] are [Strings][String]; this is called round-tripping.
+
+### Node
+
+The [Convert Structure To Xml][] adds `""` as a root node when the structure has more than one top-level key to ensure that valid [Xml][Xml Property] is produced.
+
+When the `""` root node is converted from [Xml][Xml Property] to a [Structure][Structure Property] the root node is removed and any inner nodes become the top-level keys.
+
+``` xml
+@"
+ 1
+ 2
+ 3
+"
+```
+
+The [Xml][Xml Property] example above would be converted to the following [Structure][Structure Property].
+
+``` json
+{
+ "node1" : "1",
+ "node2" : "2",
+ "node3" : "3"
+}
+```
+
+This example will only occur when a [Structure][Structure Property] is Converted to [Xml][Xml Property] and is then converted again using this block. This is called [Round-Tripping][].
+
+[Convert Structure To Xml]: {{< url path="Cortex.Reference.Blocks.Xml.ConvertXml.ConvertStructureToXml.MainDoc" >}}
+
+[Structure Property]: {{< ref "#structure" >}}
+[Xml Property]: {{< ref "#xml" >}}
+[Round-Tripping]: {{< ref "#round-tripping" >}}
+
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+
+[PropertyEmptyException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyEmptyException.MainDoc" >}}
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[XmlSerializationException]: {{< url path="Cortex.Reference.Exceptions.Xml.XmlSerializationException" >}}
+
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Keys]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Keys.MainDoc" >}}
+[Items]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.Items.MainDoc" >}}
+
+[Character Sets]: {{< url path="W3.CharacterSets" >}}
+[Xml Nodes]: {{< url path="W3.XmlNodes" >}}
+
+[Literal]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/_index.md b/content/en/docs/2026.3/Reference/Concepts/_index.md
new file mode 100644
index 000000000..38ecb3d55
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Concepts"
+linkTitle: "Concepts"
+description: "This section includes all reference documentation for concepts required to use {{% ctx %}}."
+weight: 1
+---
+
+
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/_index.md
new file mode 100644
index 000000000..ae9f93d86
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Fundamentals"
+linkTitle: "Fundamentals"
+description: "Fundamental concepts when working with {{% ctx %}}."
+weight: 1
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/_index.md
new file mode 100644
index 000000000..40a8f4526
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Blocks"
+linkTitle: "Blocks"
+description: "Information regarding what a block is, block properties and their editors, and handling exceptions thrown by a block."
+weight: 200
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/_index.md
new file mode 100644
index 000000000..deaf058a3
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Block Properties"
+linkTitle: "Block Properties"
+description: "Information regarding what a block property is, the types of properties, the different property editors, and block properties that are common or advanced."
+weight: 100
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/advanced-properties.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/advanced-properties.md
new file mode 100644
index 000000000..70375cbf6
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/advanced-properties.md
@@ -0,0 +1,71 @@
+---
+title: "Advanced Properties"
+linkTitle: "Advanced Properties"
+description: "Information regarding properties that do not normally need to be configured but allow for more advanced scenarios."
+weight: 300
+---
+
+# {{% param title %}}
+
+## Summary
+
+Some [blocks][All Blocks] have advanced properties that do not normally need to be configured but allow for more advanced scenarios (e.g. A block to send emails would have advanced properties for specifying things like cc, bcc, attachments etc.). Advanced properties may have explicit default values or will be initialised with values that allow the [block][] to run without configuration.
+
+All advanced properties are hidden by default and can be shown by [Toggling Advanced Properties][], their values will be used in the [block's][block] execution regardless of whether they are hidden or shown.
+
+## Toggling Advanced Properties
+
+All advanced properties can be shown or hidden using the Show/Hide Advanced Properties button found on the top right of the [Property Editor][]. This button is used to toggle whether properties are shown or hidden.
+
+{{< figure src="/images/set-variable/set-variable-block-timeout.svg" >}}
+
+## Finding Advanced Properties
+
+A property is defined as advanced within the documentation of a [Block][All Blocks] or [Data Type][].
+
+Information regarding which properties are advanced for a [Block][All Blocks] can be found in the "Properties" section. The table within each property in the relevant documentation will have an "Is Advanced" row stating whether the property is advanced or not.
+
+Information regarding which properties are advanced for a [Data Type][] can be found in the "Remarks" section under "Advanced Properties" in the relevant documentation for that [Data Type][].
+
+## Remarks
+
+### Known Limitations
+
+#### Toggling advanced properties is not persisted between blocks
+
+Currently, when advanced properties are shown when editing a [block][] the advanced toggle state is not persisted when switching between [blocks][block].
+
+In future this limitation may be removed.
+
+#### Toggling advanced properties shows or hides all advanced properties
+
+Currently, it is not possible to show or hide individual advanced properties.
+
+In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Blocks][]
+- [Block Properties][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Toggling Advanced Properties]: {{< ref "#toggling-advanced-properties" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+
+[Property Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.PropertyEditor" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[Data Type]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/common-properties.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/common-properties.md
new file mode 100644
index 000000000..1b4dcf3a8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/common-properties.md
@@ -0,0 +1,154 @@
+---
+title: "Common Properties"
+linkTitle: "Common Properties"
+description: "Information regarding properties that are common to all or most blocks."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+There are a number of properties that are common across all or most [blocks][All Blocks].
+
+These properties include:
+
+- [Description Property][]
+- [Semaphore Property][]
+- [Run As Property][]
+- [Block Timeout Property][]
+
+## Description Property
+
+The Description property is available on all [blocks][All Blocks]. It defaults to the name of the block and can be used to describe the action or function the block is performing. Any text entered in the Description property is displayed next to the [block's][block] icon on the [workspace][].
+
+{{< figure src="/images/set-variable/set-variable-description.svg" >}}
+
+## Semaphore Property
+
+The Semaphore property is an [advanced property][Advanced Properties] available on most [blocks][All Blocks]. It is used to restrict the number of [executions][] that can execute the [block][WhatIsBlock] at any one time.
+
+The default value of `null` indicates that there is no [semaphore][].
+
+The Semaphore property has the following sub-properties:
+
+- [Scope][SemaphoreScope], which defaults to:
+ - [Tenant][]: `ScopeOption.Current`.
+ - [System][]: `ScopeOption.Current`.
+ - [Package][]: `ScopeOption.Current`.
+ - [Flow][]: `ScopeOption.All`.
+- [Name][SemaphoreName], which defaults to an empty string (i.e. `""`).
+- [ConcurrencyLimit][SemaphoreConcurrencyLimit], which defaults to 0.
+- [Queue][SemaphoreQueue], which defaults to `null`.
+ - [Priority][QueuePriority], which defaults to 0.
+ - [QueueTimeout][], which defaults to `null`.
+
+{{< figure src="/images/workspace/workspace-block-semaphore.svg" >}}
+
+## Run As Property
+
+The Run As property is an [advanced property][Advanced Properties] available on most [blocks][All Blocks]. It is used to execute the [block][] as a specified user (using a [UserCredentials][]), honouring the user's permissions and other user settings. This is required if an action needs to be performed as a particular user (e.g. reading/writing files that only that user has access to).
+
+Once the [block][] has finished executing, the next block to execute will run as:
+
+- The user specified in it's Run As property, if set.
+- Otherwise, the user specified in it's closest ancestor block with the Run As property set.
+- Otherwise, the user the [Execution Service][] is running as; typically this is Network Service.
+
+The default value of `null` also results in the [block][] executing as the user the [Execution Service][] is running as.
+
+If [UserCredentials][] has an invalid domain, username, password or [LogonType][UserCredentialsLogonType], a [RunAsException][] will be thrown when the [block][] is executed.
+
+If [UserCredentials][] has a `null` username or password, a [PropertyNullException][] will be thrown when the [block][] is executed.
+
+By default, the type of logon method used to authenticate the Run As user is `LogonType.Network`; this works for most scenarios. For scenarios that require a different type of logon method (e.g. connecting to a remote database), the correct [LogonType][] (e.g. `LogonType.NewCredentials`) can be specified as part of the [UserCredentials][].
+
+{{< figure src="/images/set-variable/set-variable-run-as.svg" >}}
+
+## Block Timeout Property
+
+The Block Timeout property is an [advanced property][Advanced Properties] available on most [blocks][All Blocks]. It is used to set a duration of time (using a [TimePeriod][]) that the [block][] must complete its action within, otherwise a [BlockTimeoutException][] is raised.
+
+The default value of `null`, or a [TimePeriod][] of `0` seconds, indicates that there is no timeout.
+
+Negative [TimePeriod][] values will cause an [InvalidBlockTimeoutException][] to be raised when the block is executed.
+
+{{< figure src="/images/set-variable/set-variable-block-timeout.svg" >}}
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Workspaces][]
+- [Blocks][]
+- [Advanced Properties][]
+- [Exceptions][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### Related Data Types
+
+- [String][]
+- [TimePeriod][]
+
+### Related Exceptions
+
+- [BlockTimeoutException][]
+- [InvalidBlockTimeoutException][]
+- [PropertyNullException][]
+- [RunAsException][]
+
+### External Documentation
+
+None
+
+[Description Property]: {{< ref "#description-property" >}}
+[Block Timeout Property]: {{< ref "#block-timeout-property" >}}
+[Semaphore Property]: {{< ref "#semaphore-property" >}}
+[Run As Property]: {{< ref "#run-as-property" >}}
+
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Advanced Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[SemaphoreScope]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Scope" >}}
+[SemaphoreName]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Name" >}}
+[SemaphoreConcurrencyLimit]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.ConcurrencyLimit" >}}
+[SemaphoreQueue]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Queue" >}}
+[QueuePriority]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.QueueSettings.Priority" >}}
+[QueueTimeout]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.QueueSettings.QueueTimeout" >}}
+[Tenant]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Tenant" >}}
+[System]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.System" >}}
+[Package]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Package" >}}
+[Flow]: {{< url path="Cortex.Reference.DataTypes.Scopes.ScopeDefinition.Flow" >}}
+[Semaphore]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Concurrency.Semaphores.WhatIsASemaphore.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[WhatIsBlock]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Execution Service]: {{< url path="Cortex.Guides.CortexInnovation.ExecutionApplication.Services.ExecutionService.MainDoc" >}}
+[LogonType]: {{< url path="Cortex.Reference.DataTypes.Credentials.LogonType.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+[UserCredentials]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.MainDoc" >}}
+
+[UserCredentialsLogonType]: {{< url path="Cortex.Reference.DataTypes.Credentials.UserCredentials.LogonType" >}}
+
+[BlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.BlockTimeoutException.MainDoc" >}}
+[InvalidBlockTimeoutException]: {{< url path="Cortex.Reference.Exceptions.Flows.Blocks.InvalidBlockTimeoutException.MainDoc" >}}
+
+[PropertyNullException]: {{< url path="Cortex.Reference.Exceptions.Common.Property.PropertyNullException.MainDoc" >}}
+[RunAsException]: {{< url path="Cortex.Reference.Exceptions.Impersonation.RunAsException.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/_index.md
new file mode 100644
index 000000000..c3dc56225
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Property Editors"
+linkTitle: "Property Editors"
+description: "Information regarding the Literal, Variable, and Expression Editors."
+weight: 100
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/expression-editor.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/expression-editor.md
new file mode 100644
index 000000000..16294973d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/expression-editor.md
@@ -0,0 +1,915 @@
+---
+title: "Expression Editor"
+linkTitle: "Expression Editor"
+description: "Information regarding using the Expression Editor to create literal values, expressions, or use variables."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Expression Editor is the most powerful [property editor][] and can accept [literal values][], [expressions][], and [variables][].
+
+{{< figure src="/images/set-variable/set-variable-expression-empty.PNG" >}}
+
+## Literal Values
+
+A literal is an explicit value that is not calculated during the execution of the flow. A literal can be any of the following data types:
+
+- [String][String literal]
+- [Char][Char literal]
+- [Int32][Int32 literal]
+- [Int64][Int64 literal]
+- [Double][Double literal]
+- [Single][Single literal]
+- [Boolean][Boolean literal]
+- [Object][Object literal]
+- [Dictionary][Dictionary literal]
+- [Structure][Structure literal]
+- [List][List literal]
+
+### String literal
+
+{{< figure src="/images/set-variable/set-variable-expression-string.PNG" >}}
+
+[String][String] literals are surrounded by double quotes. For example:
+
+```csharp
+"Example String"
+```
+
+The example above becomes:
+
+```text
+Example String
+```
+
+Double quotes that form part of the [string][String], along with the back-slash character and any unicode character codes or hexadecimal character codes, must be escaped by a back-slash character. For example:
+
+```csharp
+"He said \"Come here\x0021\""
+```
+
+The example above becomes:
+
+```text
+He said "Come here!"
+```
+
+For verbatim [string][String] literals, double quotes that form part of the [string][String] literal must be duplicated to give a single double quote character. For example:
+
+```csharp
+@"He said ""Come here!"""
+```
+
+The example above becomes:
+
+```text
+He said "Come here!"
+```
+
+For interpolated [strings][String], [variables][] or [expressions][] are surrounded by single curly braces. For example:
+
+```csharp
+$"He said \"Come here {($)Name}!\""
+```
+
+For further information on interpolated strings using [variables][] or [expressions][] see [String expressions][]
+
+In the case of interpolated verbatim [string][String] literals, double curly braces are not interpreted literally; they produce a single curly brace character. For example:
+
+```csharp
+$@"This is a single square brace ""["", and this is a single curly brace ""{{"""
+```
+
+The example above becomes:
+
+```text
+This is a single square brace "[", and this is a single curly brace "{"
+```
+
+For further information, see [String Literals][]
+
+### Char literal
+
+{{< figure src="/images/set-variable/set-variable-expression-char.PNG" >}}
+
+Char literals are single characters; they are surrounded by single quotes. For example:
+
+```csharp
+'A'
+'\u0041'
+```
+
+The example above becomes:
+
+```text
+'A'
+'A'
+```
+
+For further information, [Char Literals][]
+
+### Int32 literal
+
+{{< figure src="/images/set-variable/set-variable-expression-int.PNG" >}}
+
+If an integer literal value is greater than or equal to [Int32.MinValue][] or less than or equal to [Int32.MaxValue][], then it will be of type [Int32][]
+
+```csharp
+1234
+```
+
+If an integer literal value is less than [Int32.MinValue][] or greater than [Int32.MaxValue][], then it will be of type [Int64][].
+
+For further information, see [Integer Literals][].
+
+### Int64 literal
+
+{{< figure src="/images/set-variable/set-variable-expression-int64.PNG" >}}
+
+If an integer literal value is less than [Int32.MinValue][] or greater than [Int32.MaxValue][], then it will be of type [Int64][].
+
+```csharp
+2147483648
+```
+
+```csharp
+1234l
+1234L
+```
+
+For further information, see [Integer Literals][].
+
+### Double literal
+
+{{< figure src="/images/set-variable/set-variable-expression-double.PNG" >}}
+
+By default, floating point literals are of type [Double][Double].
+
+```csharp
+1234.456
+```
+
+The suffix `d` or `D` can used to create a floating point literal of type [Double][Double], but is unnecessary.
+
+```csharp
+1234.456d
+1234.456D
+```
+
+For further information, see [Real Literals][].
+
+### Single literal
+
+{{< figure src="/images/set-variable/set-variable-expression-single.PNG" >}}
+
+If it is necessary to create an floating point literal of type [Single][] with a value greater than or equal to [Single.MinValue][] or less than or equal to [Single.MaxValue][], then the floating point literal must be suffixed by the character `f` or `F`. For example:
+
+```csharp
+1234.456f
+1234.456F
+```
+
+For further information, see [Real Literals][].
+
+### Boolean literal
+
+{{< figure src="/images/set-variable/set-variable-expression-boolean.PNG" >}}
+
+A [Boolean][] literal represents a truth-value of either `true` or `false`.
+
+```json
+true or false
+```
+
+For further information, see [Boolean Literals][].
+
+### Object literal
+
+Currently, creating an object using literal syntax is not supported.
+
+### Dictionary literal
+
+Currently, creating a dictionary using literal syntax is not supported; any attempt to make a dictionary using literal syntax will create a [Structure][] instead.
+
+### Structure literal
+
+{{< figure src="/images/set-variable/set-variable-expression-structure.PNG" >}}
+
+[Structures][Structure] are a special type of [Dictionary][] that always have [string][String] keys.
+
+```json
+{
+ "Name1" : "",
+ "Name2" : 1,
+ "Name3" : true,
+ "Name4" : {},
+ "Name5" : [],
+ "Name6" : null
+}
+```
+
+They differ from a [Dictionary][] in the syntax used for accessing the item:
+
+- [Dictionary][] items can be accessed using [Index expressions][]
+- [Structure][] items can be accessed using [Property expressions][] or [Index expressions][]
+
+### List literal
+
+{{< figure src="/images/set-variable/set-variable-expression-list.PNG" >}}
+
+A [List][] is an object that consists of a number of ordered items that can be of any [data type][Data Type].
+
+```json
+[
+ "Example String",
+ 1,
+ true,
+ {},
+ [],
+ null
+]
+```
+
+[Lists][List] may be heterogeneous, where the items may be of different [data types][Data Type], or homogeneous, when the items are all of the same [data type][Data Type].
+
+## Variables
+
+{{< figure src="/images/set-variable/set-variable-expression-variable.PNG" >}}
+
+[Variables][Variables Concept] are named containers for storing values of any [data type][Data Type]; a [variable's][Variables Concept] value can be read, updated, replaced, or removed using variable syntax; where the variable name is prefixed with `($)` (e.g. `($)VariableName`).
+
+Variables can be used within [expressions][].
+
+## Expressions
+
+An expression is a combination of [operands][] (i.e. [variables][], [literals][literal values], calls to [methods][] and [properties][PropertiesC#] exposed on [data types][Data Type]) and [operators][] (i.e. =, +, -, *, /) that will be evaluated when the flow execution reaches the block.
+
+Expressions use the syntax of the [C#][] [programming language][].
+
+Types of expressions:
+
+- [Arithmetic][Arithmetic expressions]
+- [Boolean][Boolean expressions]
+- [Comparison][Comparison expressions]
+- [String][String expressions]
+- [Dictionary][Dictionary expressions]
+- [Structure][Structure expressions]
+- [List][List expressions]
+- [Constructors][Constructor expressions]
+- [Methods][Method expressions]
+- [Properties][Property expressions]
+- [Enums][Enum expressions]
+- [Casting][Casting expressions]
+- [Indexes][Index expressions]
+- [Decomposition][Decomposition expressions] ([output property][Output Properties] only)
+
+### Arithmetic expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-arithmetic.PNG" >}}
+
+The following [operators][] perform arithmetic operations with [operands][] that have numeric values.
+
+In the examples below assume:
+
+- `($)Int1` has been set to `6`
+- `($)Int2` has been set to `3`
+
+| Expression | Result | Notes |
+|---------------------------|--------|-----------|
+| `($)Int1 + ($)Int2` | `9` | Add |
+| `($)Int1 - ($)Int2` | `3` | Subtract |
+| `($)Int1 * ($)Int2` | `18` | Multiply |
+| `($)Int1 / ($)Int2` | `2` | Divide |
+| `($)Int1 % ($)Int2` | `0` | Remainder |
+
+For further information, see [Arithmetic Operators][].
+
+### Boolean expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-boolean-and.PNG" >}}
+
+The following [operators][] perform logical operations with [operands][] that have boolean values.
+
+In the examples below assume:
+
+- `($)Bool1` has been set to `false`
+- `($)Bool2` has been set to `true`
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `($)Bool1 && ($)Bool2` | `false` | AND |
+| `($)Bool2 \|\| ($)Bool1` | `true` | OR |
+| `($)Bool1 ^ ($)Bool2` | `true` | XOR |
+| `!($)Bool1` | `true` | NOT |
+
+For further information, see [Boolean Logical Operators][].
+
+### Comparison expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-comparison.PNG" >}}
+
+The following [operators][] perform comparison operations with [operands][].
+
+In the examples below assume:
+
+- `($)Int1` has been set to `1`
+- `($)Int2` has been set to `2`
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `($)Int1 == ($)Int2` | `false` | Equal |
+| `($)Int1 != ($)Int2` | `true` | Not Equal |
+| `($)Int1 > ($)Int2` | `false` | Greater Than |
+| `($)Int1 >= ($)Int2` | `false` | Greater Than or Equal |
+| `($)Int1 < ($)Int2` | `true` | Less Than |
+| `($)Int1 <= ($)Int2` | `true` | Less Than or Equal |
+
+For further information, see [Equality Operators][], [Comparison Operators][], and [Object Equality][].
+
+### String expressions
+
+There are three types of string expressions:
+
+- [Concatenated Strings][]
+- [Interpolated Strings][]
+- [Verbatim Strings][]
+
+If a data type is used in a string expression that is not a [String][], then it will be [implicitly cast][] to a [String][] as part of the expression.
+
+In all of the examples below assume:
+
+- `($)String1` has been set to `"hello"`
+- `($)String2` has been set to `"world"`
+- `($)Int` has been set to `1234`
+
+#### Concatenated Strings
+
+{{< figure src="/images/set-variable/set-variable-expression-concatenated-string.PNG" >}}
+
+Concatenation is the process of appending one [String][] to the end of another [String][]. You concatenate strings by using the `+` [operator][operators].
+
+| Expression | Result | Notes |
+|---------------------------------------|------------------------------|------------------------------------|
+| `($)String1 + " " + ($)String2` | `"hello world"` | |
+| `($)String1 + " " + ($)Int` | `"hello 1234"` | The variable `($)Int` is [implicitly cast][] to a [String][String] as part of the expression |
+
+For further information, see [String concatenation][].
+
+#### Interpolated Strings
+
+{{< figure src="/images/set-variable/set-variable-expression-interpolated-string.PNG" >}}
+
+Interpolation is the process of inserting expressions and variables into a [String][]. An interpolated string is declared by prefixing the string with the `$` character.
+
+| Expression | Result | Notes |
+|---------------------------------------|------------------------------|------------------------------------|
+| `$"{($)String1} {($)String2}"` | `"hello world"` | |
+| `$"{($)String1} {($)Int}"` | `"hello 1234"` | The variable `($)Int` is [implicitly cast][] to a [String][String] as part of the expression |
+| `$"{($)String1} {($)Int + 1}"` | `"hello 1235"` | The expression `($)Int + 1` is evaluated and the result is [implicitly cast][] to a [String][String] as part of the expression |
+
+For further information, see [String interpolation][].
+
+#### Verbatim Strings
+
+{{< figure src="/images/set-variable/set-variable-expression-verbatim-string.PNG" >}}
+
+A verbatim string identifies that characters within the string should be processed literally, and do not need to be escaped. However, the following exceptions apply:
+
+- In both Verbatim and Interpolated Verbatim strings the double quote character `"` is escaped by prefixing it with another double quote character
+- In Interpolated Verbatim strings the curly brace characters `{` and `}` are escaped by prefixing them with the same curly brace character
+
+| Expression | Result | Notes |
+|---------------------------------------|------------------------------|------------------------------------|
+| `@"c:\programs\file.txt"` | `"c:\\programs\\file.txt"` | |
+| `@"They said ""Hello!"""` | `"They said \"Hello!\""` | The `"` character is escaped|
+| `$@"{{ Some Text }}"` | `"{ Some Text }"` | Interpolated Verbatim String, The curly brace characters are escaped |
+| `$@"c:\programs\{($)String1}.txt"` | `"c:\\programs\\hello.txt"` | Interpolated Verbatim String |
+
+For further information, see [Verbatim string literals][] and [Verbatim String Interpolation][].
+
+### Dictionary expressions
+
+[Dictionaries][Dictionary] can be created using [Constructor expressions][] and their items can be accessed using [Index expressions][].
+
+For examples of creating Dictionaries using constructor expressions, see [Create a Dictionary<TKey, TItem>][Create a Dictionary].
+
+### Structure expressions
+
+[Structures][Structure] can be created using [Constructor expressions][] and their items can be accessed using [Property expressions][] (keys must follow [C# identifier naming rules][]) or [Index expressions][] (keys do not need to follow [C# identifier naming rules][]).
+
+For examples of creating Structures using constructor expressions, see [Create a Structure][].
+
+### List expressions
+
+[Lists][List] can be created using [Constructor expressions][] and their items can be accessed using [Index expressions][].
+
+For examples of creating Lists using constructor expressions, see [Create a List<TItem>][Create a List].
+
+### Constructor expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-constructor.PNG" >}}
+
+Constructors can be used to create a new instance of a [Data Type][]. A [Data Type][] can have multiple constructors, each with different parameters that are used to create the new instance.
+
+Methods on how to create a new instance of a [Data Type][] can be found in the relevant documentation for that [Data Type][Reference Data Types]; information regarding how to create a new [Data Type][] using a constructor can be found in the "Remarks" section under "Create a/an <DataType>" (where <DataType> is replaced by the type's name).
+
+The following examples show two ways a [DateTimeOffset][] can be created using a constructor:
+
+In the examples below assume the variable `($)Year` has been set to `2022`.
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `new DateTimeOffset()` | `0001-01-01T00:00:00+00:00` | `12AM 1st January 0001` with `0` hour UTC offset, the default for a new DateTimeOffset with no parameters |
+| `new DateTimeOffset(($)Year, 7, 1, 14, 0, 0, 0, new TimeSpan(1, 0, 0))` | `2022-07-01T14:00:00+01:00` | `2PM 1st July 2022` with `1` hour UTC offset |
+
+Note that some [Data Types][Data Type] should be created via [literal values][] instead of their constructors, these include:
+
+- [String][String literal]
+- [Char][Char literal]
+- [Int32][Int32 literal]
+- [Int64][Int64 literal]
+- [Double][Double literal]
+- [Single][Single literal]
+- [Boolean][Boolean literal]
+
+For further information, see [Constructors][].
+
+### Method expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-method.PNG" >}}
+
+Methods can be used to execute specific functionality. The methods accessible are defined by the [Data Type][], and information regarding methods can be found in the relevant documentation for that [Data Type][Reference Data Types].
+
+Methods can have parameters passed into them that are then used to execute the functionality, not all methods have parameters. The same method can be defined multiple times, each with different sets of parameters.
+
+In the examples below assume the variable `($)Int` has been set to `1`.
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `TimePeriod.FromSeconds(60)` | `{"Years": 0, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 1, "Seconds": 0, "Milliseconds": 0}` | Method with parameters |
+| `($)Int.ToString()` | `"1"` | Method without parameters |
+| `($)Int.ToString("P0")` | `"100%"` | The `ToString()` method can take parameters in order to format the result. In this case `1` was converted into a percent with zero decimal places |
+
+For further information, see [Methods][Methods External].
+
+### Property expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-properties.PNG" >}}
+
+Properties can be used to read data from and/or write data to a [Data Type][]. The properties accessible are defined by the [Data Type][], and information regarding properties can be found in the relevant documentation for that [Data Type][Reference Data Types].
+
+Properties can be read-write, read-only, or write-only (extremely rare) depending on the access specified by the [Data Type][].
+
+Whilst [Structures][Structure] are [Collections][Collection], they also allow for their keys to be accessed as properties.
+
+In the examples below assume:
+
+- `($)TimePeriod` has been set to `{"Years": 1, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 0, "Milliseconds": 0}`
+- `($)Structure` has been set to `{"FirstKey": 1, "SecondKey": 2}`
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `DateTimeOffset.UtcNow` | `2022-07-01T13:00:00.0000000+00:00` | Read-only property, this only works in [Input Properties][] |
+| `($)TimePeriod.Years` | `1` | Read-write property, this can be used in [Input][Input Properties], [Output][Output Properties], and [InputOutput Properties][]. The result column shows reading the property; writing to the property can be achieved by using any [Output Property][Output Properties]. |
+| `($)Structure.FirstKey` | `1` | Read-write property, this can be used in [Input][Input Properties], [Output][Output Properties], and [InputOutput Properties][]. The result column shows reading the property; writing to the property can be achieved by using any [Output Property][Output Properties].|
+
+For further information, see [Properties][].
+
+### Enum expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-enum.PNG" >}}
+
+[Enum][] data types have a defined set of values, where each value has an associated [String][] name and [Int32][] value. Information regarding values can be found in the relevant documentation for that [Data Type][Reference Data Types].
+
+Values within an [Enum][] can be accessed in the same way as properties or can they can be [cast][Casting expressions] from an [Int32][] value.
+
+In the examples below assume the variable `($)Int` has been set to `6`.
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `DayOfWeek.Sunday` | `DayOfWeek.Sunday` | Where the name is `"Sunday"` and the value is `0` |
+| `(DayOfWeek)($)Int` | `DayOfWeek.Saturday` | [Int32][] cast to an [Enum][]. Where the name is `"Saturday"` and the value is `6` |
+
+For further information, see [Enumeration types][].
+
+### Casting expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-casting.PNG" >}}
+
+[Data Types][Data Type] can be cast to other [Data Types][Data Type] through the use of explicit casting, this can sometimes result in the loss of information when converting to a type that does not store the same amount of information. Information regarding which types a [Data Type][] can cast to can be found in the "Summary" section under "Can be cast to" in the relevant documentation for that [Data Type][Reference Data Types].
+
+[Data Types][Data Type] can be used as other [Data Types][Data Type] through the use of implicit casting, this is an automatic process that requires no expression syntax. Information regarding which types a [Data Type][] can be used as can be found in the "Summary" section under "Can be used as" in the relevant documentation for that [Data Type][Reference Data Types].
+
+In the examples below assume the variable `($)Int` has been set to `6`.
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `(DayOfWeek)($)Int` | `DayOfWeek.Saturday` | [Int32][] cast to an [Enum][]. Where the name is `"Saturday"` and the value is `6` |
+| `(Int16)($)Int` | `6` | An [Int32][] can be cast to an [Int16][] as long as value is from `-32,768` through `32,767` |
+| `(Int32)1.9` | `1` | Casting a [Double][] to an [Int32][] will cause any decimal places to be lost |
+| `($)Int` | `6.0` | When using a block property of type [Double][] an [Int32][] is implicitly cast to [Double][] without any expression syntax |
+
+For further information, see [Explicit Conversions][] and [Implicit Conversions][].
+
+### Index expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-index.PNG" >}}
+
+[Data Types][Data Type] that are [Collections][] or [String][] can have their items accessed using index notation:
+
+- `[0]` gets the first item
+- `[1]` gets the second item
+- `["key"]` gets the item with the key `"key"`.
+
+Ranges can also be used within index notation:
+
+- `[0..3]` gets three items from the first item (inclusively) (i.e. the first, second, and third item)
+- `[^1]` gets the last item
+- `[^2]` gets the second to last item
+- `[..]` gets all items
+- `[..3]` gets three items from the first item (inclusively) (i.e. the first, second, and third item)
+- `[3..]` gets all items from the fourth item (inclusively) (i.e. the fourth to the last item)
+
+For further information on index and range syntax, see [Indices and Ranges][].
+
+In the examples below assume:
+
+- `($)List` has been set to `[1, 2, 3, 4, 5]`
+- `($)Dictionary` of type `Dictionary` has been set to `{"FirstKey": 1, "SecondKey": 2}`
+- `($)Structure` has been set to `{"FirstKey": 1, "SecondKey": [1, 2, 3]}`
+- `($)String` has been set to `"Some Text"`.
+
+| Expression | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `($)List[2]` | `3` | The third item in the list is returned |
+| `($)List[0..2]` | `[1, 2]` | The first and second item in the list are returned |
+| `($)List[^2]` | `4` | The second to last item in the list is returned |
+| `($)List[^2..^0]` | `[4, 5]` | The second to last and the last item in the list are returned |
+| `($)List[1..^1]` | `[2, 3, 4]` | The second item to the second to last item in the list are returned |
+| `($)List[..]` | `[1, 2, 3, 4, 5]` | All items in the list are returned |
+| `($)List[..2]` | `[1, 2]` | The first item and the second item in the list are returned |
+| `($)List[2..]` | `[3, 4, 5]` | The third item to the last item in the list are returned |
+| `($)Dictionary["FirstKey"]` | `1` | The item with the key `"FirstKey"` is returned |
+| `($)Structure["SecondKey"]` | `[1, 2, 3]` | The item with the key `"SecondKey"` is returned |
+| `($)Structure["SecondKey"][0]` | `1` | The first item within the item with key `"SecondKey"` is returned |
+| `($)String[0]` | `'S'` | The first character in the string is returned |
+
+### Decomposition expressions
+
+{{< figure src="/images/set-variable/set-variable-expression-decomposition.PNG" >}}
+
+Decomposition expressions are used to save selected values from an [Output property][Output properties] to multiple [variables][Variables Concept].
+
+{{% alert title="Note" %}}
+This is currently only supported by output properties.
+{{% /alert %}}
+
+Decomposition syntax follows a similar pattern to a `JSON` object:
+
+- each `key` is the property path expression, where `$` is the root of the output value.
+- each `value` is the variable name, prefixed with `($)`.
+
+```json
+{
+ "$.property.firstPath": ($)FirstVariable,
+ "$.property.secondPath": ($)SecondVariable
+}
+```
+
+The examples below assumes that the output value contains the following data:
+
+``` json
+{
+ "company": {
+ "name": "Company Name",
+ "departments": [
+ {
+ "name": "HR",
+ "employees": [
+ {
+ "name": "Joe Blogs",
+ "id": "101"
+ },
+ {
+ "name": "Jane Doe",
+ "id": "102"
+ }
+ ]
+ },
+ {
+ "name": "Admin",
+ "employees": [
+ {
+ "name": "Jane Blogs",
+ "id": "103"
+ },
+ {
+ "name": "Joe Doe",
+ "id": "104"
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+#### Decomposing an object property
+
+To save the `departments` property, the syntax would be:
+
+```json
+{
+ "$.company.departments": ($)ListOfDepartments
+}
+```
+
+In this example, the variable `($)ListOfDepartments` will be set to the following value:
+
+```json
+[
+ {
+ "name": "HR",
+ "employees": [
+ {
+ "name": "Joe Blogs",
+ "id": "101"
+ },
+ {
+ "name": "Jane Doe",
+ "id": "102"
+ }
+ ]
+ },
+ {
+ "name": "Admin",
+ "employees": [
+ {
+ "name": "Jane Blogs",
+ "id": "103"
+ },
+ {
+ "name": "Joe Doe",
+ "id": "104"
+ }
+ ]
+ }
+]
+```
+
+#### Decomposing an item in a list
+
+To save the first department, the syntax would be:
+
+```json
+{
+ "$.company.departments[0]": ($)FirstDepartment
+}
+```
+
+In this example, the variable `($)FirstDepartment` will be set to the following value:
+
+```json
+{
+ "name": "HR",
+ "employees": [
+ {
+ "name": "Joe Blogs",
+ "id": "101"
+ },
+ {
+ "name": "Jane Doe",
+ "id": "102"
+ }
+ ]
+}
+```
+
+#### Decomposing the last item in a list
+
+To save the last `employee` of the first department, the syntax would be:
+
+```json
+{
+ "$.company.departments[0].employees[-1]": ($)LastEmployeeOfFirstDepartment
+}
+```
+
+In this example, the variable `($)LastEmployeeOfFirstDepartment` will be set to the following value:
+
+```json
+{
+ "name": "Jane Doe",
+ "id": "102"
+}
+```
+
+#### Decomposing multiple properties at the same time
+
+To save the `id` and `name` of the first `employee` of the first department, the syntax would be:
+
+```json
+{
+ "$.company.departments[0].employees[0].id": ($)FirstEmployeeId,
+ "$.company.departments[0].employees[0].name": ($)FirstEmployeeName
+}
+```
+
+In this example, the variable `($)FirstEmployeeId` will be set to the following value:
+
+```json
+"101"
+```
+
+And the variable `($)FirstEmployeeName` will be set to the following value:
+
+```json
+"Joe Blogs"
+```
+
+## Remarks
+
+### Known Limitations
+
+#### Cannot Create Objects using Literal Syntax
+
+Currently, creating an object using literal syntax is not supported.
+
+Objects can be created using expressions, for more information see [Constructor expressions][].
+
+#### Cannot Create Dictionaries using Literal Syntax
+
+Currently, creating a dictionary using literal syntax is not supported; any attempt to make a dictionary using literal syntax will create a [Structure][] instead.
+
+Dictionaries can be created using expressions, for more information see [Dictionary expressions][].
+
+#### When using variables of the same name the closest scoped is used
+
+It is possible to create multiple [variables][Variables: What Is a Variable] with the same name in the [Variables Grid][]. When using the same name in different [workspaces][workspace], the variable with the closest scope will be used.
+
+For example:
+
+- `Top-Level` workspace has the variable `($)Variable`
+- `Child-Level` workspace also has the variable `($)Variable`
+
+When executing a block in `Child-Level` that uses `($)Variable`, the variable that is used is the variable defined in `Child-Level`.
+
+This may change in future to allow developers to specifically select which of the variables with the same name is used in this scenario.
+
+## See Also
+
+### Related Concepts
+
+- [Workspaces][]
+- [Literal Editor][]
+- [Variable Editor][]
+- [Variables][Variables Concept]
+- [Data Types][Data Type]
+- [Object Casting][]
+
+### Related Blocks
+
+- [All Blocks][Blocks]
+
+### Related Data Types
+
+- [All Data Types][Reference Data Types]
+
+### External Documentation
+
+- [Boolean Literals][]
+- [Char Literals][]
+- [Integer Literals][]
+- [Real Literals][]
+- [String Literals][]
+- [Arithmetic Operators][]
+- [Boolean Logical Operators][]
+- [Comparison Operators][]
+- [Equality Operators][]
+- [String concatenation][]
+- [String interpolation][]
+- [Verbatim string literals][]
+- [Verbatim String Interpolation][]
+- [Constructors][]
+- [Methods][Methods External]
+- [Properties][]
+- [C# identifier naming rules][]
+- [Enumeration types][]
+- [Explicit Conversions][]
+- [Implicit Conversions][]
+- [Indices and Ranges][]
+
+[literal values]: {{< ref "#literal-values" >}}
+[expressions]: {{< ref "#expressions" >}}
+[variables]: {{< ref "#variables" >}}
+
+[String literal]: {{< ref "#string-literal" >}}
+[Char literal]: {{< ref "#char-literal" >}}
+[Int32 literal]: {{< ref "#int32-literal" >}}
+[Int64 literal]: {{< ref "#int64-literal" >}}
+[Single literal]: {{< ref "#single-literal" >}}
+[Double literal]: {{< ref "#double-literal" >}}
+[Boolean literal]: {{< ref "#boolean-literal" >}}
+[Object literal]: {{< ref "#object-literal" >}}
+[Dictionary literal]: {{< ref "#dictionary-literal" >}}
+[Structure literal]: {{< ref "#structure-literal" >}}
+[List literal]: {{< ref "#list-literal" >}}
+[Concatenated Strings]: {{< ref "#concatenated-strings" >}}
+[Interpolated Strings]: {{< ref "#interpolated-strings" >}}
+[Verbatim Strings]: {{< ref "#verbatim-strings" >}}
+
+[Arithmetic expressions]: {{< ref "#arithmetic-expressions" >}}
+[Boolean expressions]: {{< ref "#boolean-expressions" >}}
+[Comparison expressions]: {{< ref "#comparison-expressions" >}}
+[String expressions]: {{< ref "#string-expressions" >}}
+[Dictionary expressions]: {{< ref "#dictionary-expressions" >}}
+[Structure expressions]: {{< ref "#structure-expressions" >}}
+[List expressions]: {{< ref "#list-expressions" >}}
+[Constructor expressions]: {{< ref "#constructor-expressions" >}}
+[Method expressions]: {{< ref "#method-expressions" >}}
+[Property expressions]: {{< ref "#property-expressions" >}}
+[Enum expressions]: {{< ref "#enum-expressions" >}}
+[Casting expressions]: {{< ref "#casting-expressions" >}}
+[Index expressions]: {{< ref "#index-expressions" >}}
+[Decomposition expressions]: {{< ref "#decomposition-expressions" >}}
+
+[Data Type]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+
+[property editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.MainDoc" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+
+[Input Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[InputOutput Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+
+[Reference Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Boolean]: {{< url path="Cortex.Reference.DataTypes.ConditionalLogic.Boolean.MainDoc" >}}
+[Collections]: {{< url path="Cortex.Reference.DataTypes.Collections.MainDoc" >}}
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[Create a Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.CreateNew" >}}
+[Int16]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int16.MainDoc" >}}
+[Int32]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int32.MainDoc" >}}
+[Int32.MaxValue]: {{< url path="MSDocs.DotNet.Api.System.Int32.MaxValue" >}}
+[Int32.MinValue]: {{< url path="MSDocs.DotNet.Api.System.Int32.MinValue" >}}
+[Int64]: {{< url path="Cortex.Reference.DataTypes.Numbers.Int64.MainDoc" >}}
+[Double]: {{< url path="Cortex.Reference.DataTypes.Numbers.Double.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Create a List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.CreateNew" >}}
+[Single]: {{< url path="Cortex.Reference.DataTypes.Numbers.Single.MainDoc" >}}
+[Single.MaxValue]: {{< url path="MSDocs.DotNet.Api.System.Single.MaxValue" >}}
+[Single.MinValue]: {{< url path="MSDocs.DotNet.Api.System.Single.MinValue" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+[Collection]: {{< url path="Cortex.Reference.DataTypes.Collections.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[Create a Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.CreateNew" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[Variables Concept]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[Variables: What Is a Variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+
+[Object Equality]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectEquality.MainDoc" >}}
+
+[Enum]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Enums.MainDoc" >}}
+
+[Object Casting]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.MainDoc" >}}
+[implicitly cast]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.ImplicitCast" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+
+[Boolean Literals]: {{< url path="MSDocs.CSharp.BooleanLiterals" >}}
+[Char Literals]: {{< url path="MSDocs.CSharp.CharLiterals" >}}
+[Integer Literals]: {{< url path="MSDocs.CSharp.IntegerLiterals" >}}
+[Real Literals]: {{< url path="MSDocs.CSharp.RealLiterals" >}}
+[String Literals]: {{< url path="MSDocs.CSharp.StringLiterals" >}}
+[Arithmetic Operators]: {{< url path="MSDocs.CSharp.ArithmeticOperators" >}}
+[Boolean Logical Operators]: {{< url path="MSDocs.CSharp.BooleanLogicalOperators" >}}
+[Comparison Operators]: {{< url path="MSDocs.CSharp.ComparisonOperators" >}}
+[Equality Operators]: {{< url path="MSDocs.CSharp.EqualityOperators" >}}
+[Constructors]: {{< url path="MSDocs.CSharp.Constructors" >}}
+[Methods External]: {{< url path="MSDocs.CSharp.Methods" >}}
+[Properties]: {{< url path="MSDocs.CSharp.Properties" >}}
+[Enumeration types]: {{< url path="MSDocs.CSharp.EnumerationTypes" >}}
+[Explicit Conversions]: {{< url path="MSDocs.CSharp.ExplicitConversions" >}}
+[Implicit Conversions]: {{< url path="MSDocs.CSharp.ImplicitConversions" >}}
+[Indices and Ranges]: {{< url path="MSDocs.CSharp.IndicesAndRanges" >}}
+[String concatenation]: {{< url path="MSDocs.DotNet.Api.System.String.ConcatGuide" >}}
+[C# identifier naming rules]: {{< url path="MSDocs.CSharp.IdentifierNamingRules" >}}
+[String interpolation]: {{< url path="MSDocs.CSharp.Interpolation" >}}
+[Verbatim string literals]: {{< url path="MSDocs.CSharp.Verbatim" >}}
+[Verbatim String Interpolation]: {{< url path="MSDocs.CSharp.InterpolatedVerbatim" >}}
+
+[C#]: {{< url path="Cortex.Reference.Glossary.A-E.CSharp" >}}
+[operands]: {{< url path="Cortex.Reference.Glossary.K-O.Operand" >}}
+[operators]: {{< url path="Cortex.Reference.Glossary.K-O.Operator" >}}
+[PropertiesC#]: {{< url path="Cortex.Reference.Glossary.P-T.PropertyCSharp" >}}
+[methods]: {{< url path="Cortex.Reference.Glossary.K-O.Method" >}}
+[programming language]: {{< url path="Cortex.Reference.Glossary.P-T.ProgrammingLanguage" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/literal-editor.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/literal-editor.md
new file mode 100644
index 000000000..81c2e7934
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/literal-editor.md
@@ -0,0 +1,74 @@
+---
+title: "Literal Editor"
+linkTitle: "Literal Editor"
+description: "Information regarding using the Literal Editor."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Available Types
+
+TODO:
+
+- The literal editor will have one or more available types, these types will be either Complex or Basic Types
+- The types available to the literal editor are restricted by the block property.
+- It is possible to switch the type of the literal editor to any available type.
+
+### Basic Types
+
+TODO:
+
+- Single Editor
+
+TODO: Image of basic literal editor
+
+### Complex Types
+
+TODO:
+
+- Nested editors within a complex type
+- List and Dictionary Editors
+
+TODO: Image of complex literal editor
+
+### Switching Type
+
+TODO:
+
+- What are DataType and CurrentType?
+- An editor can be switched using the type selector (accessed by clicking on the property name)
+
+TODO: Image of type selector
+
+## Remarks
+
+### Known Limitations
+
+TODO:
+
+- There is no literal support for Collection Types or types that have constructors with no parameters.
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
new file mode 100644
index 000000000..1ce8f775d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/property-editors/variable-editor.md
@@ -0,0 +1,120 @@
+---
+title: "Variable Editor"
+linkTitle: "Variable Editor"
+description: "Information regarding using the Variable Editor."
+weight: 100
+---
+
+# {{% param title %}}
+
+## Summary
+
+The Variable Editor is used to reference any available [variable][What is a Variable?] that is in scope of the [block][What is a Block?] and can be used with most [block properties][What is a Block Property?].
+
+{{< figure src="/images/Variable Editor.png" >}}
+
+## Using Variables
+
+The variables available to the Variable Editor are restricted by the [scope][Variable Scopes] of the currently selected block, which in turn is determined by the [workspace][What is a Workspace?] containing it.
+
+The variable is referenced by either entering the variable name (without the prefix of `($)`) into the Variable Editor, or by selecting an available variable from the dropdown, which is revealed when the Variable Editor is selected.
+
+If the editor’s field is empty, all available variables will be displayed in the dropdown.
+
+{{< figure src="/images/Variable Editor - Select Variable.png" >}}
+
+Typing characters into the Variable Editor will filter the available variables displayed to those with their name or scope containing a case-insensitive match of the text entered.
+
+{{< figure src="/images/Variable Editor - Filter Variables.png" >}}
+
+### Scoped Variables
+
+Variables are scoped by the workspace that contains the selected block. {{% ctx %}} uses the principle of inherited scope in that variables available for use in the Variable Editor are those created in the current workspace and those inherited from variables scoped to the parent workspace.
+
+If two or more different variables have the same case-insensitive variable name but belong to different scopes, only the variable with the closest scope to the scope of the selected block will be used or displayed in the Variable Editor dropdown.
+
+{{< figure src="/images/Variable Editor - Scoped Variables.png" >}}
+
+### Accessing Variable Properties or Indexes
+
+[Properties][Variable Properties] and [indexes][Variable Indexes] of the data type contained in a variable for both Input and Output properties may be expressed in the Variable Editor.
+
+However, if an index is used with a variable in an output property, the variable must have already been created and instantiated to a suitable data type, otherwise a translation error will be displayed when an attempt to execute the flow is made.
+
+In addition, for input or output property types, if the data type contained in the variable is not dynamic and the property or index used does not exist, a translation error will be displayed when an attempt to execute the flow is made.
+
+Conversely, If the data type contained in the variable is dynamic and the property or index does not exist, a translation error will not be displayed but a runtime exception will be raised when the flow is executed.
+
+{{< figure src="/images/Variable Editor - Variable Properties.png">}}
+
+## Missing Variables
+
+If the text entered in the Variable Editor does not match that of a created variable, i.e., the variable does not exist, then a red border with be shown around the Variable Editor. However, it is possible to [create][Creating Variables] a new variable of that name using the Variable Editor.
+
+{{< figure src="/images/Variable Editor - Missing Variable.png" >}}
+
+## Creating Variables
+
+If a variable does not already exist, the Variable Editor can be used to create a new variable, scoped to the current workspace.
+
+To create a new variable, enter the new variable’s name in the Variable Editor. The dropdown will reveal a filtered list of available variables, where the name or scope of variable contains the case-insensitive text entered, plus the option to create a new variable.
+
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to create a new variable will not be displayed.
+
+{{< figure src="/images/Variable Editor - Create Variable.png" >}}
+
+## Renaming Variables
+
+If the Variable Editor already contains a reference to an existing variable, entering the name for a variable that does not exist will not only offer the option to [create][Creating Variables] a new variable in the dropdown, but it will also display the option to rename the existing variable to that of the name entered.
+
+If an existing variable is renamed in the Variable Editor, then all other references to the existing variable will also be changed to the new variable name throughout the flow.
+
+If the text entered does not conform to the variable naming rules ([C# identifier naming rules][]), then the option to rename the variable will not be displayed.
+
+Renaming a variable will keep intact any indexes or property references to the object contained in the variable; any changes made to the indexes or property references will not affect the indexes or property references elsewhere in the flow.
+
+{{< figure src="/images/Variable Editor - Rename Variable.png" >}}
+
+## Remarks
+
+### Known Limitations
+
+* When two or more characters are entered into the Variable Editor, causing the dropdown to display a list of available variables, the variable name of the first closest match is sometimes displayed in the Variable Editor, e.g., entering My will cause MyVar to be displayed in the Variable Editor, however, pressing the Tab key will not automatically enter the full variable name. The variable name must either be entered in full, or an option on the dropdown must be selected.
+
+* Variable references used elsewhere in the flow as the index to other variables, e.g. the variable Var2 used in the reference `Var1[($)Var2]`, will remain referencing Var2 even when the variable Var2 is renamed in the Variable Editor or Variables Grid.
+
+## See Also
+
+### Related Concepts
+
+* [Blocks][What is a Block?]
+* [Block Properties][What is a Block Property?]
+* [Variable Scopes][]
+* [Variables][What is a Variable?]
+* [Workspaces][What is a Workspace?]
+
+### Related Blocks
+
+* [All Blocks][Blocks]
+
+### Related Data Types
+
+* [All Data Types][Reference Data Types]
+
+### External Documentation
+
+* [C# identifier naming rules][]
+
+[Creating Variables]: {{< ref "#creating-variables" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Reference Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Variable Indexes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Indexes" >}}
+[Variable Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.Properties" >}}
+[Variable Scopes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[What is a Block?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[What is a Block Property?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[What is a Variable?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[What is a Workspace?]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[C# identifier naming rules]: {{< url path="MSDocs.CSharp.IdentifierNamingRules" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/what-is-a-block-property.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/what-is-a-block-property.md
new file mode 100644
index 000000000..0fec4c150
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/block-properties/what-is-a-block-property.md
@@ -0,0 +1,152 @@
+---
+title: "What is a Block Property?"
+linkTitle: "What is a Block Property?"
+description: "Information regarding the anatomy of block properties, types of property and their appearance, and configuring properties using the available property editors."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+[Blocks][block] are configured using Block Properties. Properties pass data to the block which is then used to perform an action, or branch based on a condition within a [flow][].
+
+## Anatomy of a Block Property
+
+There are three types of block property, each type can be configured using one of its supported editors:
+
+- [Input Properties][]
+- [Output Properties][]
+- [InputOutput Properties][]
+
+### Input Properties
+
+Input properties are used to provide values to a [block][]. These properties are used in the block's execution (e.g. a block to send emails would have input properties for specifying things like the sender, recipients, summary, body, attachments etc.).
+
+#### Supported Editors
+
+Input properties can be configured using the following editors:
+
+- [Literal Editor][]
+- [Variable Editor][]
+- [Expression Editor][]
+
+{{< figure src="/images/editable/editor-types.png" >}}
+
+### Output Properties
+
+Output properties are used to save values from a [block][]. These properties can be saved to a variable or [decomposed][Decomposing Output Properties] to be saved into multiple variables during the block's execution.
+
+Values from Output properties can be [discarded][Discarding Outputs], this means they will not be saved to any variable.
+
+#### Supported Editors
+
+Output properties can be configured using the following editors:
+
+- [Variable Editor][]
+
+{{< figure src="/images/editable/variable-editor.png" >}}
+
+- [Expression Editor][] using [decomposition][Decomposing Output Properties]
+
+{{< figure src="/images/editable/expression-editor.png" >}}
+
+#### Decomposing Output Properties
+
+Output values can be [decomposed][Decomposition expressions] to allow the saving of different parts of the value to different variables.
+
+To [decompose][Decomposition expressions] an output value, the output property will need to be set to an expression.
+
+#### Discarding Outputs
+
+Output values can be discarded, instead of saving them to a variable.
+
+Common reasons for discarding include:
+
+- Discarding the exception output from [Handle Exception blocks][]
+- Discarding unwanted output values from blocks such as the [Execute SSH Command][] block that have multiple Output properties
+
+To discard an output value, the Output property should use the built-in `($)_` variable.
+
+{{< figure src="/images/discarded-variable.PNG" >}}
+
+### InputOutput Properties
+
+InputOutput properties are used to provide values to a [block][]. These properties are used, updated and saved back to a variable during the block's execution.
+
+#### Supported Editors
+
+InputOutput properties can be configured using the following editors:
+
+- [Variable Editor][]
+
+{{< figure src="/images/editable/variable-editor.png" >}}
+
+The icons used for InputOutput properties are light blue to distinguish them from [Input Properties][].
+
+## Remarks
+
+### Known Limitations
+
+#### The Literal Editor is not Supported for all Input Properties
+
+Currently, not all [Data Types][] support the use of the [Literal Editor][], such as:
+
+- [Collections][]
+- [Data Types][] without a constructor that contains parameters
+
+Information regarding which editors are supported for a [Data Type][Data Types] can be found in the "Remarks" section under "Property Editor Support" in the relevant documentation for that [Data Type][Data Types].
+
+In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Property Editors][]
+- [Variables][]
+- [Data Types][Fundamentals Data Types]
+- [Executions][]
+- [Exceptions][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Input Properties]: {{< ref "#input-properties" >}}
+[Output Properties]: {{< ref "#output-properties" >}}
+[InputOutput Properties]: {{< ref "#inputoutput-properties" >}}
+[Decomposing Output Properties]: {{< ref "#decomposing-output-properties" >}}
+[Discarding Outputs]: {{< ref "#discarding-outputs" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Handle Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.MainDoc" >}}
+[Execute SSH Command]: {{< url path="Cortex.Reference.Blocks.Ssh.ExecuteSshCommand.ExecuteSshCommandBlock.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Property Editors]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.MainDoc" >}}
+[Literal Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Decomposition expressions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.DecompositionExpressions" >}}
+
+[Fundamentals Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+
+[Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Collections]: {{< url path="Cortex.Reference.DataTypes.Collections.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/handling-exceptions-within-a-block.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/handling-exceptions-within-a-block.md
new file mode 100644
index 000000000..22299a50a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/handling-exceptions-within-a-block.md
@@ -0,0 +1,54 @@
+---
+title: "Handling Exceptions within a Block"
+linkTitle: "Handling Exceptions within a Block"
+description: "Information regarding handling exceptions within a block."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+Exceptions within a block can be handled at the following levels:
+
+- The [block level][] (Highest Priority)
+- The [workspace level][]
+- The [flow level][] (Lowest Priority)
+
+Exceptions thrown within the execution of a [block][] can be handled at the [block level][] by connecting any [Handle Block Exception block][] to the exception output port. Multiple [Handle Block Exception blocks][Handle Block Exception block] can be [chained][] to handle different exceptions.
+
+For more information, see [Handling Exceptions][].
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][block]
+- [Exceptions][]
+
+### Related Blocks
+
+- [Handle Block Exception][Handle Block Exception block]
+
+### External Documentation
+
+None
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[flow level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.FlowLevel" >}}
+[workspace level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.WorkspaceLevel" >}}
+[chained]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.ChainingExceptions" >}}
+[block level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.BlockLevel" >}}
+[Handle Block Exception block]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/what-is-a-block.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/what-is-a-block.md
new file mode 100644
index 000000000..17accad8b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/blocks/what-is-a-block.md
@@ -0,0 +1,243 @@
+---
+title: "What is a Block?"
+linkTitle: "What is a Block?"
+description: "Information regarding the anatomy of a block, types of blocks and their appearance, connecting blocks, and block properties."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+A block is used to perform an action, or branch based on a condition within a [flow][].
+
+Blocks are organised into palettes based on the type of object they operate on or the system they interact with (e.g. Blocks that operate on Lists can be found in the Lists palette). Blocks can be dragged from a palette on to a [workspace][], and connected to one another to create the logic of the [flow][].
+
+## Anatomy of a Block
+
+There are five types of block, each type has its own image, connection ports and properties:
+
+- [Flow Control Blocks][]
+- [Action Blocks][]
+- [Decision Blocks][]
+- [Exception Handling Blocks][]
+- [Workspace Blocks][]
+
+### Flow Control Blocks
+
+Flow Control blocks are used to start or end a [flow][] or [workspace][].
+
+#### Block Image
+
+{{< figure src="/images/flow-control-blocks.svg" >}}
+
+- Flow Control blocks are square shaped
+- Flow Control blocks are smaller than [Action Blocks][]
+- Flow Control blocks have a pale blue background
+
+#### Connection Ports
+
+Flow Control Blocks that start a [flow][] or [workspace][] have the following connection ports:
+
+- One output port located on the bottom of the block
+
+An [execution][] moves to the input port of the block connected to the output port.
+
+Flow Control Blocks that end a [flow][] or [workspace][] have the following connection ports:
+
+- One input port located on the top of the block
+
+An [execution][] passes through the input port, and ends the [flow][] or [workspace][] depending on the logic of the block.
+
+### Action Blocks
+
+Action blocks are used to perform an action within a [flow][]. They can operate on an object or interact with a system.
+
+Exceptions thrown by Action blocks can be handled by connecting a [Handle Block Exception block][Handle Block Exception blocks] to the red output port.
+
+#### Block Image
+
+{{< figure src="/images/action-blocks.svg" >}}
+
+- The icon of the Action block shows what object or system it interacts with
+- The icon in the bottom right of the Action block provides further information into what type of action or interaction it will take
+- Action blocks are square shaped
+- Action blocks have a pale blue background
+
+#### Connection Ports
+
+Action blocks have the following connection ports:
+
+- One input port located on the top of the block
+- One output port located on the bottom of the block
+- One red exception output port located on the right of the block
+
+An [execution][] passes through the input port, executes the block, and if no [exception][] occurs, moves to the input port of the block connected to the output port; if an exception occurs the execution moves to the exception input port of the [exception handling block][Exception Handling Blocks] connected to the exception output port.
+
+### Decision Blocks
+
+Decision blocks are used to branch within a [flow][] based on a condition.
+
+#### Block Image
+
+{{< figure src="/images/decision-blocks.svg" >}}
+
+- The icon of the Decision block shows what object or system it interacts with
+- Decision blocks are diamond shaped
+- Decision blocks have a pale blue background
+
+#### Connection Ports
+
+Decision blocks have the following connection ports:
+
+- One input port located on the top of the block
+- One output port located on the right the block
+- One output port located on the bottom of the block
+
+An [execution][] passes through the input port, executes the block, and based on the result of the execution moves to the input port of the block connected to the correct output port.
+
+### Exception Handling Blocks
+
+Exception Handling blocks are used to handle exceptions thrown within a [flow][].
+
+Exceptions can be handled at different levels within a [flow][]; at the block level, the workspace level, and the flow level. For more information see [Handling Exceptions][].
+
+#### Block Image
+
+{{< figure src="/images/editable/exception-handling-blocks.png" >}}
+
+- Exception Handling blocks have a pink background
+
+#### Connection Ports
+
+[Handle Block Exception blocks][] have the following connection ports:
+
+- One red exception input port located on the left of the block
+- One red exception output port located on the right of the block if they can be [chained][]
+- One output port located on the bottom of the block
+
+An [execution][] passes through the exception input port, executes the block, and if the [exception][] can be handled, moves to the input port of the block connected to the output port; if an exception cannot be handled the execution moves to the exception input port of the [exception handling block][Exception Handling Blocks] connected to the exception output port, for more information see [Chaining Block Exception Handling Blocks][chained].
+
+[Handle Workspace Exception blocks][] have the following connection ports:
+
+- One output port located on the bottom of the block
+
+[Handle Flow Exception blocks][] have no connection ports.
+
+### Workspace Blocks
+
+Workspace blocks are used to group logic and actions within a [flow][] in order to reduce the complexity and make the flow easier to maintain. For more information see [Workspaces][].
+
+Unhandled exceptions thrown within a workspace can be handled by connecting a [Handle Block Exception block][Handle Block Exception blocks] to the red output port of the Workspace block.
+
+#### Block Image
+
+{{< figure src="/images/workspace-blocks.svg" >}}
+
+- Workspace blocks are rectangle shaped
+- Workspace blocks are larger than [Action Blocks][]
+- Workspace blocks have a pale blue background
+
+#### Connection Ports
+
+Workspace Blocks have the following connection ports:
+
+- One input port located on the top of the block
+- One output port located on the bottom of the block
+- One red exception output port located on the right of the block
+
+An [execution][] passes through the input port and executes the workspace block, and if no unhandled [exception][] occurs, moves to the input port of the block connected to the output port; if an unhandled exception occurs the execution moves to the exception input port of the [exception handling block][Exception Handling Blocks] connected to the exception output port.
+
+### Block Properties
+
+Blocks are configured using [Block Properties][]. Properties pass data to the block which is then used to perform an action, or branch based on a condition within a [flow][].
+
+There are three types of block properties:
+
+- [Input][]
+- [Output][]
+- [InputOutput][]
+
+Most blocks share [Common Properties][] such as a description for the block. Some blocks have [Advanced Properties][] that do not normally need to be configured but allow for more advanced scenarios.
+
+For further information, see [Block Properties][].
+
+### Block Connections
+
+Block connections help determine the order blocks will be executed in a flow, an execution moves through the flow sequentially
+
+An execution moves from one connected block to another, depending on the logic of the block. Blocks can be connected to each other through the use of connection ports.
+
+There are four types of connections ports
+
+- Input Ports - act as the entry point of a block, output ports from one or more other blocks can be connected to an input port
+- Output Ports - act as the exit point of a block, output ports can only be connected to an input port of one other block
+- Exception Input Ports - act as the entry point of an exception handling block, exception output ports from one or more other blocks can be connected to an exception input port
+- Exception Output Ports - act as the exit point of a block when an exception is thrown, exception output ports can only be connected to an exception input port of one exception handling block
+
+## Exceptions within a Block
+
+Exceptions thrown within the execution of a block can be handled by connecting a [Handle Block Exception block][Handle Block Exception blocks] to the red output port. If there is no [Handle Block Exception block][Handle Block Exception blocks] that can handle the exception then it will be passed to the workspace level to be handled.
+
+For further information, see [Handling Exceptions within a Block][].
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Block Properties][]
+- [Executions][]
+- [Exceptions][]
+
+### Related Blocks
+
+- [All Blocks][Blocks]
+
+### External Documentation
+
+None
+
+[Flow Control Blocks]: {{< ref "#flow-control-blocks" >}}
+[Action Blocks]: {{< ref "#action-blocks" >}}
+[Decision Blocks]: {{< ref "#decision-blocks" >}}
+[Exception Handling Blocks]: {{< ref "#exception-handling-blocks" >}}
+[Workspace Blocks]: {{< ref "#workspace-blocks" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[exception]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[chained]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.ChainingExceptions" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[Advanced Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+[Common Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Handling Exceptions within a Block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.HandlingExceptionsWithinABlock.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Flow Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.MainDoc" >}}
+[Handle Workspace Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/_index.md
new file mode 100644
index 000000000..5e6b8dc14
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Data Types"
+linkTitle: "Data Types"
+description: "Information regarding what a data type is, and the difference between basic and complex data types."
+weight: 400
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/generics.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/generics.md
new file mode 100644
index 000000000..eee267f88
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/generics.md
@@ -0,0 +1,38 @@
+---
+title: "Generics"
+linkTitle: "Generics"
+description: "Information regarding generic data types."
+weight: 100
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/null-and-nullable-types.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/null-and-nullable-types.md
new file mode 100644
index 000000000..ce35d9b02
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/null-and-nullable-types.md
@@ -0,0 +1,46 @@
+---
+title: "Null and Nullable Types"
+linkTitle: "Null and Nullable Types"
+description: "Information regarding null and nullable data types."
+weight: 200
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Null
+
+TODO
+
+## Nullable Types
+
+TODO
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/what-is-a-data-type.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/what-is-a-data-type.md
new file mode 100644
index 000000000..147403d92
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/data-types/what-is-a-data-type.md
@@ -0,0 +1,95 @@
+---
+title: "What is a Data Type?"
+linkTitle: "What is a Data Type?"
+description: "Information regarding what a data type is, basic and complex data types and their differences."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Overview of a data type
+- Difference between Value (value types cannot be null, and have a default value that is not null e.g. int is `0`) and Reference Data Types (reference types can be null and have a null default value)
+- Difference between Basic and Complex Data Types
+
+## Value Types
+
+TODO:
+
+- Explain what a value type is, and how it can be used
+- Check Set Variable block and how Value Types work within the block
+ - Setting a new variable to an already existing value type will cause them to be separate instances of the value
+- The Copy Object block can be used to make a copy of a value type (value types always have a different reference)
+
+## Reference Types
+
+TODO:
+
+- Explain what a reference type is, and how it can be used
+- This is referenced by the Set Variable block
+ - Set Variable block is used to set ($)List[0]
+ - When adding `($)Reference` to `($)List`, the actual reference is added (not a copy)
+ - Setting value of `($)List1` to `($)List2` will cause them to have the same reference. Changes to `($)List1` are reflected in `($)List2`
+- The Copy Object block can be used to make a copy of a type with a different reference
+
+## Basic Data Types
+
+TODO:
+
+- Explain what a basic data type is
+- Table of Basic Data Types
+ - Columns - Data Type Name, Value/Reference Type
+ - Strings are a basic data type but are also a reference type.
+
+## Complex Data Types
+
+TODO:
+
+- Explain what a complex data type is and what makes a data type complex
+- Includes Complex and Collections (Lists, Dictionaries, structures, etc)
+- Object
+- Dynamic
+- Object vs Dynamic
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+- [All Data Types][Data Type]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+TODO:
+
+- [Value Types][]
+- [Reference Types][]
+- [Builtin Types][]
+- [Default Values][]
+
+[Reference Types]: {{< url path="MSDocs.CSharp.ReferenceTypes" >}}
+[Value Types]: {{< url path="MSDocs.CSharp.ValueTypes" >}}
+[Builtin Types]: {{< url path="MSDocs.CSharp.BuiltinTypes" >}}
+[Default Values]: {{< url path="MSDocs.CSharp.DefaultValues" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[Data Type]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/_index.md
new file mode 100644
index 000000000..891d55a14
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Exceptions"
+linkTitle: "Exceptions"
+description: "Information regarding what an exceptions is, handling exceptions, and throwing exceptions."
+weight: 600
+---
+
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/handling-exceptions.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/handling-exceptions.md
new file mode 100644
index 000000000..447ee7512
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/handling-exceptions.md
@@ -0,0 +1,186 @@
+---
+title: "Handling Exceptions"
+linkTitle: "Handling Exceptions"
+description: "Information regarding handling exceptions at the block, workspace and flow level."
+weight: 100
+---
+
+# {{% param title %}}
+
+## Summary
+
+Exceptions within a flow can be handled at the following levels:
+
+- The [block level][] (Highest Priority)
+- The [workspace level][]
+- The [flow level][] (Lowest Priority)
+
+## Handling Exceptions at the Block level
+
+{{< figure src="/images/block-exception.gif" >}}
+
+Exceptions thrown within the [execution][] of a [block][] can be handled by connecting a [Handle Block Exception block][Handle Block Exception blocks] to the red exception output port. These blocks allow for specific [match criteria][] to be provided; if an exception matches the criteria it will be handled by the block and can be [saved to a variable][block saved to a variable], otherwise, it will be passed to the next [chained][] exception handling block. This process repeats until the exception is either handled or there are no more blocks in the chain; if the exception is not handled at this level it is passed up to the [workspace level][].
+
+### Matching Exceptions
+
+[Handle Block Exception blocks][] can be configured to handle exceptions that match specific criteria (e.g. The Exception Type or Message contains matching text). If an exception matches the criteria, the exception is handled, [saved to a variable][block saved to a variable] if provided, and the [execution][] moves to the block connected to the output port; if the exception does not match the criteria the execution moves to the next [chained][] exception handling block.
+
+### Chaining Block Exception Handling Blocks
+
+{{< figure src="/images/chained-exception.gif" >}}
+
+[Handle Block Exception blocks][] can be chained together by connecting the red exception output port of one [block][] to the red exception input port of another. When an exception is not handled, it will be passed to the next chained exception handling block. This process repeats until the exception is either handled or there are no more blocks in the chain; if the exception is not handled at this level it is passed up to the [workspace level][].
+
+The [Handle Block Exception][] block can be used to handle all exceptions. This block does not have an exception output port and therefore ends the chain.
+
+### Saving the Block Exception
+
+[Handle Block Exception blocks][] can be used to save the handled exception to a [variable][]. If it is not necessary to save the exception to a variable, it may be [discarded][] by setting the block's Exception [property][] to use the built-in discard variable `($)_`.
+
+## Handling Exceptions at the Workspace level
+
+{{< figure src="/images/workspace-exception.gif" >}}
+
+Exceptions not handled at the [block level][] are passed up to the workspace level.
+
+If an unhandled exception occurs in a [Nested Workspace][] where a [Handle Workspace Exception][] block exists:
+
+- The exception will be passed to the [Handle Workspace Exception][] block
+- The exception will be handled and can be [saved to a variable][workspace saved to a variable]
+- The [execution][] will move to the [block][] connected to the output port of the [Handle Workspace Exception][] block
+
+If an unhandled exception occurs in a [Nested Workspace][] where a [Handle Workspace Exception][] block does not exist:
+
+- The exception will be rethrown by the [Workspace block][] the [workspace][] belongs to
+- This process repeats until the exception is handled at the [block level][] or workspace level, or reaches the [Top-Level Workspace][]
+
+If an unhandled exception occurs in or reaches the [Top-Level Workspace][], and is not handled by any [Handle Block Exception blocks][] or the [Handle Workspace Exception][] block, it will be passed up to the [flow level][].
+
+Please note that there are a number of [restrictions][Restrictions Handle Workspace Exception] when using the [Handle Workspace Exception][] block.
+
+### Saving the Workspace Exception
+
+The [Handle Workspace Exception][] block can be used to save the handled exception to a [variable][]. If it is not necessary to save the exception to a variable, it may be [discarded][] by setting the block's Exception [property][] to use the built-in discard variable `($)_`.
+
+## Handling Exceptions at the Flow level
+
+{{< figure src="/images/flow-exception.gif" >}}
+
+If an unhandled exception occurs in or reaches the [Top-Level Workspace][], and is not handled at the [block level][] or [workspace level][], it will be passed up to the flow level, where:
+
+- The exception will be passed to the [Handle Flow Exception][] block
+- The exception will be handled and can be saved to a [variable][]
+- The [execution][] will enter the [Handle Flow Exception][] block's [workspace][]
+- The [execution][] will end after the [Handle Flow Exception][] block's [workspace][] has completed
+
+The [Handle Flow Exception][] block is automatically added to the [Top-Level Workspace][] when a new [flow][] is created, there are [restrictions][Restrictions Handle Flow Exception] that apply to this block.
+
+The [Handle Flow Exception][] block it has its own [workspace][], which can access its own [variables][variable] and those defined at the [scope][] of the [Top-Level Workspace][].
+
+The logic contained within the [Handle Flow Exception][] workspace must end the execution using an [End Flow][] block. By default, this workspace contains a [Start Workspace][] block connected to an [End Flow][] block, which will cause the flow to end without error.
+
+### Handling Exceptions in the Handle Flow Exception block
+
+Exceptions that occur within the [workspace][] of the [Handle Flow Exception][] block can be handled at the [block level][] and [workspace level][]. If an exception is not handled, the [execution][] will end with a status of Error.
+
+{{< figure src="/images/flow-error-status.png" >}}
+
+### Saving the Flow Exception
+
+The [Handle Flow Exception][] block can be used to save the handled exception to a [variable][]. If it is not necessary to save the exception to a variable, it may be [discarded][] by setting the block's Exception [property][] to use the built-in discard variable `($)_`.
+
+## Remarks
+
+### Known Limitations
+
+#### The Top-Level Workspace cannot contain a Handle Workspace Exception block
+
+The [Top-Level Workspace][] cannot contain a [Handle Workspace Exception][] block; if one is added, it will be reported when trying to validate the [flow][]. For more information see [Validating a Flow in Development][] and [Validating a Flow in Production][].
+
+Any unhandled exceptions thrown on the Top-Level Workspace will be handled by the [Handle Flow Exception][] block.
+
+In the future this may change.
+
+#### A Nested Workspace cannot contain more than one Handle Workspace Exception block
+
+A [Nested Workspace][] cannot contain more than one [Handle Workspace Exception][] block; if more than one is added, it will be reported when trying to validate the [flow][]. For more information see [Validating a Flow in Development][] and [Validating a Flow in Production][].
+
+In the future this may change.
+
+#### Enforced restrictions to prevent infinite recursion
+
+For each [execution][] of a [workspace][], the [Handle Workspace Exception][] block will only handle the first unhandled exception within its workspace, this is to prevent infinite recursion within the [flow][].
+
+For more information see [Handling Exceptions at the Workspace level][workspace level].
+
+In the future this may change.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Workspaces][]
+- [Variables][]
+- [Executions][]
+
+### Related Data Types
+
+- [All Exceptions][]
+
+### Related Blocks
+
+- [Handle Block Exception blocks][]
+- [Handle Workspace Exception][]
+- [Handle Flow Exception][]
+- [Workspace][Workspace block]
+- [Start Workspace][]
+- [End Flow][]
+
+### External Documentation
+
+None
+
+[block level]: {{< ref "#handling-exceptions-at-the-block-level" >}}
+[chained]: {{< ref "#chaining-block-exception-handling-blocks" >}}
+[block saved to a variable]: {{< ref "#saving-the-block-exception" >}}
+[workspace saved to a variable]: {{< ref "#saving-the-workspace-exception" >}}
+[match criteria]: {{< ref "#matching-exceptions" >}}
+[workspace level]: {{< ref "#handling-exceptions-at-the-workspace-level" >}}
+[flow level]: {{< ref "#handling-exceptions-at-the-flow-level" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Top-Level Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.TopLevelWorkspace" >}}
+[Nested Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.NestedWorkspaces" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[discarded]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DiscardingOutputs" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[Validating a Flow in Development]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.ValidatingAFlow" >}}
+[Validating a Flow in Production]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInProduction.ValidatingAFlow" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+
+[All Exceptions]: {{< url path="Cortex.Reference.Exceptions.MainDoc" >}}
+
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+
+[Workspace block]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+[Start Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.StartWorkspace.StartWorkspace.MainDoc" >}}
+[End Flow]: {{< url path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" >}}
+[Handle Block Exception blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.MainDoc" >}}
+[Handle Block Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockException.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Restrictions Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.BlockRestrictions" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+[Restrictions Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.BlockRestrictions" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/throwing-exceptions.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/throwing-exceptions.md
new file mode 100644
index 000000000..e77db146c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/throwing-exceptions.md
@@ -0,0 +1,55 @@
+---
+title: "Throwing Exceptions"
+linkTitle: "Throwing Exceptions"
+description: "Information regarding throwing an exception within a flow, and scenarios when it is useful to throw an exception."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+A developer can throw an exception as part of a [flow][].
+
+Scenarios where throwing exceptions is useful include:
+
+- A developer throwing a new exception when a flow reaches a state where it cannot complete its defined functionality
+- A developer enriching an exception that has already been thrown to provide more clarity and/or detail
+- A developer rethrowing an exception to propagate the exception to the caller; typically this can be useful when [calling another flow][]
+
+For information about throwing an exception, please see the:
+
+- [Throw New Flow Exception][] block
+- [Rethrow Exception][] block
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+
+### Related Blocks
+
+- [Throw New Flow Exception][]
+- [Rethrow Exception][]
+
+### External Documentation
+
+None
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+
+[Rethrow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.RethrowException.RethrowException.MainDoc" >}}
+
+[Throw New Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.ThrowException.ThrowNewFlowException.MainDoc" >}}
+[calling another flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.CallingOtherFlows.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/what-is-an-exception.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/what-is-an-exception.md
new file mode 100644
index 000000000..ae8e54d52
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/exceptions/what-is-an-exception.md
@@ -0,0 +1,110 @@
+---
+title: "What is an Exception?"
+linkTitle: "What is an Exception?"
+description: "Information regarding the anatomy of an exception, and properties accessible on an exception."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+An exception is thrown during an [execution][] when an issue is encountered whilst executing a [flow][]. Exceptions can occur for a number of reasons, such as:
+
+- Exceptions thrown by a [block][], these can be found in the relevant documentation for that [block][All Blocks] (e.g. A duplicate key is added to a [Dictionary][] using the [Add Item With Key][] block)
+- Developer thrown [exceptions][Throwing Exceptions] (e.g. A developer enriches an exception that has already been thrown to provide a more detailed message)
+- Issues with third-party systems (e.g. A third-party system experiences an error)
+- Issues with network connectivity (e.g. A target machine is inaccessible)
+- Issues with permissions (e.g. The execution does not have permission to read a file)
+- Issues with the environment (e.g. The software installed on a target machine is incorrect)
+
+An exception contains details of what caused the issue, for more information see [Anatomy of an Exception][].
+
+An exception can be handled in different ways depending on where the exception occurred. For more information see [Handling Exceptions][].
+
+## Anatomy of an Exception
+
+{{< figure src="/images/exception-in-viewer.PNG" >}}
+
+Data within an exception can be accessed using properties.
+
+The following properties are found on all exceptions:
+
+| Property | Notes | Example |
+|----------|-------|---------|
+| Exception Type | The type of the exception | `PropertyNullException`
+| Message | The exception message, providing information about the exception that occurred. This typically includes the cause of the exception, possible resolutions, and any related information. What is included in an exception's message can be found in the relevant documentation for that [exception][Exceptions] | `'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this.`
+| HelpLink | Help link to aid with troubleshooting and resolution for the exception. There are three types of help links:
{{% ctx %}} - Help links direct to material within the {{% ctx %}} Product Portal. This documentation is written and maintained by {{% ctx %}} and contains information directly related to the {{% ctx %}} product.
External - Help links direct to externally hosted material about the exception. This documentation is not written or maintained by {{% ctx %}}.
Custom - Help links are generated by flow developers during the design and development of flows. These help links are configured in the [Throw New Exception][] block, and can link to any resource applicable to the exception.
| `https://docs.wearecortex.com/docs/2023.5/reference/exceptions/common/property/property-null-exception/` |
+
+The following properties are found on many exceptions:
+
+| Property | Notes | Example |
+|----------|-------|---------|
+| Category | The category of the exception, which is used to categorise an exception if there are multiple reasons that the exception can occur. | [InfiniteLoopException][InfiniteLoopException: Category] has one category, `"Increment"` |
+| Error Code | The error code for the exception, which is used to indicate the reason that the exception occurred, if there are multiple reasons that the exception can occur. | [InfiniteLoopException][InfiniteLoopException: Error Code] has three error codes, `InfiniteLoopErrorCode.IncrementIsZero (100)`, `InfiniteLoopErrorCode.IncrementIsNegative (101)`, and `InfiniteLoopErrorCode.IncrementIsPositive (102)` |
+| Inner Exception | Contains the exception that caused this exception, if any. This property is always accessible but will only be visible in the [Exceptions Viewer][] when it contains data. | `{"ExceptionType": "PropertyNullException", "Message": "'List' is null; it must be provided with a non-null value.\r\nPlease click the HelpLink for more information on how to fix this.", "HelpLink": "https://docs.wearecortex.com/docs/2023.5/reference/exceptions/common/property/property-null-exception/"}` |
+
+For more information regarding what properties are accessible on an exception, see the relevant documentation for that [exception][Exceptions].
+
+## Remarks
+
+### Known Limitations
+
+#### Carriage Return and Line Feed Characters
+
+Carriage Return and Line Feed characters within an exception are supported but will be displayed or written as `\r`, `\n`, or `\r\n`.
+
+In future this limitation may be removed.
+
+#### Copying Exception Text
+
+The [Exceptions Viewer][] currently does not support traditional copy functionality. A workaround is to highlight the text, then click and drag into another text editor.
+
+In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Executions][]
+
+### Related Data Types
+
+- [All Exceptions][Exceptions]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Anatomy of an Exception]: {{< ref "#anatomy-of-an-exception" >}}
+
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[Throwing Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.ThrowingExceptions.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Exception Blocks]: {{< url path="Cortex.Reference.Blocks.Exceptions.MainDoc" >}}
+[Throw New Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.ThrowException.ThrowNewFlowException.MainDoc" >}}
+[Add Item With Key]: {{< url path="Cortex.Reference.Blocks.Dictionaries.AddItem.AddItemWithKey.MainDoc" >}}
+
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Exceptions.MainDoc" >}}
+[InfiniteLoopException: Category]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.Category" >}}
+[InfiniteLoopException: Error Code]: {{< url path="Cortex.Reference.Exceptions.Loops.InfiniteLoopException.ErrorCode" >}}
+
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/_index.md
new file mode 100644
index 000000000..370e98eae
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Executions"
+linkTitle: "Executions"
+description: "Information regarding what an execution is, starting executions, execution variables, exceptions thrown during an execution, and execution metadata."
+weight: 500
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-development.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-development.md
new file mode 100644
index 000000000..68dc5c1b3
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-development.md
@@ -0,0 +1,228 @@
+---
+title: "Executions in Development"
+linkTitle: "Executions in Development"
+description: "Information regarding working with executions in development (i.e. {{% ctx %}} Gateway)."
+weight: 100
+---
+
+# {{% param title %}}
+
+## Summary
+
+Whilst debugging a flow, each execution is represented by a token that moves through the [flow][], showing which [block][] is currently being executed.
+
+A [flow][] can be debugged in [{{% ctx %}} Gateway][CORTEX Gateway] by clicking the [Start an execution][] button or by making an [API call][API call: CORTEX Gateway], [providing input variables][Providing Input Variables] to the flow, if required; this will [validate the flow][Validating a Flow] and then begin an execution.
+
+The following parameters can be specified:
+
+- Show execution on workspace - when this is `true`, the token will be shown at every step throughout the [flow][], otherwise the token will only be shown when the execution [pauses][Paused], hits a [breakpoint][breakpoint], or an exception occurs when `Break on exception` is `true`
+- Break on exception - when this is `true` the execution will [pause][Paused] when an exception occurs
+
+## Providing Input Variables
+
+Any flow that has [Input Variables][] defined requires them to be provided when debugging, these may be provided to a flow in the following ways:
+
+- From [{{% ctx %}} Gateway][CORTEX Gateway] using the Inputs Property in the [Settings Editor][]
+- From an [HTTP request][HTTP request: CORTEX Gateway] using the inputVariables in the body of the request
+
+## Retrieving Output Variables
+
+Any flow that has [Output Variables][] defined can have those variables retrieved after the execution has completed by using the outputVariables in the body of the [HTTP response][HTTP response: CORTEX Gateway].
+
+## Validating a Flow
+
+The [flow][] is validated before it's debugged, if this is successful an execution will begin.
+
+If there are any issues with the flow then the execution will not start and details of what needs to be resolved will be returned. If the flow was debugged by clicking the [Start an execution][] button, then entries will be displayed in the [Messages Grid][]; if it was debugged by making an [HTTP request][HTTP request: CORTEX Gateway] to [{{% ctx %}} Gateway][CORTEX Gateway], then a 400 Bad Request is returned.
+
+For a complete list see [Validation][] messages.
+
+## Selecting an Execution
+
+One or more executions can be selected within [{{% ctx %}} Gateway][CORTEX Gateway] by clicking on their token, or [selecting][Select an Execution] them using the [Executions Grid][]. This allows:
+
+- [Interacting with an Execution][]
+- [Viewing an Execution's Variables][]
+- [Viewing an Execution's Exceptions][]
+
+## Interacting with an Execution
+
+Once executions are [selected][Selecting an Execution] in [{{% ctx %}} Gateway][CORTEX Gateway] they can be interacted with in the following ways:
+
+- [Paused][]
+- [Stepped][]
+- [Continued][]
+- [Stopped][]
+
+### Set Next Block to Execute
+
+Set Next Block to Execute allows a developer to choose which [block][] will be executed next for the selected execution, even if this block is not connected to the [flow][].
+
+Examples of what this can be used to do whilst debugging include:
+
+- Retrying a block due to a transient exception such as network connectivity
+- Retrying a block after using [Edit and Continue][Edit and Continue an Execution] to fix an incorrectly configured block
+- Skipping over functionality that is not yet working
+- Skipping to specific functionality within the flow in order to test it
+- Running logic that is not part of the flow (e.g. running a clean up script to reset any external data sources for the next execution of the flow)
+
+Currently, Set Next Block to Execute is not available when [multiple executions are selected][], or the [block and execution are on different workspaces][].
+
+### Edit and Continue an Execution
+
+[Edit Flow][] and [Continue Debugging][] allows a developer to pause all executions, and make changes to the [flow][] before continuing debugging.
+
+Examples of what this can be used to do whilst debugging include:
+
+- Making changes such as adding, updating and removing: [blocks][block], [connections][], [variables][variable]
+- Fixing an incorrectly configured block
+
+Currently when using Edit and Continue, it is not possible to [directly change the value of a variable without using a block][].
+
+## Viewing an Execution's Variables
+
+When debugging a [flow][] in [{{% ctx %}} Gateway][CORTEX Gateway], [selecting an execution][Selecting an Execution] will display all initialised [variables][variable] that are in [scope][] in the [Variables Viewer][].
+
+To see the data in a variable, select the variable in the [Variables List][] and the data will be presented in the [Variable Details Viewer][]. If the data is large enough to negatively affect the performance of [{{% ctx %}} Gateway][CORTEX Gateway] it will not be displayed unless the `Load Value Button` is clicked.
+
+## Viewing an Execution's Exceptions
+
+When debugging a [flow][] in [{{% ctx %}} Gateway][CORTEX Gateway], [selecting an execution][Selecting an Execution] will display all [exceptions][exception] that have been thrown for that execution in the [Exceptions Viewer][].
+
+In future, it will be possible to navigate to the block that caused the exception.
+
+## Handling an Execution's Exceptions
+
+Exceptions thrown by an execution can be handled at any level within a flow.
+
+Exceptions can be handled:
+
+- At the [block][] level; for further information, see [Handling Exceptions within a Block][]
+- At the [workspace][] level; for further information, see [Handling Exceptions within a Workspace][]
+- At the [flow][] level; for further information, see [Handling Exceptions within a Flow][]
+
+If an exception occurs within the workspace of the [Handle Flow Exception][] block and is not handled, the execution will end with a status of Error.
+
+{{< figure src="/images/flow-error-status.png" >}}
+
+## Logs Generated
+
+There are two ways that logs are generated while debugging a [flow][], they are:
+
+- Automatically generated by the [Execution Service][Execution Service]
+- Developer generated by using the [Log Event][] block
+
+## Remarks
+
+### Known Limitations
+
+#### Updating a Variable's value is not possible without using a Block
+
+When using [Edit and Continue][Edit and Continue an Execution], it is not possible to directly change the value of a [variable][] without using a [block][].
+
+In future this limitation may be removed.
+
+#### Set Next Block to Execute not available when multiple Executions are selected
+
+It is not possible to use Set Next Block to Execute when there are multiple executions selected on the same [workspace][].
+
+In future this limitation may be removed.
+
+#### Set Next Block to Execute not available when the Block and Execution are on different Workspaces
+
+It is not possible to use Set Next Block to Execute when the selected execution is not on the same [workspace][] as the [block][] being set next to execute.
+
+In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Variables][]
+- [Data Types][]
+- [Exceptions][]
+- [Messages][]
+
+### Related Data Types
+
+- [All Data Types][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Providing Input Variables]: {{< ref "#providing-input-variables" >}}
+[Validating a Flow]: {{< ref "#validating-a-flow" >}}
+[Interacting with an Execution]: {{< ref "#interacting-with-an-execution" >}}
+[Viewing an Execution's Variables]: {{< ref "#viewing-an-executions-variables" >}}
+[Viewing an Execution's Exceptions]: {{< ref "#viewing-an-executions-exceptions" >}}
+[Selecting an Execution]: {{< ref "#selecting-an-execution" >}}
+[Edit and Continue an Execution]: {{< ref "#edit-and-continue-an-execution" >}}
+[multiple executions are selected]: {{< ref "#set-next-block-to-execute-not-available-when-multiple-executions-are-selected" >}}
+[block and execution are on different workspaces]: {{< ref "#set-next-block-to-execute-not-available-when-the-block-and-execution-are-on-different-workspaces" >}}
+[directly change the value of a variable without using a block]: {{< ref "#updating-a-variables-value-is-not-possible-without-using-a-block" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[breakpoint]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.AddBreakpoint" >}}
+[connections]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.BlockConnections" >}}
+[Handling Exceptions within a Block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.HandlingExceptionsWithinABlock.MainDoc" >}}
+
+[Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[exception]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[Handling Exceptions within a Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.HandlingExceptionsWithinAFlow.MainDoc" >}}
+
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[message]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[Input Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Output Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.OutputVariablesStructure" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Handling Exceptions within a Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.HandlingExceptionsWithinAWorkspace.MainDoc" >}}
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Log Event]: {{< url path="Cortex.Reference.Blocks.Logs.LogEvent.LogEvent.MainDoc" >}}
+
+[All Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+
+[API call: CORTEX Gateway]: {{< url path="Cortex.Reference.Apis.Gateway.MainDoc" >}}
+[HTTP request: CORTEX Gateway]: {{< url path="Cortex.Reference.Apis.Gateway.MainDoc" >}}
+[HTTP response: CORTEX Gateway]: {{< url path="Cortex.Reference.Apis.Gateway.MainDoc" >}}
+
+[Execution Service]: {{< url path="Cortex.Reference.Logs.CortexExecutionService.MainDoc" >}}
+[Validation]: {{< url path="Cortex.Reference.Messages.Validation.MainDoc" >}}
+
+[CORTEX Gateway]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.MainDoc" >}}
+[Start an execution]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.StartAnExecution" >}}
+[Select an execution]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.SelectExecution" >}}
+[Continue Debugging]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.ContinueExecution" >}}
+[Edit Flow]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.Edit" >}}
+[Exceptions Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.ExceptionsViewer" >}}
+[Variable Details Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariableDetailsViewer" >}}
+[Variables List]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesList" >}}
+[Variables Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesViewer" >}}
+[Settings Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.SettingsEditor" >}}
+[Executions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.MainDoc" >}}
+[Paused]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.PauseExecution" >}}
+[Stepped]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.StepExecution" >}}
+[Continued]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.ContinueExecution" >}}
+[Stopped]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.StopExecution" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-production.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-production.md
new file mode 100644
index 000000000..752dca900
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/executions-in-production.md
@@ -0,0 +1,121 @@
+---
+title: "Executions in Production"
+linkTitle: "Executions in Production"
+description: "Information regarding working with executions in production (i.e. API Gateway Service)."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+A [flow][] can be started in Production by making an [API call][API call: API Gateway] to the [API Gateway Service][], [providing input variables][Providing Input Variables] to the flow, if required; this will [validate the flow][Validating a Flow] and then begin an execution.
+
+## Providing Input Variables
+
+Any flow that has [Input Variables][] defined can have those variables provided by using the inputVariables in the body of the [HTTP request][HTTP request: API Gateway Service].
+
+## Retrieving Output Variables
+
+Any flow that has [Output Variables][] defined can have those variables retrieved after the execution has completed by using the outputVariables in the body of the [HTTP response][HTTP response: API Gateway Service]
+
+## Validating a Flow
+
+The [flow][] is validated before it's started, if this is successful an execution will begin.
+
+If there are any issues with the flow then the execution will not start and details of what needs to be resolved will be returned. If the flow was started by making an [HTTP request][HTTP request: API Gateway Service] to the [API Gateway Service][], then a 400 Bad Request is returned.
+
+For a complete list see [Validation][] messages.
+
+## Handling an Execution's Exceptions
+
+Exceptions thrown by an execution can be handled at any level within a flow.
+
+Exceptions can be handled:
+
+- At the [block][] level; for further information, see [Handling Exceptions within a Block][]
+- At the [workspace][] level; for further information, see [Handling Exceptions within a Workspace][]
+- At the [flow][] level; for further information, see [Handling Exceptions within a Flow][]
+
+If an exception occurs within the workspace of the [Handle Flow Exception][] block and is not handled, the execution will end and then a 500 Internal Server Error is returned.
+
+## Logs Generated
+
+There are two ways that logs are generated while executing a [flow][] in Production, they are:
+
+- Automatically generated by the [API Gateway Service][API Gateway Service: Logs]
+- Developer generated by using the [Log Event][] block
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Variables][]
+- [Data Types][]
+- [Exceptions][]
+- [Messages][]
+
+### Related Data Types
+
+- [All Data Types][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Providing Input Variables]: {{< ref "#providing-input-variables" >}}
+[Validating a Flow]: {{< ref "#validating-a-flow" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Handling Exceptions within a Block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.HandlingExceptionsWithinABlock.MainDoc" >}}
+
+[Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[exception]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.WhatIsAnException.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[Handling Exceptions within a Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.HandlingExceptionsWithinAFlow.MainDoc" >}}
+
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[message]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[Input Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+[Output Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.OutputVariablesStructure" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Handling Exceptions within a Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.HandlingExceptionsWithinAWorkspace.MainDoc" >}}
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Log Event]: {{< url path="Cortex.Reference.Blocks.Logs.LogEvent.LogEvent.MainDoc" >}}
+
+[All Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+
+[API Gateway Service: Logs]: {{< url path="Cortex.Reference.Logs.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+
+[Validation]: {{< url path="Cortex.Reference.Messages.Validation.MainDoc" >}}
+
+[API Gateway Service]: {{< url path="Cortex.Reference.Apis.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+[API call: API Gateway]: {{< url path="Cortex.Reference.Apis.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+[HTTP request: API Gateway Service]: {{< url path="Cortex.Reference.Apis.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+[HTTP response: API Gateway Service]: {{< url path="Cortex.Reference.Apis.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/what-is-an-execution.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/what-is-an-execution.md
new file mode 100644
index 000000000..d217161af
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/executions/what-is-an-execution.md
@@ -0,0 +1,148 @@
+---
+title: "What is an Execution?"
+linkTitle: "What is an Execution?"
+description: "Information regarding the anatomy of an execution."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+An execution represents a running instance of a [flow][], the execution moves through the flow sequentially executing each [block][] saving any outputs to [variables][variable]. A flow can have one or more executions running at any time, each with their own variables.
+
+- See [Executions in Development][] for more information regarding working with executions in [{{% ctx %}} Gateway][CORTEX Gateway].
+- See [Executions in Production][] for more information regarding running executions in the [Execution Service][].
+
+## Anatomy of an Execution
+
+{{< figure src="/images/execution-in-grid.PNG" >}}
+
+| Property | Notes | Example |
+|-------------------|------------------------------------------------------------|-----------------------------------------------------------|
+| Status Icon | The Icon representing the current Status of the execution | A list of [statuses][Execution Status] can be found below |
+| Started At | The date and time that the execution was started | `6 Sep 2022 09:27:45` |
+| Updated At | The date and time of the last update for the execution | `6 Sep 2022 09:27:46` |
+| Status | The status of the execution | A list of [statuses][Execution Status] can be found below |
+| Block Type | The block the execution is currently on | `Set Variable` |
+| Block Description | The description of the block the execution is currently on | `Set Variable` |
+| Workspace Name | The name of the workspace the execution is currently in | `Setup and Run Child-Flow` |
+| Flow Name | The name of the flow the execution is currently running | `Parent-Flow` |
+
+When a [flow][] starts the execution of a child flow using the [Run Flow][] block, any child executions will be shown within a tree in the [Executions Grid][], for example:
+
+{{< figure src="/images/child-execution-in-grid.PNG" >}}
+
+### Execution Status
+
+| Status | Description |
+|-----------|------------------------------------------------------------------------------------------------------------------------------------------------|
+| Running | The execution is currently executing |
+| Pausing | The execution is in the process of pausing - e.g. a long running block may have to finish before the execution is paused |
+| Paused | The execution is paused on top of a block - before the block starts to execute |
+| | The execution is paused at a breakpoint on top of a block - before the block starts to execute |
+| | The execution is paused on the output port of a block - after the block has executed but before the execution has selected which block is next |
+| Exception | The execution is paused on the exception output port - after the block has thrown an exception when `break on exception` is turned on |
+| Stopping | The execution is in the process of stopping - e.g. a long running block may have to finish before the execution is stopped |
+| Stopped | The execution has ended after having been manually stopped |
+| Ended | The execution has ended normally |
+| Error | The execution has ended after having thrown an exception that was not handled |
+
+## Execution Context
+
+Executions have their own context that contains specific information about the current execution. This can be accessed via the built-in `_executionContext` [variable][] and currently contains the following properties:
+
+- [Initiator][]
+- [Extensions][]
+
+### Initiator
+
+The initiator is a read-only property that contains the following information about the user that initiated the execution:
+
+- `Name`: The name of the user that initiated the execution.
+- `AuthenticationType`: The authentication type of the user that initiated the execution.
+- `IsAuthenticated`: A boolean value indicating if the user that initiated the execution is authenticated. This should always be `true`.
+- `Claims`: A list of claims associated with the user that initiated the execution.
+
+The values can be accessed using [property expression][] or dictionary [index expressions][] syntax, as follows:
+
+```csharp
+($)_executionContext.Initiator.Name
+```
+
+```csharp
+($)_executionContext.Initiator["Name"]
+```
+
+### Extensions
+
+The `Extensions` property can be used to store additional information. This data will be accessible to all blocks within the execution, including child executions.
+
+A value can be added to the `Extensions` property using the [expression editor][], using the dictionary [index expressions][] syntax, for example:
+
+```csharp
+($)_executionContext.Extensions["key"] = "value";
+```
+
+The value can be accessed in the same way, for example:
+
+```csharp
+($)_executionContext.Extensions["key"]
+```
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Variables][]
+
+### Related Data Types
+
+- [All Data Types][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Execution Status]: {{< ref "#execution-status" >}}
+[Extensions]: {{< ref "#extensions" >}}
+[Initiator]: {{< ref "#initiator" >}}
+
+[Executions in Development]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.MainDoc" >}}
+[Executions in Production]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInProduction.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[All Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+
+[CORTEX Gateway]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.MainDoc" >}}
+[Executions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.ExecutionsGrid.MainDoc" >}}
+
+[Execution Service]: {{< url path="Cortex.Reference.Apis.CortexInnovation.ExecutionApplication.Services.ExecutionService.MainDoc" >}}
+
+[Run Flow]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlow.MainDoc" >}}
+
+[expression editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[index expressions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.IndexExpressions" >}}
+[Property expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.PropertyExpressions" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/_index.md
new file mode 100644
index 000000000..a313a26d3
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Flows"
+linkTitle: "Flows"
+description: "Information regarding what a flow is, how to call other flows and handling exceptions within a flow."
+weight: 1
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/calling-other-flows.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/calling-other-flows.md
new file mode 100644
index 000000000..aefabfb8b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/calling-other-flows.md
@@ -0,0 +1,75 @@
+---
+title: "Calling Other Flows"
+linkTitle: "Calling Other Flows"
+description: "Information regarding calling, and passing data to, other flows."
+weight: 100
+---
+
+# {{% param title %}}
+
+## Summary
+
+A [flow][] may trigger the execution of another [flow][].
+
+## Calling Another Flow
+
+A [flow][] can be called from another [flow][] in the following ways:
+
+- Using the [Run Flow][] block to trigger the execution of another flow directly
+- Using the [Execute HTTP Request][] block to trigger a flow through the API Gateway service (this should only be used to call [flows][flow] published in a separate {{% ctx %}} platform)
+
+### Input Variables
+
+Sometimes [flows][flow] require data to be passed to them through the use of input variables (e.g. a flow used to log errors may require a file path for where the logs are saved).
+
+Input variables can be passed into flows in the following ways:
+
+- For the [Run Flow][] block, input variables are configured using the Inputs property; for more information see [Run Flow Example][]
+- For the [Execute HTTP Request][] block, input variables are configured within the body of the HttpRequest; for more information see example of [Calling Another Flow][]
+
+### Output Variables
+
+Sometimes [flows][flow] may return data through the use of output variables (e.g. a flow used to interact with a database may return its results).
+
+Output variables are returned to the calling flow in the following ways:
+
+- For the [Run Flow][] block, output variables are saved to the Outputs property; for more information see [Run Flow Example][]
+- For the [Execute HTTP Request][] block, output variables are returned within the ResponseBody of the HttpResponse property; for more information see example of [Calling Another Flow][]
+
+## Remarks
+
+### Known Limitations
+
+#### Flows can only be Called Synchronously
+
+Currently it is only possible to call other [flows][flow] synchronously; this means the calling flow will wait for the called flow to complete its [execution][] before continuing.
+
+In the future it will be possible to call flows asynchronously; this means the calling flow will continue after the called flow starts its [execution][] without waiting for the called flow to complete.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Executions][]
+
+### Related Blocks
+
+- [Run Flow][]
+- [Execute HTTP Request][]
+
+### External Documentation
+
+None
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Run Flow]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlow.MainDoc" >}}
+[Run Flow Example]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlow.RunningAFlow" >}}
+[Execute HTTP Request]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteHttpRequest.ExecuteHttpRequest.MainDoc" >}}
+[Calling Another Flow]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteHttpRequest.ExecuteHttpRequest.CallingAnotherFlow" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/handling-exceptions-within-a-flow.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/handling-exceptions-within-a-flow.md
new file mode 100644
index 000000000..f91fbc8b4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/handling-exceptions-within-a-flow.md
@@ -0,0 +1,68 @@
+---
+title: "Handling Exceptions within a Flow"
+linkTitle: "Handling Exceptions within a Flow"
+description: "Information regarding handling exceptions at different levels within a flow."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+Exceptions within a flow can be handled at the following levels:
+
+- The [block level][] (Highest Priority)
+- The [workspace level][]
+- The [flow level][] (Lowest Priority)
+
+The [Handle Flow Exception][] block, which is located on the top-level [workspace][], handles any exceptions that are not handled at the [block][block level] or [workspace level][].
+
+For more information, see [Handling Exceptions][].
+
+## Remarks
+
+### Flow cannot be re-entered from the Handle Flow Exception Workspace
+
+Is it not possible to re-enter a flow once a [flow execution][] enters the [workspace][] of the [Handle Flow Exception][] block.
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Executions][]
+- [Exceptions][]
+
+### Related Blocks
+
+- [Handle Flow Exception][]
+
+### External Documentation
+
+None
+
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[block level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.BlockLevel" >}}
+[flow level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.FlowLevel" >}}
+[workspace level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.WorkspaceLevel" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[flow execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[Handle Workspace Exception block]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/what-is-a-flow.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/what-is-a-flow.md
new file mode 100644
index 000000000..f5a2cf20e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/flows/what-is-a-flow.md
@@ -0,0 +1,208 @@
+---
+title: "What is a Flow?"
+linkTitle: "What is a Flow?"
+description: "Information regarding the anatomy of a flow, starting flows, grouping logic within a flow, and handling exceptions within a flow."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+A flow is an object in [{{% ctx %}} Gateway][CORTEX Gateway] that contains the logic and actions (in the form of [blocks][] and [workspaces][]) that is able to be executed on a {{% ctx %}} platform.
+
+## Anatomy of a Flow
+
+There are two types of flows, which are used for different purposes:
+
+* [Process][]
+* [Activity][]
+
+{{% alert title="Note" %}}
+Prior to version 2024.9, there was a single type of flow named `Flow`.
+As of 2024.9, `Flow` has been renamed to `Activity`.
+{{% /alert %}}
+
+### Process
+
+Processes are a type of [Flow][] that can contain multiple [Activities][Activity] and are used to model high-level business processes.
+
+{{< figure src="/images/top-level-workspace-process.svg" title="Example Process" >}}
+
+* Processes flow from left to right
+* Processes can call other processes
+* Processes can call activities
+* Processes only contain a subset of blocks as they are intended to model high-level business processes, not low-level implementation of tasks or actions
+* Processes are optional an automation solution, but are useful for organizing and structuring the logic of a solution
+
+### Activity
+
+Activities are a type of [Flow][] that are used to model low-level tasks or actions.
+
+{{< figure src="/images/top-level-workspace-activity.svg" title="Example Activity" >}}
+
+* Activities flow from top to bottom
+* Activities can call other activities
+* Activities cannot call processes
+* Activities contain all blocks as they are intended to model low-level tasks or actions
+* Activities are required in an automation solution, as they are the building blocks of the solution
+
+## Composition of a Flow
+
+Flows are composed of the following:
+
+* [Workspace][Workspace ref]
+* [Start Flow block][]
+* [Action blocks][]
+* [Decision blocks][Decision blocks ref]
+* [Workspace blocks][]
+* [End Flow block][]
+* [Handle Flow Exception block][]
+
+### Workspace
+
+The [Top-Level Workspace][] within the flow.
+
+* Canvas on which blocks are placed and connected to create the flow logic
+* See [Workspace][workspaces]
+
+### Start Flow block
+
+Identifies where the [flow execution][] will start.
+
+* Automatically created when the flow is created
+* Cannot be deleted
+* See [Start Flow][] block
+
+### Action blocks
+
+Performs a specific action.
+
+* Icon on block indicates the nature of the action
+* See [Blocks][Reference Blocks]
+
+### Decision block
+
+Causes the [flow execution][] to branch, dependent on a condition.
+
+* See [Decision Blocks][Decision Blocks]
+
+### Workspace blocks
+
+Contains grouped flow logic.
+
+* See [Workspace][Workspace Block] block
+
+### End Flow block
+
+Ends the [flow execution][].
+
+* Automatically created when the flow is created
+* See [End Flow][] block
+
+### Handle Flow Exception block
+
+Handles [flow level exceptions][], thrown during the [flow execution][].
+
+* Automatically created when the flow is created
+* Cannot be deleted
+* See [Handle Flow Exception][] block
+
+## Grouping Logic within a Flow
+
+All the logic of a flow can exist on the [Top-Level Workspace][], however, this can quickly become difficult to maintain and understand as the numbers of blocks increase. Blocks can be grouped into workspaces in order to reduce the complexity and make the flow easier to maintain.
+
+A [Workspace][Workspace Block] block can opened by double clicking it, showing its workspace canvas and the logic inside; this could include blocks for executing specific functions or other workspaces to help separate the logic of the flow further.
+
+For further information about [workspaces][workspace], see [Workspaces][workspaces].
+
+## Starting a Flow Execution
+
+A [flow execution][flow execution] may be started by:
+
+* [Debugging][Executions in Development] a flow in [{{% ctx %}} Gateway][CORTEX Gateway]
+* Triggering it by making an HTTP request from an external source (e.g. a web application or web hooks)
+* Triggering it using the [Run Flow][] and [Run Flow Async][] block
+* Triggering it using predefined events (future) (e.g. on receipt of an email)
+* Scheduling it to execute at predetermined times
+
+## Exceptions within a Flow
+
+Flows support hierarchical exception handling at any level within the flow.
+
+Exceptions can be handled:
+
+* At the [block][] level; for further information, see [Handling Exceptions within a Block][]
+* At the [workspace][] level; for further information, see [Handling Exceptions within a Workspace][]
+* At the flow level; for further information, see [Handling Exceptions within a Flow][]
+
+## Remarks
+
+### Known Limitations
+
+#### Cannot have a Handle Workspace Exception block on the flow's Top-Level Workspace
+
+Currently, it is not possible to have a [Handle Workspace Exception][] block on the [Top-Level Workspace][] of a flow. In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+* [Workspaces][workspaces]
+* [Blocks][blocks]
+* [Executions][]
+* [Exceptions][]
+
+### Related Blocks
+
+* [Start Flow][]
+* [End Flow][]
+* [Run Flow][]
+* [Run Flow Async][]
+* [Handle Flow Exception][]
+* [Handle Workspace Exception][]
+* [Workspace][Workspace Block]
+
+### External Documentation
+
+None
+
+[Activity]: {{< ref "#activity" >}}
+[Process]: {{< ref "#process" >}}
+[Flow]: {{< ref "#summary" >}}
+
+[Start Flow block]: {{< ref "#start-flow-block" >}}
+[Action blocks]: {{< ref "#action-blocks" >}}
+[Decision blocks ref]: {{< ref "#decision-block" >}}
+[Workspace blocks]: {{< ref "#workspace-blocks" >}}
+[End Flow block]: {{< ref "#end-flow-block" >}}
+[Handle Flow Exception block]: {{< ref "#handle-flow-exception-block" >}}
+[Workspace ref]: {{< ref "#workspace" >}}
+
+[blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Handling Exceptions within a Block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.HandlingExceptionsWithinABlock.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Executions in Development]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.MainDoc" >}}
+[Handling Exceptions within a Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.HandlingExceptionsWithinAFlow.MainDoc" >}}
+[flow level exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.FlowLevel" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[flow execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[Handling Exceptions within a Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.HandlingExceptionsWithinAWorkspace.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+[Top-Level Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.TopLevelWorkspace" >}}
+
+[Reference Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Decision Blocks]: {{< url path="Cortex.Reference.Blocks.Decisions.MainDoc" >}}
+[Workspace Block]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+[Start Flow]: {{< url path="Cortex.Reference.Blocks.Flows.StartFlow.StartFlow.MainDoc" >}}
+[End Flow]: {{< url path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" >}}
+
+[CORTEX Gateway]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.MainDoc" >}}
+
+[Run Flow]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlow.MainDoc" >}}
+
+[Run Flow Async]: {{< url path="Cortex.Reference.Blocks.Flows.RunFlow.RunFlowAsync.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/_index.md
new file mode 100644
index 000000000..978085070
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Messages"
+linkTitle: "Messages"
+description: "Information regarding what a message is."
+weight: 700
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/what-is-a-message.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/what-is-a-message.md
new file mode 100644
index 000000000..c5b01b7f0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/messages/what-is-a-message.md
@@ -0,0 +1,107 @@
+---
+title: "What is a Message?"
+linkTitle: "What is a Message?"
+description: "Information regarding the anatomy of a message, when a message will occur, and using messages to navigate to issues within a flow."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+When [Starting an Execution in Development][] using the [Start an execution][] button, the [flow][] will be [validated][]; if there are issues with the flow, [messages][] explaining the issues will be displayed in the [Messages Grid][].
+
+Some examples of issues that can be raised are:
+
+- [Blocks][block] using undefined [variables][variable]
+- [Blocks][block] using [variables][variable] with mismatched [data types][data type]
+- [Input variables][] that have not been initialised
+
+For a complete list see [Validation][] messages.
+
+## Anatomy of a Message
+
+{{< figure src="/images/messages-grid.PNG" >}}
+
+Related messages are grouped by the component affected (e.g. A [block][], or the [Settings Editor][])
+
+Each message row contains the following:
+
+| Property | Notes |
+|----------|-------|
+| Location | Path to the specific part of the component that has caused the issue |
+| Summary | Short description of the issue |
+| Details | Further information about the issue. This may also contain help for resolving the issue |
+
+## Navigating to the Location of an issue from a message
+
+Double clicking on a message within the [Messages Grid][] will navigate the browser to the affected location.
+
+## Remarks
+
+### Known Limitations
+
+#### It is not possible to navigate to a nested literal property from a message
+
+It is not possible to navigate to a nested literal property from a message, clicking the message will cause the browser to navigate to the last [property][] of the top-level [literal editor][] that contains the issue.
+
+In future this limitation may be removed.
+
+#### It is not possible to navigate to the Settings Editor from a message
+
+It is not possible to navigate to the [Settings Editor][] from a message, clicking the message will do nothing.
+
+In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Blocks][]
+- [Variables][]
+- [Data Types][]
+- [Executions][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### Related Data Types
+
+- [All Data Types][]
+
+### External Documentation
+
+None
+
+[messages]: {{< ref "#anatomy-of-a-message" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[literal editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.LiteralEditor.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[Input variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.FlowInputVariable" >}}
+
+[Data Types]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+[data type]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.MainDoc" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[Starting an Execution in Development]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.MainDoc" >}}
+[validated]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.ValidatingAFlow" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[All Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+
+[Validation]: {{< url path="Cortex.Reference.Messages.Validation.MainDoc" >}}
+
+[Start an execution]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainPanel.StartAnExecution" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
+[Settings Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.SettingsEditor" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/_index.md
new file mode 100644
index 000000000..50fc8fe53
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Packages"
+linkTitle: "Packages"
+description: "Information regarding what a package is."
+weight: 800
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/what-is-a-package.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/what-is-a-package.md
new file mode 100644
index 000000000..5b0ca2891
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/packages/what-is-a-package.md
@@ -0,0 +1,71 @@
+---
+title: "What is a Package?"
+linkTitle: "What is a Package?"
+description: "Information regarding the anatomy of a package, creating a package, publishing a package, and starting a flow execution."
+weight: 1
+---
+
+
+# {{% param title %}}
+
+## Summary
+
+A {{% ctx %}} Package contains a set of independent or related flows that together form an automation solution.
+
+Users with the Admin role can use the [{{% ctx %}} Package Management][] feature to manage packages, including [creating][CreatePackage] and [publishing][Publish] them.
+
+## Anatomy of a Package
+
+{{< figure src="/images/Package Management.png" >}}
+
+## Actions
+
+### Creating a Package
+
+Packages are immutable; once a package has been [created][CreatePackage], it is not possible to add flows, delete flows or update the version of flows contained within it. However, a [new version][] of the same package may be created from any previous version, which can contain different or updated flows.
+
+### Publishing a Package
+
+Packages must be [published][Publish] to the {{% ctx %}} Execution Services, making the flows within them available for execution; it is not possible to publish flows unless they are contained in a package.
+
+It is possible to [publish][Publish] multiple versions of the same package to the {{% ctx %}} Execution Services, with each package version acting independently of the others; this permits CI/CD operations within the same {{% ctx %}} platform.
+
+### Starting a Flow Execution
+
+Executions of flows contained within published packages can be triggered via a REST Request. This can be [access controlled][authorisation] for each flow in the package using OAuth2 authorisation, which can be independently set on each package version, and can be restricted based on groups in the configured LDAP server.
+
+A published package may be set as the [Default Package][], which will be used if the Package Name is not explicitly identified in a REST Request to execute a flow. Additionally, within each package, a published Package Version may be set as the [Default Package Version][]; this will be used if the Package Version is not explicitly identified in a REST Request to execute a flow.
+
+### Other Actions
+
+{{% ctx %}} Package Management also allows for:
+
+* [Exporting][] a package version to a {{% ctx %}} Package file for archiving or [importing][Importing] to a different {{% ctx %}} Gateway
+* [Importing][] a package version from a {{% ctx %}} Package file
+* [Defining schedules][] on different package versions to execute flows at pre-determined times; flows within a package version may be assigned any number of schedules.
+* [Defining triggers][] on different package versions to execute flows on receipt of an SNMP Trap; flows within a package version may be assigned any number of triggers.
+* Viewing the total number of [running flow executions][] per package, viewing the individual [running flow executions][] associated with a package version, and aborting [running flow executions][].
+
+## See Also
+
+### Related Guides
+
+* [Package Management Overview][]
+* [Package Definitions Grid][]
+* [Package Version Editor][]
+
+[{{% ctx %}} Package Management]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.MainDoc" >}}
+[authorisation]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Authorisation" >}}
+[CreatePackage]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.CreatePackage" >}}
+[Default Package]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.SetDefaultPackage" >}}
+[Default Package Version]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.SetDefaultVersion" >}}
+[Defining schedules]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Schedules" >}}
+[Defining triggers]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Triggers" >}}
+[Exporting]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Export" >}}
+[Importing]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.Import" >}}
+[new version]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.CreateNewVersion" >}}
+[Package Management Overview]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.Overview.MainDoc" >}}
+[Package Definitions Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageDefinitionsGrid.MainDoc" >}}
+[Package Version Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.MainDoc" >}}
+[Publish]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.Publish" >}}
+[running flow executions]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Admin.Packages.PackageVersionEditor.RunningExecutions" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/_index.md
new file mode 100644
index 000000000..f18e70787
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Variables"
+linkTitle: "Variables"
+description: "Information regarding what a variable is, using variables, and variable scopes."
+weight: 300
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/using-variables.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/using-variables.md
new file mode 100644
index 000000000..bb31094b1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/using-variables.md
@@ -0,0 +1,212 @@
+---
+title: "Using Variables"
+linkTitle: "Using Variables"
+description: "Information regarding using variables in the Variable and Expression editors."
+weight: 200
+---
+
+# {{% param title %}}
+
+## Summary
+
+There are a number of ways to use variables:
+
+- The [Variable Editor][Using Variables: Variable Editor] can be used to create and select variables
+- The [Expression Editor][Using Variables: Expression Editor] can be used to include variables within expressions
+
+## Variable Editor
+
+The Variable Editor allows the developer to [create][] and [use][] variables whilst configuring a [block][].
+
+### Creating a Variable
+
+If a variable does not already exist, the [Variable Editor][] can be used to [create][Creating Variables] a new one at the [scope][] of the selected [block][].
+
+If the variable name is invalid (does not conform with the [C# identifier naming rules][]) then there will be no option to create a new variable.
+
+### Using a Variable
+
+The [Variable Editor][] provides a list of variables that are available at the [scope][] of the selected [block][].
+
+Typing any text in the [Variable Editor][] will filter the available variables, showing any variable whose name or scope contains the text.
+
+The Variable Editor also allows for:
+
+- [Using Items in Collections][]
+- [Using Properties of Data Types][]
+- [Using Methods of Data Types][]
+
+#### Using Items in Collections
+
+Variables that contain a [Collection][] or [String][] data type can have their respective items or characters accessed using index notation:
+
+- `[0]` gets the first item
+- `[1]` gets the second item
+- `["key"]` gets the item with the key `"key"`.
+
+Ranges can also be used within index notation:
+
+- `[0..3]` gets three items from the first item (inclusively) (i.e. the first, second, and third item)
+- `[^1]` gets the last item
+- `[^2]` gets the second to last item
+- `[..]` gets all items
+- `[..3]` gets three items from the first item (inclusively) (i.e. the first, second, and third item)
+- `[3..]` gets all items from the fourth item (inclusively) (i.e. the fourth to the last item)
+
+In the examples below assume:
+
+- `($)List` has been set to `[1, 2, 3, 4, 5]`
+- `($)Dictionary` of type `Dictionary` has been set to `{"FirstKey": 1, "SecondKey": 2}`
+- `($)Structure` has been set to `{"FirstKey": 1, "SecondKey": [1, 2, 3]}`
+- `($)String` has been set to `"Some Text"`.
+
+| Text | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `List[2]` | `3` | The third item in the list is returned |
+| `List[0..2]` | `[1, 2]` | The first and second item in the list are returned |
+| `List[^2]` | `4` | The second to last item in the list is returned |
+| `List[^2..^0]` | `[4, 5]` | The second to last and the last item in the list are returned |
+| `List[1..^1]` | `[2, 3, 4]` | The second item to the second to last item in the list are returned |
+| `List[..]` | `[1, 2, 3, 4, 5]` | All items in the list are returned |
+| `List[..2]` | `[1, 2]` | The first item and the second item in the list are returned |
+| `List[2..]` | `[3, 4, 5]` | The third item to the last item in the list are returned |
+| `Dictionary["FirstKey"]` | `1` | The item with the key `"FirstKey"` is returned |
+| `Structure["SecondKey"]` | `[1, 2, 3]` | The item with the key `"SecondKey"` is returned |
+| `Structure["SecondKey"][0]` | `1` | The first item within the item with key `"SecondKey"` is returned |
+| `String[0]` | `'S'` | The first character in the string is returned |
+
+#### Using Properties of Data Types
+
+[Properties][] can be used to read data from and/or write data to a variable. The properties accessible are defined by the [Data Type][], and information regarding properties can be found in the relevant documentation for that [Data Type][].
+
+[Properties][] can be read-write, read-only, or write-only (extremely rare) depending on the access specified by the [Data Type][].
+
+Whilst [Structures][Structure] are [Collections][Collection], they also allow for their keys to be accessed as [properties][Properties].
+
+In the examples below assume:
+
+- `($)List` has been set to `[1, 2, 3]`
+- `($)TimePeriod` has been set to `{"Years": 1, "Months": 0, "Days": 0, "Hours": 0, "Minutes": 0, "Seconds": 0, "Milliseconds": 0}`
+- `($)Structure` has been set to `{"FirstKey": 1, "SecondKey": 2}`
+
+| Text | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `List.Count` | `3` | Read-only property, this only works in [Input Properties][] |
+| `TimePeriod.Years` | `1` | Read-write property, this can be used in [Input][Input Properties], [Output][Output Properties], and [InputOutput Properties][]. The result column shows reading the property; writing to the property can be achieved by using any [Output Property][Output Properties]. |
+| `Structure.FirstKey` | `1` | Read-write property, this can be used in [Input][Input Properties], [Output][Output Properties], and [InputOutput Properties][]. The result column shows reading the property; writing to the property can be achieved by using any [Output Property][Output Properties]. |
+
+#### Using Methods of Data Types
+
+[Methods][] can be used to execute specific functionality. The methods accessible are defined by the [Data Type][], and information regarding methods can be found in the relevant documentation for that [Data Type][].
+
+[Methods][] can have parameters passed into them that are then used to execute the functionality, not all methods have parameters. The same method can be defined multiple times, each with different sets of parameters.
+
+In the examples below assume the variable `($)Int` has been set to `1`.
+
+| Text | Result | Notes |
+|--------------------------------|---------|------------------------------------|
+| `Int.ToString()` | `"1"` | Method without parameters |
+| `Int.ToString("P0")` | `"100%"` | The `ToString()` method can take parameters in order to format the result. In this case `1` was converted into a percent with zero decimal places |
+
+## Expression Editor
+
+Variables are named containers for storing values of any [data type][Data Type]; a variable can be included within [expressions][] created using the [Expression Editor][]. A variable is used by prefixing the variable's name with `($)` (e.g. `($)VariableName`).
+
+## Remarks
+
+### Case Sensitivity
+
+When using variables in the [Variable][Variable Editor] or [Expression Editor][], the names are case insensitive. For example, `List` is the same as `list`.
+
+When using [properties][Properties] or [methods][Methods] of any variable, or items in [Collections][Collection] (e.g. [Dictionaries][Dictionary], [Structures][Structure] etc.), their names are case sensitive.
+
+For Example:
+
+| Text | Notes |
+|--------------------------------|------------------------------------|
+| `FlowException.Message` | `Message` property cannot be accessed using `FlowException.message` |
+| `Int.ToString()` | `ToString()` method cannot be accessed using `Int.toString()` |
+| `Dictionary["Item1"]` | `"Item1"` item cannot be accessed using the key `Dictionary["item1"]` |
+
+### Known Limitations
+
+#### When using variables of the same name the closest scoped is used
+
+It is possible to create multiple variables with the same name in the [Variables Grid][]. When using the same name in different [workspaces][workspace], the variable with the closest scope will be used.
+
+For example:
+
+- `Top-Level` workspace has the variable `($)Variable`
+- `Child-Level` workspace also has the variable `($)Variable`
+
+When executing a block in `Child-Level` that uses `($)Variable`, the variable that is used is the variable defined in `Child-Level`.
+
+This may change in future to allow developers to specifically select which of the variables with the same name is used in this scenario.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Block Properties][]
+
+### Related Data Types
+
+- [All Data Types][Data Type]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Using Variables: Variable Editor]: {{< ref "#variable-editor" >}}
+[Using Variables: Expression Editor]: {{< ref "#expression-editor" >}}
+[create]: {{< ref "#creating-a-variable" >}}
+[use]: {{< ref "#using-a-variable" >}}
+
+[Using Items in Collections]: {{< ref "#using-items-in-collections" >}}
+[Using Properties of Data Types]: {{< ref "#using-properties-of-data-types" >}}
+[Using Methods of Data Types]: {{< ref "#using-methods-of-data-types" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[Input Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[Output Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[InputOutput Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Property Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.MainDoc" >}}
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[expressions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.Expressions" >}}
+[Creating Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.CreatingVariables" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Set Variable]: {{< url path="Cortex.Reference.Blocks.Variables.SetVariable.SetVariable.MainDoc" >}}
+
+[Data Type]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[Collection]: {{< url path="Cortex.Reference.DataTypes.Collections.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[Exception]: {{< url path="Cortex.Reference.DataTypes.Exceptions.Exception.MainDoc" >}}
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+
+[Properties]: {{< url path="Cortex.Reference.Glossary.P-T.PropertyCSharp" >}}
+[Methods]: {{< url path="Cortex.Reference.Glossary.K-O.Method" >}}
+[programming language]: {{< url path="Cortex.Reference.Glossary.P-T.ProgrammingLanguage" >}}
+
+[C# identifier naming rules]: {{< url path="MSDocs.CSharp.IdentifierNamingRules" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/variable-scopes.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/variable-scopes.md
new file mode 100644
index 000000000..16c89f155
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/variable-scopes.md
@@ -0,0 +1,99 @@
+---
+title: "Variable Scopes"
+linkTitle: "Variable Scopes"
+description: "Information regarding variable scopes, including: what they are, creating variables at a specific scope, and changing a variable's scope."
+weight: 200
+---
+# {{% param title %}}
+
+## Summary
+
+Each [workspace][] in a [flow][] has a scope. A scope is where [variables][variable] are defined and controls where they can be used.
+
+Variables can only be used in the workspace of the scope they are defined in and any descendant workspaces. Only variables in scope will be available in the [Variable Editor][], or the [Expression Editor][] using [snippets][]. For an example see [Accessing Variables from Other Scopes][].
+
+When the [flow execution][execution] exits a workspace, any local-scope variables that have been declared in that workspace are deleted and their values, if any, are lost.
+
+## Accessing Variables from Other Scopes
+
+For example, the table below shows a hierarchy of workspaces and which variables are accessible to each workspace due to their scope:
+
+| Workspace Name | Parent Workspace | Defined Variables | Accessible Variables |
+|----------------|------------------|-------------------|---------------------|
+| Top-Level Workspace | N/A |
GlobalVarA
GlobalVarB
|
GlobalVarA
GlobalVarB
|
+| ChildWorkspace1 | Top-Level Workspace |
ChildVarA
ChildVarB
|
GlobalVarA
GlobalVarB
ChildVarA
ChildVarB
|
+| ChildWorkspace2 | Top-Level Workspace |
ChildVarC
ChildVarD
|
GlobalVarA
GlobalVarB
ChildVarC
ChildVarD
|
+| GrandChildWorkspace1 | ChildWorkspace1 |
GrandChildVarA
GrandChildVarB
|
GlobalVarA
GlobalVarB
ChildVarA
ChildVarB
GrandChildVarA
GrandChildVarB
|
+| GrandChildWorkspace2 | ChildWorkspace2 |
GrandChildVarC
GrandChildVarD
|
GlobalVarA
GlobalVarB
ChildVarC
ChildVarD
GrandChildVarC
GrandChildVarD
|
+
+## Creating Variables at a Specific Scope
+
+[Variables][variable] can be created by using the [Variables Grid][Grid: Creating Variables], or through the use of the [Variable Editor][Editor: Creating Variables]. When a new variable is created, it is created in the scope of the currently selected [workspace][]. It is possible to [Change a Variable's Scope][Changing a Variable's Scope]
+
+## Changing a Variable's Scope
+
+A [variable's][variable] scope can be changed by using the [Variables Grid][Grid: Changing a Variable's Scope].
+
+## Remarks
+
+### Known Limitations
+
+#### When using variables of the same name the closest scoped is used
+
+It is possible to create multiple [variables][variable] with the same name in the [Variables Grid][]. When using the same name in different [workspaces][workspace], the variable with the closest scope will be used.
+
+For example:
+
+- `Top-Level` workspace has the variable `($)Variable`
+- `Child-Level` workspace also has the variable `($)Variable`
+
+When executing a block in `Child-Level` that uses `($)Variable`, the variable that is used is the variable defined in `Child-Level`.
+
+This may change in future to allow developers to specifically select which of the variables with the same name is used in this scenario.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Block Properties][]
+- [Executions][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Accessing Variables from Other Scopes]: {{< ref "#accessing-variables-from-other-scopes" >}}
+[Changing a Variable's Scope]: {{< ref "#changing-a-variables-scope" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Editor: Creating Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.CreatingVariables" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.MainDoc" >}}
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[Grid: Creating Variables]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[Grid: Changing a Variable's Scope]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.ModifyScope" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[snippets]: {{< url path="Cortex.Reference.Glossary.P-T.Snippets" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/what-is-a-variable.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/what-is-a-variable.md
new file mode 100644
index 000000000..5de898960
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/variables/what-is-a-variable.md
@@ -0,0 +1,261 @@
+---
+title: "What is a Variable?"
+linkTitle: "What is a Variable?"
+description: "Information regarding the anatomy of a variable, using variables at design and runtime, and variable typing."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+A variable is a named container for storing data that can then be used in [Block Properties][].
+
+Data in a variable can be read, updated, or removed by different blocks. Examples of these include:
+
+- Add an item to a [List][]
+- Remove an item from a [List][]
+- Get an item from a [Dictionary][]
+- Set an item in a [Dictionary][]
+
+## Anatomy of a Variable
+
+{{< figure src="/images/variables-grid.PNG" >}}
+
+Variables have the following properties that can be configured in the [Variables Grid][]:
+
+| Variable Property | Notes |
+|-------------|-------------|
+| Description | Description of the variable's purpose |
+| Name | Name of the variable |
+| Type | Will default to variable. Read-only, reserved for future use |
+| Set Default Value? | Sets the variable to be initialised to the **Default Value** if set to `true`, otherwise **Default Value** is ignored |
+| Default Value | The value to initialise the variable to if **Set Default Value?** is set to `true`. See [Variables with a Default Value][] |
+| Is Input Variable? | Marks the variable as an input if set to `true`, requiring data to be passed into the variable when the flow is triggered |
+| Is Output Variable? | Marks the variable as an output if set to `true`. All output variables will be returned as items in a [Structure][]. See [Output Variables Structure][] |
+
+### Variables with a Default Value
+
+Variables can be initialised with a default value. The Default Value can be set to any valid expression or literal, but cannot include any variables.
+
+For example, the following expression is valid as it does not use any variables:
+
+```c#
+"Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
+```
+
+The following expression is invalid as it uses the `($)ServerName` variable:
+
+```c#
+$@"Server={($)ServerName};Database=myDataBase;User Id=myUsername;Password=myPassword;"
+```
+
+### Output Variables Structure
+
+When any variables have their `Is Output Variable?` property set to `true`, they will be returned to the caller as items in a [Structure][] when the flow ends.
+
+In the following example `($)TotalUnreadEmails` and `($)FoldersWithUnreadEmails` are both set as outputs and the following [Structure][] is returned:
+
+```json
+{
+ "TotalUnreadEmails":12,
+ "FoldersWithUnreadEmails": {
+ "Inbox": 8,
+ "Junk": 4
+ }
+}
+```
+
+## Variables at Design Time
+
+The [Variables Grid][] is used to [create][], [modify][], and [delete][] variables. It is opened by clicking the `Variables` tab on the [bottom panel][] of the [Flow Editor][]. For more information see [Variables Grid][].
+
+Variables can also be created through the use of the [Variable Editor][]. For more information see [Creating Variables][].
+
+## Variables at Runtime
+
+### Initialising Variables
+
+Variables must be initialised with data before they can be used in a block.
+
+If an [Input][] or [InputOutput][] property [uses a variable][] that has not been initialised, a [Message][Messages] will be returned stating `Variable is not initialised`, and the name of the variable will be included within the details of the message. The [Message][Messages] will be:
+
+- Displayed in the [Messages Grid][] when [debugging a flow][] in [{{% ctx %}} Gateway][CORTEX Gateway]
+- Returned as an exception to the caller when a flow is triggered via the [API Gateway Service][]
+
+Variables can be initialised in the following ways:
+
+- Using a [Flow Input Variable][]
+- Using the [Default Value][]
+- Using a [Block Output Property][]
+
+#### Flow Input Variable
+
+If a variable has its `Is Input Variable?` property set to `true`, and no [Default Value][] has been set, then a value must be provided for the variable when the flow is triggered. When the execution starts, the variable is initialised with the value provided.
+
+#### Default Value
+
+If a variable has its `Set Default Value?` property set to `true`, it will be initialised with the `Default Value` provided when the flow is executed.
+
+If a variable has its `Is Input Variable?` and `Set Default Value?` properties set to `true`, then it will be initialised with the value provided when the flow is triggered. If no value is provided then it will be initialised with the `Default Value`.
+
+#### Block Output Property
+
+[Output Properties][Output] are used to save values to a variable during the execution of a block, regardless of whether the variable is already initialised or not. The act of saving to an uninitialised variable will initialise it.
+
+### Viewing Variables
+
+When [debugging a flow][debugging a flow] in [{{% ctx %}} Gateway][CORTEX Gateway], selecting an execution will display all initialised variables that are in [scope][] in the [Variables Viewer][].
+
+{{< figure src="/images/reference/concepts/fundamentals/variables/what-is-a-variable-variable-panel-2.png" >}}
+
+#### Viewing Basic Data Types
+
+When a variable contains a [basic data type][] (e.g. String, Integer, etc), the value will be displayed directly in the [Variables List][]. Strings will be surrounded by double quotes (e.g. `"MyString"`).
+
+#### Viewing Complex Data Types
+
+When a variable contains a [complex data type][] that is not a collection data type (e.g. Command or FlowException), the value will be displayed as `Instance of Command` or `Instance of FlowException` respectively in the [Variables List][].
+
+When a variable contains a [collection data type][Collections] (e.g. Dictionary, List, or Structure), the [Variables List][] will specify the data type and how many items the collection contains (e.g. `Dictionary with 2 item(s)`).
+
+To see the data in the variable, select the variable in the [Variables List][] and the data will be presented in the [Variable Details Viewer][].
+
+The following examples show the [Variable Details Viewer][] when showing a:
+
+- [Dictionary][Dictionary] variable
+
+{{< figure src="/images/reference/concepts/fundamentals/variables/what-is-a-variable-dictionary-panel.png" >}}
+
+- [Command][] variable
+
+{{< figure src="/images/reference/concepts/fundamentals/variables/what-is-a-variable-command-panel.png" >}}
+
+- [FlowException][] variable
+
+{{< figure src="/images/reference/concepts/fundamentals/variables/what-is-a-variable-exception-panel.png" >}}
+
+### Updating Variables
+
+[InputOutput][] and [Output][] properties are used to save values and update variables during the execution of a block.
+
+### Deleting Variables
+
+When an execution exits a [workspace][], any variables defined within that workspace's [scope][] will be deleted from the execution. This means the variables:
+
+- Are no longer accessible to the execution
+- Are no longer presented in the [Variables Viewer][] when the flow is being debugged
+
+If the execution re-enters the workspace's [scope][], any variables will be [re-initialised][Initialising Variables].
+
+## Variable Typing
+
+Variables do not have their own [data type][Data Types Concept]; they are named containers for storing data of any [data type][Data Types Concept].
+
+When a variable is used in a [Block Property][Block Properties] it is checked to ensure the data type it contains is supported by the property. For all data types apart from [dynamic][] any variables containing unsupported data types will be displayed in the [Messages Grid][], preventing the execution from starting; for variables containing [dynamic][] data types checking will be performed during the block execution, throwing an exception if the data type is unsupported.
+
+Sometimes an unsupported data type can automatically be converted to a supported type through the use of [implicit casting][implicitly cast]; if this is possible the block property will handle this without any input required by the developer. However, if this is not possible an unsupported data type must be converted to a supported type by the developer; this can be done by:
+
+- [Explicitly casting][explicitly cast] the unsupported [Data Type][Data Types]
+- Converting the unsupported [Data Type][Data Types] through the use of methods and properties (e.g. `Convert.ToInt32(($)String)` or `Int32.Parse(($)String)`)
+
+For more information on specific data type conversions, see the relevant documentation for that [Data Type][Data Types].
+
+## Remarks
+
+### Known Limitations
+
+#### Default Value can not use Variables
+
+Currently, default values cannot use variables. However, this may change in the future.
+
+For examples of valid and invalid default values see [Variables with a Default Value][].
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Block Properties][]
+- [Data Types][Data Types Concept]
+- [Executions][]
+- [Exceptions][]
+- [Messages][Messages Concept]
+
+### Related Data Types
+
+- [All Data Types][Data Types]
+
+### Related Blocks
+
+- [All Blocks][]
+
+### External Documentation
+
+None
+
+[Variables with a Default Value]: {{< ref "#variables-with-a-default-value" >}}
+[Output Variables Structure]: {{< ref "#output-variables-structure" >}}
+[Flow Input Variable]: {{< ref "#flow-input-variable" >}}
+[Default Value]: {{< ref "#default-value" >}}
+[Block Output Property]: {{< ref "#block-output-property" >}}
+[Initialising Variables]: {{< ref "#initialising-variables" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[Input]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Input" >}}
+[InputOutput]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.InputOutput" >}}
+[Output]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.Output" >}}
+[Variable Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.MainDoc" >}}
+[Creating Variables]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.VariableEditor.CreatingVariables" >}}
+[bottom panel]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MainDoc" >}}
+[Flow Editor]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.MainDoc" >}}
+
+[Data Types Concept]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.MainDoc" >}}
+[basic data type]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.BasicDataTypes" >}}
+[complex data type]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.WhatIsADataType.ComplexDataTypes" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[debugging a flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.ExecutionsInDevelopment.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Messages Concept]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.MainDoc" >}}
+[Messages]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Messages.WhatIsAMessage.MainDoc" >}}
+
+[uses a variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.UsingVariables.MainDoc" >}}
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
+
+[implicitly cast]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.ImplicitCast" >}}
+[explicitly cast]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Objects.ObjectCasting.ExplicitCast" >}}
+
+[API Gateway Service]: {{< url path="Cortex.Reference.Apis.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" >}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+
+[Data Types]: {{< url path="Cortex.Reference.DataTypes.MainDoc" >}}
+[dynamic]: {{< url path="Cortex.Reference.DataTypes.All.dynamic.MainDoc" >}}
+[Collections]: {{< url path="Cortex.Reference.DataTypes.Collections.MainDoc" >}}
+[Dictionary]: {{< url path="Cortex.Reference.DataTypes.Collections.Dictionary.MainDoc" >}}
+[List]: {{< url path="Cortex.Reference.DataTypes.Collections.List.MainDoc" >}}
+[Structure]: {{< url path="Cortex.Reference.DataTypes.Collections.Structure.MainDoc" >}}
+[Command]: {{< url path="Cortex.Reference.DataTypes.Data.Command.MainDoc" >}}
+
+[FlowException]: {{< url path="Cortex.Reference.Exceptions.Flows.FlowException.MainDoc" >}}
+
+[CORTEX Gateway]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.MainDoc" >}}
+[Variables Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesViewer" >}}
+[Variable Details Viewer]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariableDetailsViewer" >}}
+[Variables List]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.RightPanel.ExecutionViewer.VariablesList" >}}
+[Messages Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.MessagesGrid.MainDoc" >}}
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
+[create]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.CreateVariable" >}}
+[delete]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.DeleteVariable" >}}
+[modify]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.ModifyVariable" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/_index.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/_index.md
new file mode 100644
index 000000000..f49bf63c2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Workspaces"
+linkTitle: "Workspaces"
+description: "Information regarding what a workspace is, workspace scopes, and handling exceptions within a workspace."
+weight: 100
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/handling-exceptions-within-a-workspace.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/handling-exceptions-within-a-workspace.md
new file mode 100644
index 000000000..178cdbab7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/handling-exceptions-within-a-workspace.md
@@ -0,0 +1,64 @@
+---
+title: "Handling Exceptions within a Workspace"
+linkTitle: "Handling Exceptions within a Workspace"
+description: "Information regarding handling exceptions at different levels within a workspace."
+weight: 100
+---
+
+# {{% param title %}}
+
+## Summary
+
+Exceptions within a workspace can be handled at the following levels:
+
+- The [block level][] (Highest Priority)
+- The [workspace level][]
+- The [flow level][] (Lowest Priority)
+
+A single [Handle Workspace Exception][] block may be placed on a [workspace][] to handle any exceptions that are not handled at the [block level][].
+
+For more information, see [Handling Exceptions][].
+
+## Remarks
+
+### Known Limitations
+
+#### Handle Workspace Exception block can only be used once per execution of a Workspace
+
+The [Handle Workspace Exception][] block will only handle the first unhandled exception within its workspace. Subsequent unhandled exceptions are passed to the next relevant exception handling block. In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+- [Flows][]
+- [Workspaces][]
+- [Blocks][]
+- [Executions][]
+- [Exceptions][]
+
+### Related Blocks
+
+- [Handle Workspace Exception][]
+
+### External Documentation
+
+None
+
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[Handling Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.MainDoc" >}}
+[block level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.BlockLevel" >}}
+[flow level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.FlowLevel" >}}
+[workspace level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.WorkspaceLevel" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+[flow execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+
+[Workspaces]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.MainDoc" >}}
+[workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.WhatIsAWorkspace.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/what-is-a-workspace.md b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/what-is-a-workspace.md
new file mode 100644
index 000000000..72ee2c187
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/fundamentals/workspaces/what-is-a-workspace.md
@@ -0,0 +1,176 @@
+---
+title: "What is a Workspace?"
+linkTitle: "What is a Workspace?"
+description: "Information regarding the anatomy of a workspace, nested workspaces, variable scope, and handling exceptions within a workspace."
+weight: 1
+---
+
+# {{% param title %}}
+
+## Summary
+
+A workspace is used to group logic and actions within a [flow][], in order to reduce the complexity and make the flow easier to maintain.
+
+## Anatomy of a Workspace
+
+### Top-Level Workspace
+
+A flow can only contain one Top-Level Workspace, which acts as the entry point for the [flow execution][].
+
+{{< figure src="/images/top-level-workspace-activity.svg" title="Example Top-Level Workspace" >}}
+
+* Start Flow block
+ * Identifies where the [flow execution][] will start
+ * Automatically created when the flow is created
+ * Cannot be deleted
+ * See [Start Flow][] block
+* Action blocks
+ * Performs a specific action
+ * Icon on block indicates the nature of the action
+ * See [Blocks][Reference Blocks]
+* Decision block
+ * Causes the [flow execution][] to branch, dependent on a condition
+ * Icon on block indicates type of condition causing branching
+ * See [Decision Blocks][Decision Blocks]
+* Workspace blocks
+ * Contains grouped flow logic
+ * The turndown on the top-right of the icon indicates it contains a workspace, which can be opened by double-clicking the icon
+ * See [Workspace][Workspace Block] block
+* End Flow block
+ * Ends the [flow execution][]
+ * Automatically created when the flow is created
+ * See [End Flow][] block
+* Handle Flow Exception block
+ * Handles [flow level exceptions][flow level], thrown during the [flow execution][]
+ * Automatically created when the flow is created
+ * The turndown on the top-right of the icon indicates it contains a workspace, which can be opened by double-clicking the icon
+ * Cannot be deleted
+ * See [Handle Flow Exception][] block
+* Flow Variable Store
+ * This is deprecated in favour of the [Variables Grid][]
+ * The [Variables Grid][] can be opened by double-clicking the icon, the scope will be set to `Defined (Selected Workspace)`
+ * Cannot be deleted
+* Workspace
+ * The Top-Level Workspace within the flow
+ * Canvas on which blocks are placed and connected to create the flow logic
+
+{{% alert title="Note" %}}
+The flow should be ended with an {{< ahref path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" title="End Flow" >}} block, but it can also be ended using an {{< ahref path="Cortex.Reference.Blocks.Workspaces.EndWorkspace.EndWorkspace.MainDoc" title="End Workspace" >}} block on the [Top-Level Workspace]({{< ref "#top-level-workspace" >}}).
+{{% /alert %}}
+
+### Other Workspaces
+
+A flow can contain any number of other workspaces that are not the Top-Level Workspace, these act as a means to grouping logic and actions to reduce the complexity and make the flow easier to maintain.
+
+{{< figure src="/images/nested-workspace.svg" title="Example Workspace" >}}
+
+* Start Workspace block
+ * Identifies where the [flow execution][] will start when the workspace is executed
+ * Automatically created when the workspace is created
+ * Cannot be deleted
+ * See [Start Workspace][] block
+* Action blocks
+ * Performs a specific action
+ * Icon on block indicates the nature of the action
+ * See [Blocks][Reference Blocks]
+* End Workspace block
+ * Ends the execution of the workspace
+ * Automatically created when the workspace is created
+ * See [End Workspace][] block
+* End Flow block
+ * Ends the [flow execution][]
+ * See [End Flow][] block
+* Handle Workspace Exception block
+ * Handles [workspace level exceptions][], thrown during the [flow execution][]
+ * See [Handle Workspace Exception][] block
+* Workspace Variable Store
+ * This is deprecated in favour of the [Variables Grid][]
+ * The [Variables Grid][] can be opened by double-clicking the icon, the scope will be set to `Defined (Selected Workspace)`
+ * Cannot be deleted
+* Workspace
+ * A nested workspace within the flow
+ * Canvas on which blocks are placed and connected to create the workspace logic
+
+## Nested Workspaces
+
+All the logic of a flow can exist on the [Top-Level Workspace][], however, this can quickly become difficult to maintain and understand as the numbers of blocks increase. Blocks can be grouped into workspaces in order to reduce the complexity and make the flow easier to maintain.
+
+A [Workspace][Workspace Block] block can opened by double clicking it, showing its workspace canvas and the logic inside; this could include blocks for executing specific functions or other workspaces to help separate the logic of the flow further.
+
+When an [End Workspace][] block is executed, the [flow execution][] returns to the parent workspace. However, when an [End Flow][] block is executed the [flow execution][] will end.
+
+A nested workspace has access to any variables defined within its [scope][], or any direct ancestors [scope][].
+
+## Exceptions within a Workspace
+
+Workspaces support hierarchical exception handling at any level within the workspace.
+
+Exceptions can be handled:
+
+* At the [block][] level; for further information, see [Handling Exceptions within a Block][]
+* At the workspace level; for further information, see [Handling Exceptions within a Workspace][]
+
+A [Top-Level Workspace][] can also handle exceptions at the [flow][] level; for further information, see [Handling Exceptions within a Flow][]
+
+## Remarks
+
+### Known Limitations
+
+#### Cannot have a Handle Workspace Exception block on the flow's Top-Level Workspace
+
+Currently, it is not possible to have a [Handle Workspace Exception][] block on the [Top-Level Workspace][] of a flow. In future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+* [Flows][]
+* [Blocks][]
+* [Executions][]
+* [Exceptions][]
+
+### Related Blocks
+
+* [Start Flow][]
+* [End Flow][]
+* [Handle Flow Exception][]
+* [Start Workspace][]
+* [End Workspace][]
+* [Handle Workspace Exception][]
+* [Workspace][Workspace Block]
+
+### External Documentation
+
+None
+
+[Top-Level Workspace]: {{< ref "#top-level-workspace" >}}
+
+[Reference Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[Decision Blocks]: {{< url path="Cortex.Reference.Blocks.Decisions.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Handle Workspace Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleWorkspace.HandleWorkspaceException.MainDoc" >}}
+[Start Flow]: {{< url path="Cortex.Reference.Blocks.Flows.StartFlow.StartFlow.MainDoc" >}}
+[End Flow]: {{< url path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" >}}
+[Workspace Block]: {{< url path="Cortex.Reference.Blocks.Workspaces.Workspace.Workspace.MainDoc" >}}
+[Start Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.StartWorkspace.StartWorkspace.MainDoc" >}}
+[End Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.EndWorkspace.EndWorkspace.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Handling Exceptions within a Block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.HandlingExceptionsWithinABlock.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+[workspace level exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.WorkspaceLevel" >}}
+
+[Executions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.MainDoc" >}}
+
+[Flows]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.MainDoc" >}}
+[flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" >}}
+[Handling Exceptions within a Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.HandlingExceptionsWithinAFlow.MainDoc" >}}
+[flow execution]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.MainDoc" >}}
+[flow level]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.HandlingExceptions.FlowLevel" >}}
+
+[scope]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.VariableScopes.MainDoc" >}}
+[Handling Exceptions within a Workspace]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Workspaces.HandlingExceptionsWithinAWorkspace.MainDoc" >}}
+
+[Variables Grid]: {{< url path="Cortex.Guides.UserGuides.UserInterfaces.Gateway.Dev.FlowEditor.BottomPanel.VariablesGrid.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/_index.md
new file mode 100644
index 000000000..b63db12e4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/_index.md
@@ -0,0 +1,8 @@
+---
+title: "Working With..."
+linkTitle: "Working With..."
+description: "This section includes all reference documentation for concepts required to use {{% ctx %}}."
+weight: 2
+---
+
+
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/_index.md
new file mode 100644
index 000000000..3a5989e7f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Collections"
+linkTitle: "Collections"
+description: "Information related to working with collections such as Lists, Dictionaries and Structures."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/indexes.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/indexes.md
new file mode 100644
index 000000000..f8f540589
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/indexes.md
@@ -0,0 +1,50 @@
+---
+title: "Indexes"
+linkTitle: "Indexes"
+description: "Information related to working with Indexes."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Overview/summary
+- What is an Index?
+- How are they accessed?
+- Indexes are zero based
+- Difference between occurrence and indexes
+
+## Accessing an item using Indexes
+
+[Indexes][] can be used in the [Expression Editor][] to access items in a Collection.
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Indexes]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.IndexExpressions" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/items.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/items.md
new file mode 100644
index 000000000..816bde126
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/items.md
@@ -0,0 +1,46 @@
+---
+title: "Items"
+linkTitle: "Items"
+description: "Information related to working with Items."
+weight: 100
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Overview/summary
+- What is an Item?
+- How are they accessed?
+ - Link to Indexes
+ - Link to Keys
+- If you are using C# syntax, then the equality is done using reference equality for reference types, and value equality for value types
+- If you are using List of Dictionary blocks, then the equality is done using reference equality for reference types and falls back to value equality if no reference was found, and value equality for value types
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/keys.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/keys.md
new file mode 100644
index 000000000..7361f5a06
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/keys.md
@@ -0,0 +1,57 @@
+---
+title: "Keys"
+linkTitle: "Keys"
+description: "Information related to working with Keys."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Overview/summary
+- What is a Key?
+- How are they accessed?
+- The type of the Key depends on the data type
+- Keys are unique
+- Keys cannot be null
+- If you are using C# syntax, then the equality is done using reference equality for reference types, and value equality for value types
+- If you are using Dictionary blocks, then the equality is done using reference equality for reference types and falls back to value equality if no reference was found, and value equality for value types
+
+## Accessing an item using Keys
+
+[Keys][] can be used in the [Expression Editor][] to access items in a Collection.
+
+## Remarks
+
+### Known Limitations
+
+#### Complex Keys do not show sho correctly in the Variable Details Viewer
+
+Currently, if a Dictionary is shown in the Variable Details Viewer and contains Complex Data types as its keys, the data within the variable will not be displayed correctly.
+
+In the future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" >}}
+[Keys]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.IndexExpressions" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/occurrences.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/occurrences.md
new file mode 100644
index 000000000..ceec95a19
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/occurrences.md
@@ -0,0 +1,66 @@
+---
+title: "Occurrences"
+linkTitle: "Occurrences"
+description: "Information related to working with Occurrences."
+---
+
+# {{% param title %}}
+
+## Summary
+
+TODO
+
+- Summary
+- What is an Occurrence?
+- How are they accessed?
+ - Positive or Negative int properties on blocks that operate on single items
+- Difference between occurrence and indexes
+- specified occurrence
+
+## Positive Occurrences
+
+TODO:
+
+- Get First, Second, Third, Nth
+
+## Negative Occurrences
+
+TODO:
+
+- Get Last, Second from Last, Third from Last, Nth from Last
+
+## Remarks
+
+### Occurrence Not Present
+
+TODO:
+
+Blocks will either throw an exception if the occurrence is not present (e.g. OccurrenceNotPresentException), or they will handle the occurrence not being present either by performing no operation or by returning a predetermined value.
+
+For example:
+
+- Get Index Of Item With Value (returns predetermined value)
+- Remove Item With Value (no operation performed)
+- Get Item With Key (throws OccurrenceNotPresentException)
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/collections/what-is-a-collection.md b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/what-is-a-collection.md
new file mode 100644
index 000000000..99be3b3b1
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/collections/what-is-a-collection.md
@@ -0,0 +1,125 @@
+---
+title: "What is a Collection?"
+linkTitle: "What is a Collection?"
+description: "Information regarding what a collection is, and the different types of collections."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Types of Collections
+
+### Dictionaries
+
+TODO:
+
+- Talk about typed dictionaries (TKey, TItem)
+- Talk about heterogenous vs homogenous dictionaries (fix single data type vs multiple data types links in all dictionary blocks)
+- Talk about keys, uniqueness and equality (link to Keys page)
+- Talk about complex keys (link to Keys page)
+- Items can be accessed as indexes
+- Link to Data Type
+- Creating a Dictionary
+
+#### Accessing Items
+
+##### Keys
+
+### Structures
+
+TODO:
+
+- Structures are IDictionary<string, object> underlying (how does this interact with blocks?)
+ - Talk about {} and dynamic vs object
+- Talk about keys, uniqueness and equality (link to Keys page)
+- Items can be accessed as indexes or properties
+- Link to Data Type
+- Creating a Structure
+
+#### Accessing Items
+
+##### Properties
+
+##### Keys
+
+### Lists
+
+TODO:
+
+- Talk about typed dictionaries (TItem)
+- Talk about [] and dynamic vs object
+- Talk about typed lists
+- Talk about heterogenous vs homogenous lists (fix single data type vs multiple data types links in all list blocks)
+- Items can be accessed as indexes
+- Link to Data Type
+- Creating a List
+
+#### Accessing Items
+
+##### Indexes
+
+### Queues
+
+TODO:
+
+- Talk about first-in-first-out
+- Talk about priority and order items in a queue
+- Talk about typed queues
+- Talk about how items can be accessed (e.g. dequeue/peek or get list of items)
+- Link to Data Type
+- Creating a queue
+
+### Data Storage Collection
+
+TODO:
+
+- Talk about persistence
+- Talk about about heterogenous property (takes any data type and can not be restricted)
+- Talk about keys and uniqueness of keys (link to keys page)
+- Items can only be accessed via key
+- Mention high availability?
+- Mention api access?
+
+## Arrays vs Lists
+
+### Differences
+
+### When To Use Arrays
+
+### When To Use Lists
+
+- TODO: Some info on when to use array vs list - https://www.educba.com/c-sharp-list-vs-array/
+
+## Remarks
+
+### Known Limitations
+
+#### Complex Keys do not show sho correctly in the Variable Details Viewer
+
+Currently, if a Dictionary is shown in the Variable Details Viewer and contains Complex Data types as its keys, the data within the variable will not be displayed correctly.
+
+In the future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/_index.md
new file mode 100644
index 000000000..32e0a1b80
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Concurrency"
+linkTitle: "Concurrency"
+description: "Information related to working with concurrency methods such as Semaphores."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/_index.md
new file mode 100644
index 000000000..c28a10b61
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Semaphores"
+linkTitle: "Semaphores"
+description: "Information related to working with Semaphores."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/what-is-a-semaphore.md b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/what-is-a-semaphore.md
new file mode 100644
index 000000000..872e904ab
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/concurrency/semaphores/what-is-a-semaphore.md
@@ -0,0 +1,125 @@
+---
+title: "What is a Semaphore?"
+linkTitle: "What is a Semaphore?"
+description: "Information regarding what a semaphore is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+A semaphore is a mechanism that limits the number of concurrent executions that can be executing a block or workspace, and can be enabled using the [semaphore property][SemaphoreProperty].
+
+The [semaphore property][SemaphoreProperty] is an [advanced property][AdvancedProperties] added to most blocks to allow any part of a flow to be concurrency limited. The [semaphore property][SemaphoreProperty] has a [Scope][] that defines the area in which the semaphore will operate, a [Name][] to identify the semaphore, a [ConcurrencyLimit][] that defines the maximum number of concurrent executions that can enter the semaphore at once and a [Queue][] property that defines whether the execution should [queue][queuing semaphore] or [not queue][non-queuing semaphore] for the semaphore.
+
+## Anatomy of a Semaphore
+
+TODO
+
+### Non-Queuing Semaphore
+
+A [Non-Queuing Semaphore][] refers to a semaphore where executions do not queue when attempting to acquire a semaphore that has reached its concurrency limit. Instead, it throws a [SemaphoreCouldNotBeAcquiredException][ConcurrencyLimitReached] with the [Queued][] property set to `false` to indicate that it did not queue.
+
+### Queuing Semaphore
+
+A [Queuing Semaphore][] refers to a semaphore where executions queue when attempting to acquire a semaphore that has reached its concurrency limit. It will join the queue with the [Priority][] specified in the [Queue][] property and wait to enter the semaphore. When it has reached the front of the queue and there is space inside, it will be removed from the queue and enter the semaphore. The queue orders items by priority, preserving first-in-first-out behaviour between items with the same priority. The item with the lowest priority will be dequeued first.
+
+If an execution spends more time in the queue than the [QueueTimeout][] specified in the [Queue][] property, it will exit the queue and throw a [SemaphoreCouldNotBeAcquiredException][QueueTimeoutReached] with the [Queued][] property set to `true` to indicate that it attempted to queue.
+
+## Remarks
+
+### Automatic Management
+
+The semaphores are managed automatically, without the need to define and manage the semaphores separately. When a block attempts to acquire a semaphore that does not exist, the semaphore will automatically be created and configured with the defined [ConcurrencyLimit][]. When the last execution in a semaphore is released (last execution exits the semaphore or is stopped from executing while inside), the semaphore is automatically deleted.
+
+### Multiple Concurrency Limits
+
+If a block tries to use a semaphore that already exists (using the same [Scope][] and same [Name][]) but specifies a different [ConcurrencyLimit][], the semaphore will continue respecting the [ConcurrencyLimit][] of when it was created. The block will respect the [ConcurrencyLimit][] already set until the semaphore is emptied and is automatically deleted. The semaphore is then able to be recreated with the new [ConcurrencyLimit][].
+
+### Preventing Deadlocks
+
+Deadlocks in flows can occur when multiple executions have acquired different semaphores, and then each execution wants to acquire another semaphore that is being used by another execution, which in turn is waiting for first execution to release its semaphore. E.g.
+
+```
+There exists two semaphores:
+ - Semaphore A with a ConcurrencyLimit of 1 and a queue
+ - Semaphore B with a ConcurrencyLimit of 1 and a queue
+
+There exists two executions:
+ - Execution A acquires Semaphore A
+ - Execution B acquires Semaphore B
+ - Execution A tries to acquire Semaphore B and joins the queue
+ - Execution B tries to acquire Semaphore A and joins the queue
+
+ Both Execution A and Execution B are deadlocked.
+```
+
+In this example, Execution A can't proceed as it's waiting for the semaphore that Execution B is using; which in turn is waiting for the semaphore that Execution A is using.
+
+The best way to avoid these deadlocks is to design your flows to avoid them happening in the first place. In the example above, if both executions will need both semaphores to operate, a change that could be made would be to combine both semaphores into one.
+
+Another way to mitigate the problem would be to use the [QueueTimeout][] property when defining the [QueueSettings][] for each semaphore. Setting the [QueueTimeout][] to a duration reasonably higher than the expected execution time of the operations inside of the semaphore would allow the execution to throw if it has been waiting too long, likely due to a deadlock having occurred. The [SemaphoreCouldNotBeAcquiredException][QueueTimeoutReached] thrown could then be caught to allow the execution to release its semaphores and try again. In the example above, if Semaphore A had a [QueueTimeout][], Execution B timeouts out as it waits to acquire Semaphore A and releases Semaphore B. Execution A then acquires Semaphore B. Execution B retries to acquire Semaphore B and joins the queue. Execution A then finishes its operations, releasing both semaphores and allows Execution B to complete its operations as well.
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Concepts
+
+None
+
+### Related Data Types
+
+- [QueueSettings][]
+- [ScopeDefinition][ScopeDatatype]
+- [SemaphoreSettings][]
+
+### Related Blocks
+
+- [All Blocks][]
+
+Except:
+
+- [End Flow][]
+- [End Workspace][]
+- [Handle Flow Exception][]
+- [Start Flow][]
+- [Wait For Duration][]
+
+### External Documentation
+
+None
+
+[Queuing Semaphore]: {{< ref "#queuing-semaphore" >}}
+[Non-Queuing Semaphore]: {{< ref "#non-queuing-semaphore" >}}
+
+[ConcurrencyLimitReached]: {{< url path="Cortex.Reference.Exceptions.Concurrency.Semaphores.SemaphoreCouldNotBeAcquiredException.ConcurrencyLimitReached" >}}
+[QueueTimeoutReached]: {{< url path="Cortex.Reference.Exceptions.Concurrency.Semaphores.SemaphoreCouldNotBeAcquiredException.QueueTimeoutReached" >}}
+[Queued]: {{< url path="Cortex.Reference.Exceptions.Concurrency.Semaphores.SemaphoreCouldNotBeAcquiredException.Queued" >}}
+
+[SemaphoreProperty]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.CommonProperties.SemaphoreProperty" >}}
+[AdvancedProperties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
+
+[SemaphoreSettings]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.MainDoc" >}}
+[QueueSettings]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.QueueSettings.MainDoc" >}}
+[Priority]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.QueueSettings.Priority" >}}
+[QueueTimeout]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.QueueSettings.QueueTimeout" >}}
+
+[Scope]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Scope" >}}
+[Name]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Name" >}}
+[ConcurrencyLimit]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.ConcurrencyLimit" >}}
+[Queue]: {{< url path="Cortex.Reference.DataTypes.Concurrency.Semaphores.SemaphoreSettings.Queue" >}}
+
+[ScopeDatatype]: {{< url path = "Cortex.Reference.DataTypes.Scopes.ScopeDefinition.MainDoc">}}
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
+[End Flow]: {{< url path="Cortex.Reference.Blocks.Flows.EndFlow.EndFlow.MainDoc" >}}
+[End Workspace]: {{< url path="Cortex.Reference.Blocks.Workspaces.EndWorkspace.EndWorkspace.MainDoc" >}}
+[Handle Flow Exception]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleFlow.HandleFlowException.MainDoc" >}}
+[Start Flow]: {{< url path="Cortex.Reference.Blocks.Flows.StartFlow.StartFlow.MainDoc" >}}
+[Wait For Duration]: {{< url path="Cortex.Reference.Blocks.Schedules.WaitFor.WaitForDuration.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/_index.md
new file mode 100644
index 000000000..d2fe28bda
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Culture"
+linkTitle: "Culture"
+description: "Information related to working with Culture."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/current-culture.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/current-culture.md
new file mode 100644
index 000000000..fe690e697
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/current-culture.md
@@ -0,0 +1,38 @@
+---
+title: "Current Culture"
+linkTitle: "Current Culture"
+description: "Information related to working with Current Culture."
+weight: 200
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: summary
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/custom-cultures.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/custom-cultures.md
new file mode 100644
index 000000000..a15883e92
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/custom-cultures.md
@@ -0,0 +1,38 @@
+---
+title: "Custom Cultures"
+linkTitle: "Custom Cultures"
+description: "Information related to working with custom cultures."
+weight: 400
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: summary
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/invariant-culture.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/invariant-culture.md
new file mode 100644
index 000000000..2883b3106
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/invariant-culture.md
@@ -0,0 +1,38 @@
+---
+title: "Invariant Culture"
+linkTitle: "Invariant Culture"
+description: "Information related to working with Invariant Culture."
+weight: 100
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: summary
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/specific-cultures.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/specific-cultures.md
new file mode 100644
index 000000000..65bd9cb78
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/specific-cultures.md
@@ -0,0 +1,40 @@
+---
+title: "Specific Cultures"
+linkTitle: "Specific Cultures"
+description: "Information related to working with specific cultures."
+weight: 300
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: summary
+
+- For a list of cultures that can be returned on Windows systems see https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c under The Language table (`Language tag` defines the code required to create the culture)
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/culture/what-is-a-culture.md b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/what-is-a-culture.md
new file mode 100644
index 000000000..17a460f40
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/culture/what-is-a-culture.md
@@ -0,0 +1,45 @@
+---
+title: "What is a Culture?"
+linkTitle: "What is a Culture?"
+description: "Information regarding what a culture is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Types of Culture
+
+TODO:
+
+- Link to Culture Pages (Invariant/Current/Specific/Custom)
+- For a list of predefined cultures that can be returned on Windows systems see https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO: Also need sections in working with text (casing, comparisons/equality, O/S settings), dates and time (formats, O/S settings), numbers (formats, O/S settings) etc specifically for how culture affects things - we can then cross link from here
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/_index.md
new file mode 100644
index 000000000..388551e37
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Data Sources"
+linkTitle: "Data Sources"
+description: "Information related to working with Data Sources."
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/_index.md
new file mode 100644
index 000000000..4184695d9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Supported Data Sources"
+linkTitle: "Supported Data Sources"
+description: "Information regarding supported data sources."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/odbc.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/odbc.md
new file mode 100644
index 000000000..e22bafadb
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/odbc.md
@@ -0,0 +1,40 @@
+---
+title: "ODBC"
+linkTitle: "ODBC"
+description: "Information regarding ODBC as a data source."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Summary
+- Table or other format to display verified data sources (e.g. postgres, mysql, access, excel, oracle) and examples (link to connection strings)
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/oracle.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/oracle.md
new file mode 100644
index 000000000..3d0f2d832
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/oracle.md
@@ -0,0 +1,40 @@
+---
+title: "Oracle"
+linkTitle: "Oracle"
+description: "Information regarding Oracle as a data source."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Summary
+- Table or other format to display verified data sources (e.g. postgres, mysql, access, excel, oracle) and examples (link to connection strings)
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/sql-server.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/sql-server.md
new file mode 100644
index 000000000..2f06517a2
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/supported-data-sources/sql-server.md
@@ -0,0 +1,45 @@
+---
+title: "SQL Server"
+linkTitle: "SQL Server"
+description: "Information regarding SQL Server as a data source."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Summary
+- Table or other format to display verified data sources (SQL Server versions) and examples (link to connection strings)
+
+## Remarks
+
+TODO:
+
+- Connected as the user running the service or as a custom user (e.g. trusted user vs username and password)
+ - check that impersonation works with trusted when implemented
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/what-is-a-data-source.md b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/what-is-a-data-source.md
new file mode 100644
index 000000000..9cc1efc2d
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/data-sources/what-is-a-data-source.md
@@ -0,0 +1,53 @@
+---
+title: "What is a Data Source?"
+linkTitle: "What is a Data Source?"
+description: "Information regarding what a data source is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Supported Data Sources
+
+TODO: See Supported Data Sources
+
+## Managing Connections to a Data Source
+
+TODO:
+
+- Connections are managed by the block
+- See Working with Connections (connection life cycle, using a variable for connections over literal/expression)
+
+## Remarks
+
+### Known Limitations
+
+#### Limited Set of Supported Data Sources
+
+Currently, there are a limited set of Supported Data Sources.
+
+In the future this limitation may be removed.
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/_index.md
new file mode 100644
index 000000000..a0bff010b
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Date and Time"
+linkTitle: "Date and Time"
+description: "Information related to working with Date and Time."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/date-and-time-formatting.md b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/date-and-time-formatting.md
new file mode 100644
index 000000000..2edcfc4d4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/date-and-time-formatting.md
@@ -0,0 +1,181 @@
+---
+title: "Date and Time Formatting"
+linkTitle: "Date and Time Formatting"
+description: "This page describes the concept of Date and Time Formatting, including Format Providers, Format Templates and Format Specifiers."
+---
+
+# {{% param title %}}
+
+## Overview
+
+TODO:
+
+* Overview/summary
+* Common formats ISO8601, Invariant Culture
+
+## Format providers
+
+TODO:
+
+* what are they
+* ways of creating
+ * CultureInfo.InvariantCulture
+ * CultureInfo.CurrentCulture
+ * new CultureInfo("")
+ * new CultureInfo("en-GB")
+
+or
+
+https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#datetimeformatinfo-properties
+
+https://learn.microsoft.com/en-us/dotnet/api/system.globalization.datetimeformatinfo?view=net-5.0
+
+### Invariant Culture
+
+TODO:
+
+* default format `"MM/dd/yyyy HH:mm:ss zzz"`
+* rules https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset.parse?view=net-5.0
+
+### Current Culture
+
+TODO
+
+## Format Templates
+
+Format templates use characters called [format specifiers][] to define the text representation of [DateTimeOffset][] and [DateTime][] values.
+
+There are two types of format template:
+
+* [Standard Format Templates][] - use a single character [format specifier][format specifiers]
+* [Custom Format Templates][] - use multiple character [format specifiers][]
+
+Both can be used to define how [DateTimeOffset][] and [DateTime][] values are converted to and from their text representation.
+
+TODO:
+
+* *How do they relate to format providers
+
+### Standard Format Templates
+
+A standard format template uses a single character [format specifier][format specifiers] to define the text representation of [DateTimeOffset][] and [DateTime][] values and can be used to define how [DateTimeOffset][] and [DateTime][] values are converted to and from their text representation.
+
+The following table shows all of the standard format templates.
+
+All examples are for a system configured with British [culture][] (i.e. `en-GB`), and use a local time of `2PM 1st of July 2022` with `1` hour UTC offset, honouring British Summer Time (BST).
+
+| Pattern | Format Specifier | DateTimeOffset Example | DateTime Example | Notes |
+|-|-|-|-|-|
+| Short Date Pattern | `d` | `2022-07-01T14:00:00.0000000+01:00` -> `1/7/2022` | TODO | See [short date ("d") format specifier] for further information |
+| Short Time Pattern | `t` | `2022-07-01T14:00:00.0000000+01:00` -> `2:00 PM` | TODO | See [short time ("t") format specifier] for further information |
+| Long Date Pattern | `D` | `2022-07-01T14:00:00.0000000+01:00` -> `5 April 2022` | TODO | See [long date ("D") format specifier] for further information |
+| Long Time Pattern | `T` | `2022-07-01T14:00:00.0000000+01:00` -> `2:00:00 PM` | TODO | See [long time ("T") format specifier] for further information |
+| Full Date/Time Pattern (Short Time) | `f` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [full date short time ("f") format specifier] for further information |
+| Full Date/Time Pattern (Long Time) | `F` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [full date long time ("F") format specifier] for further information |
+| General Date/Time Pattern (Short Time) | `g` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [general date short time ("g") format specifier] for further information |
+| General Date/Time Pattern (Long Time) | `G` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [general date long time ("G") format specifier] for further information |
+| Round-Trip Date/Time Pattern | `O`, `o` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [round-trip ("O", "o") format specifier] for further information |
+| RFC1123 Pattern | `R`, `r` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [RFC1123 ("R", "r") format specifier] for further information |
+| Sortable Date/Time Pattern | `s` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [sortable ("s") format specifier] for further information |
+| Universal Sortable Date/Time Pattern | `u` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [universal sortable ("u") format specifier] for further information |
+| Universal Full Date/Time Pattern | `U` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [universal full ("U") format specifier] for further information |
+| Month Day Pattern | `M`, `m` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [month ("M", "m") format specifier] for further information |
+| Year Month Pattern | `Y`, `y` | `2022-07-01T14:00:00.0000000+01:00` -> `TODO` | TODO | See [year month ("Y") format specifier] for further information |
+| Unknown Pattern | Any other single character | N/A | N/A | Throws a [FormatException][] |
+
+#### Invariant Format Templates
+
+TODO:
+
+* Invariant format templates -
+ * In some cases, the standard format string serves as a convenient abbreviation for a longer custom format string that is invariant. Four standard format strings fall into this category: "O" (or "o"), "R" (or "r"), "s", and "u". These strings correspond to custom format strings defined by the invariant culture. They produce string representations of date and time values that are intended to be identical across cultures. The following table provides information on these four standard date and time format strings.
+ * TABLE 2
+ * Standard format string Defined by DateTimeFormatInfo.InvariantInfo property Custom format string
+ * "O" or "o" None yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffK
+ * "R" or "r" RFC1123Pattern ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
+ * "s" SortableDateTimePattern yyyy'-'MM'-'dd'T'HH':'mm':'ss
+ * "u" UniversalSortableDateTimePattern yyyy'-'MM'-'dd HH':'mm':'ss'Z'
+ * https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings
+
+#### ISO 8601 Standard
+
+TODO:
+
+* round-trip "O", "o" and sortable "s" complies with ISO
+* `yyyy-MM-ddTHH:mm:ss.fffffffK` for `DateTime`
+* `yyyy-MM-ddTHH:mm:ss.fffffffzzz` for `DateTimeOffset`
+
+### Custom Format Templates
+
+TODO:
+
+* What are they - multiple character format specifiers
+* Some examples
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
+
+## Format specifiers
+
+TODO:
+
+* what are they
+* Table of them
+* Some of the commonly used format specifiers are:
+ * dd: The day of the month, from 01 through 31
+ * MM: The month, from 01 through 12
+ * yyyy: The year as a four-digit number
+ * HH: The hour, using a 24-hour clock from 00 to 23
+ * hh: The hour, using a 12-hour clock from 01 to 12
+ * mm: The minute, from 00 through 59
+ * ss: The second, from 00 through 59
+ * fff: The number of milliseconds
+ * tttt: The AM/PM designator
+ * The full set of allowed format specifiers are as per standard Microsoft .NET Custom Date and Time Format Strings.
+
+## Operating System Settings
+
+TODO:
+
+* How can these affect datetime formats etc.
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#control-panel-settings
+
+[Standard Format Templates]: {{< ref "#standard-format-templates" >}}
+[Custom Format Templates]: {{< ref "#custom-format-templates" >}}
+[Format Specifiers]: {{< ref "#format-specifiers" >}}
+[Operating System Settings]: {{< ref "#operating-system-settings" >}}
+
+[Culture]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Culture.MainDoc" >}}
+
+[short date ("d") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.ShortDateFormat" >}}
+[short time ("t") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.ShortTimeFormat" >}}
+[long date ("D") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.LongDateFormat" >}}
+[long time ("T") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.LongTimeFormat" >}}
+[full date short time ("f") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.FullDateShortTimeFormat" >}}
+[full date long time ("F") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.FullDateLongTimeFormat" >}}
+[general date short time ("g") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.GeneralDateShortTimeFormat" >}}
+[general date long time ("G") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.GeneralDateLongTimeFormat" >}}
+[round-trip ("O", "o") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.RoundTripFormat" >}}
+[RFC1123 ("R", "r") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.RFC1123Format" >}}
+[sortable ("s") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.SortableFormat" >}}
+[universal sortable ("u") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.UniversalSortableFormat" >}}
+[universal full ("U") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.UniversalFullFormat" >}}
+[month ("M", "m") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.MonthDayFormat" >}}
+[year month ("Y") format specifier]: {{< url path="MSDocs.DotNet.Api.System.DateTimeOffset.YearMonthFormat" >}}
+
+[FormatException]: {{< url path="MSDocs.DotNet.Api.System.FormatException" >}}
+
+[DateTime]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTime.MainDoc" >}}
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+
+TODO Add concepts page for string/object formatting that links to:
+
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/composite-formatting
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/best-practices-display-data
+
+TODO Add concepts page for formatting numbers that links to:
+
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
+* https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings
+
+TODO: https://learn.microsoft.com/en-us/dotnet/standard/base-types/parsing-datetime
+
+TODO: Update examples for most common en-gb os formats
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/what-is-date-and-time.md b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/what-is-date-and-time.md
new file mode 100644
index 000000000..01d8fae95
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/date-and-time/what-is-date-and-time.md
@@ -0,0 +1,51 @@
+---
+title: "What is Date and Time?"
+linkTitle: "What is Date and Time?"
+description: "Information regarding what Date and Time is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Date and Time are represented by different data types
+ - DateTime
+ - DateTimeOffset
+ - TimeSpan
+ - TimePeriod
+- What is the difference between DateTime and DateTimeOffset?
+ - When should they be used
+- What is the difference between TimeSpan and TimePeriod?
+ - When should they be used
+- We don't deal with timezone issues within the blocks
+- Offsets are handled within DateTimeOffset and can be dealt with using our blocks
+- Useful link - https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-6.0
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/email/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/email/_index.md
new file mode 100644
index 000000000..50e6b336a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/email/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Email"
+linkTitle: "Email"
+description: "Information related to working with email."
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/email/authentication.md b/content/en/docs/2026.3/Reference/Concepts/working-with/email/authentication.md
new file mode 100644
index 000000000..ec6522f86
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/email/authentication.md
@@ -0,0 +1,20 @@
+---
+title: "Authentication"
+linkTitle: "Authentication"
+description: "Information regarding authentication when working with email"
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Overview
+
+### Setting up an app password for a Gmail account
+
+### Setting up a Gmail account for OAuth authentication
+
+### Setting up an Outlook account for OAuth authentication using client credentials
+
+### Setting up an Outlook account for OAuth authentication using certificate credentials
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/email/what-is-email.md b/content/en/docs/2026.3/Reference/Concepts/working-with/email/what-is-email.md
new file mode 100644
index 000000000..cc8fedaaf
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/email/what-is-email.md
@@ -0,0 +1,68 @@
+---
+title: "What is Email?"
+linkTitle: "What is Email?"
+description: "Information regarding what email is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- SMTP (Sending)
+ - Attachments (best practices):
+ - where should attachments be in relation to the server the flow is executing on
+ - should we link to the file path stuff (working with files and folders)?
+- IMAP (Retreiving)
+ - Mailboxes
+ - Folders:
+ - Deleted?
+ - Emails:
+ - Attachments
+ - Status:
+ - Read
+ - Unread
+ - Priority
+ - Body Format
+ - Flagged
+- SSL/TLS
+- Authentication:
+ - Unauthenticated Servers
+ - SASL
+ - SMTP Server
+ - Gmail?
+ - OAuth:
+ - Gmail OAuth
+ - Microsoft365 OAuth
+
+## Managing Connections to a Mail Server
+
+TODO:
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/enums/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/enums/_index.md
new file mode 100644
index 000000000..21b0ab55f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/enums/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Enums"
+linkTitle: "Enums"
+description: "Information related to working with enum data types such as DayOfWeek, DateTimeComponentType and SearchOptions."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/enums/what-is-an-enum.md b/content/en/docs/2026.3/Reference/Concepts/working-with/enums/what-is-an-enum.md
new file mode 100644
index 000000000..e81332ae9
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/enums/what-is-an-enum.md
@@ -0,0 +1,60 @@
+---
+title: "What is an Enum?"
+linkTitle: "What is an Enum?"
+description: "Information regarding what an Enum is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Anatomy of an Enum
+- Enum literal editor
+- Display in studio variable details viewer
+ - Default
+ - Overridden types
+ - Out of range ints cast (DayOfWeek)1000
+- Casting - dayofweek<->Int and unable to cast string - use parse
+ - Need to cast int to enum or enum to int if comparing
+- Enum Types
+ - DateTimeComponentType
+ - SearchOptions
+ - Etc.
+- Flagged enums
+ - Currently not possible to have combined values in the literal editor (is possible in expression)
+- Enums names are not localised - e.g. DayOfWeek.Sunday cannot display Dimanche for french
+- Links to microsoft docs
+ - https://learn.microsoft.com/en-us/dotnet/api/system.enum
+ - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/enum
+ - probably not:
+ - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/enums
+ - https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/enum
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/_index.md
new file mode 100644
index 000000000..b315cfd49
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Files and Folders"
+linkTitle: "Files and Folders"
+description: "Information related to working with Files and Folders."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/attributes.md b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/attributes.md
new file mode 100644
index 000000000..47b4415a0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/attributes.md
@@ -0,0 +1,41 @@
+---
+title: "Attributes"
+linkTitle: "Attributes"
+description: "Information regarding file and folder attributes."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Supported file and folder attributes and examples of using them
+- https://learn.microsoft.com/en-us/dotnet/api/system.io.fileattributes?view=net-5.0
+- Currently there are no specific blocks for setting attributes of files and folders (setting can be done through c# or PowerShell)
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/paths.md b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/paths.md
new file mode 100644
index 000000000..72b26c7bc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/paths.md
@@ -0,0 +1,53 @@
+---
+title: "Paths"
+linkTitle: "Paths"
+description: "Information regarding file and folder paths."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Supported file and folder path formats and examples of using them
+- How we determine is a path is a folder or a file
+ - path\ = folder (path with terminating \ or /)
+ - path = folder (path not ending in extension)
+ - path.extension = file (path ending in extension)
+ - path.anotherpartofpath\ = folder (as it ends in a \ or /)
+- Valid file and folder names
+
+Links:
+
+- https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats
+- https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file
+- https://learn.microsoft.com/en-us/windows/wsl/filesystems
+- https://learn.microsoft.com/en-us/dotnet/standard/io/
+- https://learn.microsoft.com/en-us/dotnet/api/system.io.file?view=net-5.0
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/what-are-files-and-folders.md b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/what-are-files-and-folders.md
new file mode 100644
index 000000000..529943f59
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/files-and-folders/what-are-files-and-folders.md
@@ -0,0 +1,46 @@
+---
+title: "What are Files and Folders?"
+linkTitle: "What are Files and Folders?"
+description: "Information regarding what files and folders are."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- https://learn.microsoft.com/en-us/dotnet/standard/io/
+- https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats
+- https://learn.microsoft.com/en-us/dotnet/standard/io/handling-io-errors
+- https://learn.microsoft.com/en-us/dotnet/standard/io/common-i-o-tasks
+- list of common extensions
+- list of common environment variables (`%PROGRAMDATA%` check this works)
+- Best Practices (how to work with files, where to save them when working with files and folders in a flow)
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/loops/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/loops/_index.md
new file mode 100644
index 000000000..d70e9e9c4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/loops/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Loops"
+linkTitle: "Loops"
+description: "Information related to working with loops, such as for and for each."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/loops/what-is-a-loop.md b/content/en/docs/2026.3/Reference/Concepts/working-with/loops/what-is-a-loop.md
new file mode 100644
index 000000000..5cbe0aec5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/loops/what-is-a-loop.md
@@ -0,0 +1,74 @@
+---
+title: "What is a Loop?"
+linkTitle: "What is a Loop?"
+description: "Information regarding what a loop is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Introduce concept of loop
+ - Why are they used
+- Types of Loops (pros and cons)
+ - For loop
+ - Can move forwards or backwards
+ - Can move by single or multiple increments
+ - Can modify a collection while iterating over it
+ - Have to manually manage the bounds of the loop
+ - Index can be adjusted to break a loop
+ - Decision blocks can be used to break a loop
+ - For each
+ - Cannot modify the collection during a for each loop (use a for loop if the collection needs to be modified during the loop)
+ - Decision blocks can be used to break a loop
+ - While
+ - No blocks, can be done using decision blocks looping back into the flow (order of decision block determines while or do while loop)
+ - Condition can be adjusted to break a loop early
+ - Decision blocks can be used to break a loop early
+ - Do while
+ - No blocks, can be done using decision blocks looping back into the flow (order of decision block determines while or do while loop)
+ - Condition can be adjusted to break a loop early
+ - Decision blocks can be used to break a loop early
+- Nested loops
+ - Why they are used
+ - How nested loops affect performance
+- Infinite loops
+ - Why they are bad, how to avoid
+ - for loop block protects against infinite loops
+ - for each loop block cannot have infinite loops as the collection cannot be modified
+ - while/ do while does not have any protection against infinite loops (must be managed within the flow)
+
+Links:
+
+- [Overview: the four different loops of the C# programming language][What is a loop]
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
+[What is a loop]: {{< url path="Kodify.WhatIsALoop" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/_index.md
new file mode 100644
index 000000000..8626ac69a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Numbers"
+linkTitle: "Numbers"
+description: "Information related to working with Numbers."
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/what-is-a-number.md b/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/what-is-a-number.md
new file mode 100644
index 000000000..606454bad
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/numbers/what-is-a-number.md
@@ -0,0 +1,68 @@
+---
+title: "What is a Number?"
+linkTitle: "What is a Number?"
+description: "Information regarding what a number is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What is a number
+- Types of numbers
+ - Integer Types
+ - int, long, etc
+ - unsigned numbers
+ - suffixes
+ - Floating Point Types
+ - float, double, decimal
+ - suffixes
+- Operators and Comparisons
+ - Order of operation
+ - Integer division will result in an integer, not a Floating Point number (e.g. `3 / 2` results in `1`)
+ - Underflow/Overflow conditions
+- Converting numbers to text
+ - using blocks
+ - ToString()
+ - https://learn.microsoft.com/en-us/dotnet/standard/base-types/parsing-numeric
+- Converting Integer Types to Floating Types (and reverse)
+ - Built in numeric conversion - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
+ - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#1023-implicit-numeric-conversions
+ - Data loss when converting from Floating Types to Integer Types
+- Numeric Formatting
+ - Format providers
+ - Invariant Culture
+ - Current Culture
+ - Format Templates
+ - Standard Format Templates - https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
+ - Custom Format Templates - https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings
+ - Format specifiers
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/objects/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/_index.md
new file mode 100644
index 000000000..f8665daf7
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Objects"
+linkTitle: "Objects"
+description: "Information related to working with Objects."
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-casting.md b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-casting.md
new file mode 100644
index 000000000..589b2e011
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-casting.md
@@ -0,0 +1,50 @@
+---
+title: "Object Casting"
+linkTitle: "Object Casting"
+description: "Information regarding casting an object to different data types."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+## Implicit Cast
+
+TODO
+
+## Explicit Cast
+
+TODO
+
+## Object vs dynamic
+
+TODO
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-equality.md b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-equality.md
new file mode 100644
index 000000000..0e22d4aea
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/object-equality.md
@@ -0,0 +1,57 @@
+---
+title: "Object Equality"
+linkTitle: "Object Equality"
+description: "Information regarding object equality, and what defines two objects as equal."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/equality-comparisons
+
+## Value Type vs Reference Type Equality
+
+TODO:
+
+### Value Type Equality
+
+TODO: notes about value equality and a worked through example
+
+### Reference Type Equality
+
+TODO: notes about reference equality and a worked through example
+
+## How {{% ctx %}} compares objects for equality
+
+TODO: notes about how cortex compares and a worked through example
+
+Notes:List and Dictionary equality is slightly different to normal equality as it will compare first based on reference and then fall back to value - compared to == .Equals .ReferenceEquals - blocks affected
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/objects/what-is-an-object.md b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/what-is-an-object.md
new file mode 100644
index 000000000..e58c95968
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/objects/what-is-an-object.md
@@ -0,0 +1,44 @@
+---
+title: "What is an Object?"
+linkTitle: "What is an Object?"
+description: "Information regarding what an object is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What is the difference between an object and a data type?
+ - Data Type is the definition, Object is an instance of that definition
+- Explain Object Data Type, base foundation of classes
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
+[All Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/_index.md
new file mode 100644
index 000000000..9a6db7afd
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Scopes"
+linkTitle: "Scopes"
+description: "Information related to working with Scopes."
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/what-is-a-scope.md b/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/what-is-a-scope.md
new file mode 100644
index 000000000..22a853071
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/scopes/what-is-a-scope.md
@@ -0,0 +1,38 @@
+---
+title: "What is a Scope?"
+linkTitle: "What is a Scope?"
+description: "Information regarding what a scope is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/tasks/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/tasks/_index.md
new file mode 100644
index 000000000..3db070199
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/tasks/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Tasks"
+linkTitle: "Tasks"
+description: "Information related to working with Tasks."
+---
+
+{{< workinprogress >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/_index.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/_index.md
new file mode 100644
index 000000000..cd6689495
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Text"
+linkTitle: "Text"
+description: "Information related to working with Text."
+---
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/casing.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/casing.md
new file mode 100644
index 000000000..9a3581df0
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/casing.md
@@ -0,0 +1,128 @@
+---
+title: "Casing"
+linkTitle: "Casing"
+description: "Information regarding text casing."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Best Practices
+ - Comparing strings - do not lower or upper pick a relevant culture or ignore case
+
+Links:
+
+- https://learn.microsoft.com/en-us/dotnet/core/extensions/performing-culture-insensitive-string-operations
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/changing-case#compare-strings-of-mixed-case
+
+## Common types of text casing
+
+There are many different types of text casing.
+
+The table below lists some of the most common types of text casing:
+
+| Name | Example | Notes |
+|-----------|----------------------------|-------------|
+| lowercase | `"this is lowercase"` | All letters in all words are lower cased. |
+| UPPERCASE | `"THIS IS UPPERCASE"` | All letters in all words are capitalized. |
+| Title Case | `"This Is Title Case"` | First letter in all words is capitalized, all other letters are lower cased; except for words that are entirely upper cased, such as acronyms, which remain upper cased; spaces and punctuation are preserved. |
+| camelCase | `"thisIsCamelCase"` | First letter in all words (except the first) is capitalized, all other letters are lower cased, and all spaces and punctuation are removed. |
+| PascalCase | `"ThisIsCamelCase"` | First letter in all words is capitalized, all other letters are lower cased, and all spaces and punctuation are removed. |
+
+## Culture Info
+
+Culture Info specifies the culture-specific casing rules used to determine how the case of text is changed.
+
+The table below lists the most common supported culture info:
+
+| Name | Text Value | Description |
+|----------|-----------------|-------------|
+| Invariant Culture | CultureInfo.InvariantCulture | Used to compare text using culture-sensitive sort rules and the [Invariant Culture][]. Case of the texts is considered when comparing. |
+| Current Culture | CultureInfo.CurrentCulture | Used to compare text using culture-sensitive sort rules and the [Current Culture][]. Case of the texts is considered when comparing. |
+
+In addition to [Invariant][Invariant Culture] and [Current Culture][], there are two other types of culture that can be used:
+
+- [Specific Cultures][]
+- [Custom Cultures][]
+
+For more information about culture info, please see [CultureInfo][].
+
+### Invariant Culture
+
+For Invariant Culture, the casing rules used to determine how the case of text is changed are not culture-sensitive.
+
+TODO:
+
+- Link to Working with Culture -> Invariant Culture
+- When to use? If not sure what to choose?
+- notes about invariant culture and a worked through example
+- From https://learn.microsoft.com/en-us/dotnet/api/system.globalization.textinfo.toupper?view=net-6.0
+
+If a security decision depends on a string comparison or a case-change operation, the application should use the InvariantCulture to ensure that the behavior is consistent regardless of the culture settings of the system. However, the invariant culture must be used only by processes that require culture-independent results, such as system services. Otherwise, it produces results that might be linguistically incorrect or culturally inappropriate.
+
+### Current Culture
+
+For Current Culture, the casing rules used to determine how the case of text is changed are culture-sensitive and based on the culture of the operating system the flow execution is running on.
+
+TODO:
+
+- Link to Working with Culture -> Current Culture
+- When to use? If not sure what to choose?
+- Best practices - all OSes in cluster should be installed with same OS culture and settings etc. - should also be time sync'd
+- Notes about current culture and a worked through example
+
+### Specific Cultures
+
+TODO:
+
+- Talk about how there are a number of specific cultures, each with their own casing rules
+- When to use? If not sure what to choose?
+- Link to Working with Culture -> Specific Cultures
+- For a list of cultures that can be returned on Windows systems see https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c under The Language table (`Language tag` defines the code required to create the culture)
+
+### Custom Cultures
+
+TODO:
+
+- Talk about how there can be custom cultures installed, each with their own casing rules
+- When to use? If not sure what to choose?
+- Link to Working with Culture -> Custom Cultures
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO:
+
+- Convert to Uppercase
+- etc
+
+### External Documentation
+
+TODO
+
+[Current Culture]: {{< ref "#current-culture" >}}
+[Invariant Culture]: {{< ref "#invariant-culture" >}}
+[Specific Cultures]: {{< ref "#specific-cultures" >}}
+[Custom Cultures]: {{< ref "#custom-cultures" >}}
+
+[CultureInfo]: {{< url path="MSDocs.DotNet.Api.System.Globalization.CultureInfo" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/converting-objects-to-text.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/converting-objects-to-text.md
new file mode 100644
index 000000000..289cbf121
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/converting-objects-to-text.md
@@ -0,0 +1,87 @@
+---
+title: "Converting Objects To Text"
+linkTitle: "Converting Objects To Text"
+description: "Information regarding converting objects to their text representation."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+### Using Blocks
+
+TODO:
+
+- Explain that blocks can be used - maybe with examples or link to examples within the block documentation
+ - Format Text With Value
+ - Format Text With Values
+ - Join Text
+ - Convert Date Time To Text
+ - Convert Object To Text - need to make it clear how this works - does tostring and if tostring returns class name does json serialisation
+ - Convert Object To Json - need to make it clear how this works - does json serialisation
+
+### Using Expressions
+
+#### ToString()
+
+TODO:
+
+- .ToString() - talk about that some objects will just return their name, text formatting format providers etc.
+- Convert.ToString()
+- Examples and where to find in Data Types documentation
+
+#### String interpolation
+
+See [Interpolated Strings][].
+
+#### String.Format()
+
+TODO: String.Format
+
+## Remarks
+
+### Known Limitations
+
+#### Support for {{}} is Missing
+
+Using `{{VariableName}}` expression syntax to convert a [variable][] to its [String][] representation is currently not supported.
+
+It is possible to convert a [variable][] to its string representation within an [expression][] by using the `ToString()` [method][] (e.g. `($)VariableName.ToString()`)
+
+In future this limitation may be removed.
+
+[variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Variables.WhatIsAVariable.MainDoc" >}}
+[expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.Expressions" >}}
+[method]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MethodExpressions" >}}
+[Interpolated Strings]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.InterpolatedStrings" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO:
+
+- Format Text With Value
+- Format Text With Values
+- Join Text
+- Convert Date Time To Text
+- Convert Object To Text - need to make it clear how this works - does tostring and if tostring returns class name does json serialisation
+- Convert Object To Json - need to make it clear how this works - does json serialisation
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/empty-text-and-whitespace.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/empty-text-and-whitespace.md
new file mode 100644
index 000000000..b96d91918
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/empty-text-and-whitespace.md
@@ -0,0 +1,51 @@
+---
+title: "Empty Text and Whitespace"
+linkTitle: "Empty Text and Whitespace"
+description: "Information regarding empty text and whitespace."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What is an Empty Text?
+- What is Whitespace?
+- Difference between empty text and whitespace
+
+## Empty Text
+
+TODO:
+
+- How to create an empty text - `""` or `String.Empty`
+
+## Whitespace
+
+https://learn.microsoft.com/en-us/dotnet/api/system.char.iswhitespace?view=net-5.0#System_Char_IsWhiteSpace_System_Char_ and textual representation \t \r \n etc.
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/encoding.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/encoding.md
new file mode 100644
index 000000000..0c7b295a5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/encoding.md
@@ -0,0 +1,49 @@
+---
+title: "Encoding"
+linkTitle: "Encoding"
+description: "Information regarding text encoding."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Available encodings
+- How to define them/use them
+ - Different ways to specify encoding:
+ - Encoding encoding = Encoding.GetEncoding(20127);
+ - Encoding encoding = new ASCIIEncoding();
+ - Encoding encoding = Encoding.ASCII;
+- Talk about encode/decode text blocks including base64/url/hex/html/utf8/base64url
+
+Links:
+
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-encoding-introduction
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/equality.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/equality.md
new file mode 100644
index 000000000..51142f784
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/equality.md
@@ -0,0 +1,126 @@
+---
+title: "Equality"
+linkTitle: "Equality"
+description: "Information regarding text equality."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- Best Practices
+ - Use Ordinal to remove ambiguity and increase performance
+ - Comparing strings - do not lower or upper pick a relevant culture or ignore case
+
+Links:
+
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/changing-case#compare-strings-of-mixed-case
+
+## Comparison Types
+
+Comparison Types specify the rules used to determine whether two pieces of text match.
+
+The table below lists the supported comparison types:
+
+| Name | Text Value | Numeric Value | Description |
+|----------|------------|---------------|-------------|
+| [Ordinal][] | StringComparison.Ordinal | 4 | Used to compare text using ordinal sort rules. Case of the texts is considered when comparing. |
+| [Ordinal Ignore Case][] | StringComparison.OrdinalIgnoreCase | 5 | Used to compare text using ordinal sort rules. Case of the texts is ignored when comparing. |
+| [Invariant Culture][] | StringComparison.InvariantCulture | 2 | Used to compare text using culture-sensitive sort rules and the invariant culture. Case of the texts is considered when comparing. |
+| [Invariant Culture Ignore Case][] | StringComparison.InvariantCultureIgnoreCase | 3 | Used to compare text using culture-sensitive sort rules and the invariant culture. Case of the texts is ignored when comparing. |
+| [Current Culture][] | StringComparison.CurrentCulture | 0 | Used to compare text using culture-sensitive sort rules and the current culture. Case of the texts is considered when comparing. |
+| [Current Culture Ignore Case][] | StringComparison.CurrentCultureIgnoreCase | 1 | Used to compare text using culture-sensitive sort rules and the current culture. Case of the texts is ignored when comparing. |
+
+For more information about comparison types, please see [StringComparison][].
+
+TODO: Consider moving sections below into the StringComparison Data Type documentation and removed from this page
+
+### Ordinal
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Ordinal sort rules
+- notes about ordinal and a worked through example
+
+### Ordinal Ignore Case
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Link to Ordinal sort rules, only difference is that it doesn't consider casing when comparing characters
+- notes about ordinal ignore case and a worked through example
+
+### Invariant Culture
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Link to Culture -> Invariant Culture
+- Invariant Culture rules
+- notes about invariant culture and a worked through example
+
+### Invariant Culture Ignore Case
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Link to Culture -> Invariant Culture
+- Link to Invariant Culture sort rules, only difference is that it doesn't consider casing when comparing characters
+- notes about invariant culture ignore case and a worked through example
+
+### Current Culture
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Link to Culture -> Current Culture
+- Current Culture rules
+- notes about current culture and a worked through example
+
+### Current Culture Ignore Case
+
+TODO:
+
+- When to use? If not sure what to choose?
+- Link to Culture -> Current Culture
+- Link to Current Culture sort rules, only difference is that it doesn't consider casing when comparing characters
+- notes about current culture ignore case and a worked through example
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
+
+[Current Culture]: {{< ref "#current-culture" >}}
+[Current Culture Ignore Case]: {{< ref "#current-culture-ignore-case" >}}
+[Invariant Culture]: {{< ref "#invariant-culture" >}}
+[Invariant Culture Ignore Case]: {{< ref "#invariant-culture-ignore-case" >}}
+[Ordinal]: {{< ref "#ordinal" >}}
+[Ordinal Ignore Case]: {{< ref "#ordinal-ignore-case" >}}
+
+[StringComparison]: {{< url path="MSDocs.DotNet.Api.System.StringComparison" >}}
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/formatting.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/formatting.md
new file mode 100644
index 000000000..958199470
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/formatting.md
@@ -0,0 +1,113 @@
+---
+title: "Formatting"
+linkTitle: "Formatting"
+description: "Information regarding text formatting."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What formatting is
+- How to format text
+ - Blocks
+ - Expression
+- How does text formatting use DateTime Formatting and Number Formatting?
+ - Link to Working With -> Date and Time -> Date and Time Formatting
+ - Link to Working With -> Number -> Number Formatting
+
+## Using Blocks
+
+TODO:
+
+- Explain that blocks can be used - maybe with examples or link to examples within the block documentation
+ - Convert Object to Text
+ - Format Text with Value
+ - Format Text with Values
+
+## Using Expressions
+
+TODO: How to format using an expression
+
+### String Interpolation
+
+TODO:
+
+- mention that convert object to text is close to behaviour of string interpolation, but not everything is covered - e.g. no expression support or indexing - recommendation is to use string.interpolation inline as more powerful and saves block licensing
+
+## Format Providers
+
+TODO:
+
+- what are they
+- ways of creating
+ - CultureInfo.InvariantCulture
+ - CultureInfo.CurrentCulture
+ - new CultureInfo("")
+ - new CultureInfo("en-GB")
+
+## Format Templates
+
+TODO:
+
+- Find C# link
+- Talk about what a template is and how format parameters are used (e.g. `"{0}"`)
+- curly brackets need to be escaped when using the $ and $@ prefixes
+
+## Format Specifiers
+
+TODO:
+
+- Add table of format specifiers
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#Starting
+
+TODO: Control formatting
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#control-formatting
+
+TODO: Control spacing
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#control-spacing
+
+TODO: Control alignment
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#control-alignment
+
+TODO: Composite formatting
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#the-format-method-in-brief
+
+TODO: Format Item
+
+- https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=net-6.0#the-format-item
+
+TODO: Anything else relevant on formatting links above
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/pattern-matching-syntax.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/pattern-matching-syntax.md
new file mode 100644
index 000000000..4902f3664
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/pattern-matching-syntax.md
@@ -0,0 +1,48 @@
+---
+title: "Pattern Matching Syntax"
+linkTitle: "Pattern Matching Syntax"
+description: "Information regarding pattern matching syntax."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO
+
+- What is pattern matching?
+ - how is it different to contains or regex
+- Pattern matching can only be used in blocks
+- `*` is 0 or more
+- `?` is 0 or 1
+- to use these as literals use `\\*` `\\?`
+- Common pattern matching
+ - `**/*.ext` (Check that this works)
+ - Common file extensions to search for, how to search for them `*.txt`, `*.pdf`
+ - Link to Files and Folders for list of common extensions
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/regex-syntax.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/regex-syntax.md
new file mode 100644
index 000000000..8e8caee71
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/regex-syntax.md
@@ -0,0 +1,216 @@
+---
+title: "Regex Syntax"
+linkTitle: "Regex Syntax"
+description: "Information regarding .Net regex syntax."
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What is regex matching?
+ - how is it different to contains or pattern matching
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference
+- Common regex expressions
+ - urls, emails, etc
+ - https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-example-scanning-for-hrefs
+ - and subsequent links
+- State that we specify a timeout to prevent dos attacks
+- Talk about no current support for old g2 syntax - may add in future
+
+TODO: Options
+
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-options
+- https://learn.microsoft.com/en-us/dotnet/standard/base-types/miscellaneous-constructs-in-regular-expressions
+
+Links:
+
+- Regex Best Practices - https://learn.microsoft.com/en-us/dotnet/standard/base-types/best-practices
+
+### Character Classes
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+A character class matches any of a set of characters. Character classes include the language elements listed in the following table.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `[characters]` | Matches any character found in characters. | `[oz]` | o in Cortex |
+| `[^characters]` | Matches any character not found in characters. | `[^oz]` | C, r, t, e, x in Cortex |
+| `[first-last]` | Matches any character in the range of characters from first to last. | `[A-C]` | C in Cortex |
+| `.` | Wildcard. Matches any character except \n. | `C.r` | Cor in Cortex |
+| `\p{category}` | Matches any character in a category of Unicode characters, specified by category. To see what you can use for category, please check the supported Unicode general categories and the supported named blocks. | `\p{Lu}` | C in Cortex |
+| `\P{category}` | Matches any character not in a category of Unicode characters, specified by category. To see what you can use for category, please check the supported Unicode general categories, and the supported named blocks. | `\P{Lu}` | o, r, t, e, x in Cortex |
+| `\w` | Matches any letter, decimal digit, or an underscore. | `\w` | C, o, r, t, e, x in Cortex ! |
+| `\W` | Matches any character except a letter, decimal digit, or an underscore. | `\W` | ! in Cortex ! |
+| `\s` | Matches any white-space character. | `\w\s` | x in Cortex ! |
+| `\S` | Matches any character except a white-space character. | `\s\S` | ! in Cortex ! |
+| `\d` | Matches any decimal digit. | `\d` | 7 in Cortex 7! |
+| `\D` | Matches any character except a decimal digit. | `\D` | C, o, r, t, e, x, , ! in Cortex 7! |
+
+https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#SupportedUnicodeGeneralCategories
+https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-classes-in-regular-expressions#supported-named-blocks
+
+### Character Escapes
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+The following table lists the character escapes supported by regular expressions in .NET.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `\r` | Matches a carriage return. | `\r\n(\w+)` | \r\nCortex in \r\nCortex with\na new line |
+| `\n` | Matches a newline. | `\r\n(\w+)` | \r\nCortex in \r\nCortex with\na new line |
+| `\t` | Matches a tab. | `(\w+)\t` | Cortex1\t, Cortex2\t in Cortex1\tCortex2\t |
+| `[\b]` | Matches a backspace. Note that it must be enclosed in brackets to have this meaning. | `[\b]{3,}` | \b\b\b\b in \b\b\b\b |
+| `\f` | Matches a form feed. | `[\f]{2,}` | \f\f\f in \f\f\f |
+| `\e` | Matches an escape. | `\e` | \x001B in \x001B |
+| `\v` | Matches a vertical tab. | `[\v]{2,}` | \v\v\v in \v\v\v |
+| `\a` | Matches the bell character. | `\a` | \u0007 in Cortex '\u0007' |
+| `\octal` | Matches a character, where octal is the octal representation of that character. | `\w\040\w` | x C in Cortex Cortex |
+| `\xhex` | Matches a character, where hex is the two-digit hexadecimal representation of that character. | `\w\x20\w` | x C in Cortex Cortex |
+| `\uunicode` | Matches a Unicode character, where unicode is the four digit hexadecimal representation of that Unicode character. | `\w\u0020\w` | x C in Cortex Cortex |
+| `\ccharacter` | Matches an ASCII control character specified by character. | `\cC` | \x0003 in \x0003 |
+
+### Quantifiers
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+A quantifier specifies how many instances of the previous element (which can be a character, a group, or a character class) must be present in the input string for a match to occur. Quantifiers include the language elements listed in the following table.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `*` | Matches previous element zero or more times. | `co*rtex` | crtex, cortex, coortex, coooortex in crtex cortex coortex coooortex |
+| `+` | Matches previous element one or more times. | `co+rtex` | cortex, coortex, coooortex in crtex cortex coortex coooortex |
+| `?` | Matches previous element zero or one times. | `co?rtex` | crtex, cortex in crtex cortex coortex coooortex |
+| `{n}` | Matches previous element exactly n times. | `co{2}rtex` | coortex in crtex cortex coortex coooortex |
+| `{n,}` | Matches previous element at least n times. | `co{2,}rtex` | coortex, coooortex in crtex cortex coortex coooortex |
+| `{n,m}` | Matches previous element at least n times and at most m times. | `co{1,2}rtex` | cortex, coortex in crtex cortex coortex coooortex |
+| `*?` | Matches previous element zero or more times, but as few times as possible. | `cort(ex)*?` | cort in cortexexex |
+| `+?` | Matches previous element one or more times, but as few times as possible. | `cort(ex)+?` | cortex in cortexexex |
+| `??` | Matches previous element zero or one time, but as few times as possible. | `cort(ex)??` | cort in cortexexex |
+| `{n,}?` | Matches previous element at least n times, but as few times as possible. | `cort(ex){2,}?` | cortexex in cortexexex |
+| `{n,m}?` | Matches previous element at least n times and at most m times, but as few times as possible. | `cort(ex){1,3}?` | cortex in cortexexex |
+
+### Anchors
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+Anchors cause a match to succeed or fail depending on the current position in the string.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `^` | Matches the beginning of the input. | `^\w{3}` | Cor in Cortex |
+| `$` | Matches the end of the input, or the point before a final \n at the end of the input. | `\w{3}$` | tex in Cortex |
+| `\A` | Matches the beginning of the input. Identical to ^, except it is unaffected by the multi-line option. | `\A\w{3}` | Cor in Cortex |
+| `\z` | Matches the end of the input, without exception. | `\w{3}\z` | tex in Cortex |
+| `\Z` | Matches the end of the input, or the point before a final \n at the end of the input. Identical to $, except it is unaffected by the multi-line option. | `\w{3}\Z` | tex in Cortex |
+| `\G` | Matches the point that the previous match ended. Used to find contiguous matches. | `\G\D*\s` | Cortex , reads in Cortex reads 7 files |
+| `\b` | Matches any word boundary. Specifically, any point between a \w and a \W. | `\b\w+\s\w+\b` | Cortex reads, Cortex writes in Cortex reads Cortex writes |
+| `\B` | Matches any point that is not a word boundary. Specifically, any point not between a \w and a \W. | `\Brt\w*\b` | rtex, rtex in Cortex reads Cortex writes |
+
+### Grouping Constructs
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+Grouping constructs delineate sub-expressions of a regular expression and typically capture sub-strings of an input string. Grouping constructs include the language elements listed in the following table.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `(subpattern) `| Captures subpattern as an unnamed group. | `(\w)\1` | oo in Coortex |
+| `(?subpattern)` | Captures subpattern as a named group specified by name. | `(?\w)\k` | oo in Coortex |
+| `(?subpattern)` | Balancing group definition. This allows nested constructs to be matched, such as parentheses or HTML tags. The previously defined group to balance against is specified by previous. Captures subpattern as a named group specified by name, or name can be omitted to capture as an unnamed group. | `(((?)[^<]*)+([^<]*(?))+)+(?(open)(?!))` | <span>Cortex this is included</span>, <span>Cortex this is included too</span> in not included <span>Cortex this is included</span> not included either <span>Cortex this is included too</span> |
+| `(?:subpattern)` | Non-capturing group. Allows the use of parentheses without subpattern being captured into a group. | `Cortex\s(?:include)?` | Cortex include, Cortex in Cortex include Cortex not include |
+| `(?enabled-disabled:subpattern)` | Allows subpattern to be matched with different options than the rest of the pattern. Any inline option characters in enabled or disabled will enable or disable specific options, respectively. To see what inline option characters are available, please check the regular expressions options. | `(?i:c\|v)(ortex)` | cortex, Cortex, Vortex in cortex Cortex Vortex CORTEX |
+| `(?=subpattern)` | Zero-width positive look-ahead assertion. Continues matching only if subpattern matches on the right. | `\w+(?=ex\b)` | Cort, Vort in Cortex Vortex Balloon |
+| `(?!subpattern)` | Zero-width negative look-ahead assertion. Continues matching only if subpattern does not match on the right. | `\b\w+\.(?!exe)\w+\b` | cortex.jpg, cortex.html in cortex.jpg cortex.html .*.html cortex.exe |
+| `(?<=subpattern)` | Zero-width positive look-behind assertion. Continues matching only if subpattern matches on the left. | `(?<=\(\$\))\w+` | variable, 22 in ($)variable ($)22 ($)-- |
+| `(?subpattern)` | Prevents backtracking over subpattern, which can improve performance. | `[cv](?>o+r+)` | cor, coor, vor in cortex coortex vortex gortex |
+
+### Back-reference Constructs
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+A back-reference allows a previously matched sub-expression to be identified subsequently in the same regular expression. The following table lists the back-reference constructs supported by regular expressions in .NET.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `\number` | Matches the value of a previously captured group, specified by number. | `\b(\w)\w*\1\b` | xcortex, that in Finds all words like xcortex that start and end with the same letter |
+| `\k` | Matches the value of a previously captured named group, specified by name. | `(?\p{P})\w+\k` | !cortex!, ?cortex? in !cortex! ?cortex? XcortexX |
+
+### Alternation Constructs
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+Alternation constructs changes a regular expression to enable either/or matching. These constructs include the language elements listed in the following table.
+
+| Syntax | Description | Pattern | Matches |
+|---|---|---|---|
+| `\|` | Functions as a logical or. Matches any elements it separates. | `(c\|v)ortex` | cortex, vortex in cortex vortex xortex |
+| `(?(subpattern)yes\|no)` | Treats subpattern as a zero-width assertion to check if it matches. If so, attempts to match with the yes subpattern. Otherwise, tries the no subpattern. The \|no part is optional. | `\b(?(\w+tez\b)\w{3}\|cortex)` | cortex, cor in cortex cortez vortex |
+| `(?(group)yes\|no)` | Checks if a previously defined group was successfully captured, specified by group, which can be a number or a name for a named group. If so, attempts to match with the yes subpattern. Otherwise, tries the no subpattern. The \|no part is optional. | `(?(\(\$\)))\w+\|'\w+'` | cortex, 'cortex' in ($)cortex 'cortex' |
+
+### Substitutions
+
+TODO:
+
+- Include information about any builtin snippets for each regex
+
+Substitutions are regular expression language elements supported in replacement patterns.
+
+| Syntax | Description | Pattern | Replacement | Result |
+|---|---|---|---|---|
+| `$number` | Substitutes the value of a group, specified by number. | `\b(\w+)(\s)(\w+)\b` | `$3$2$1` | Cortex Great becomes Great Cortex |
+| `${name}` | Substitutes the value of a named group, specified by name. | `\b(?\w+)(\s)(?\w+)\b` | `${word2} ${word1}` | Cortex Great becomes Great Cortex |
+| `$$` | Substitutes the $ character. | `\b(dollar)` | `$$` | (dollar)name becomes ($)name |
+| `$&` | Substitutes the entire match. | `\w+` | `\*\*$&\*\*` | Cortex becomes \*\*Cortex\*\* |
+| ``$` `` | Substitutes all input text found before the match. | `#+` | ``$` `` | Co##rtex becomes CoCortex |
+| `$'` | Substitutes all input text found after the match. | `#+` | `$'` | Cort##ex becomes Cortexex |
+| `$+` | Substitutes the last group captured. | `Co(r)` | `$+` | CoCortex becomes Cortex |
+| `$_` | Substitutes the entire input. | `\w+?` | `$_` | Cortex becomes Cortex Cortex Cortex Cortex Cortex Cortex |
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO: List blocks which support using regex
+
+TODO: All blocks which support regex should link back here from the properties that support it
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Concepts/working-with/text/what-is-text.md b/content/en/docs/2026.3/Reference/Concepts/working-with/text/what-is-text.md
new file mode 100644
index 000000000..0fee94a8e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Concepts/working-with/text/what-is-text.md
@@ -0,0 +1,68 @@
+---
+title: "What is Text?"
+linkTitle: "What is Text?"
+description: "Information regarding what text is."
+weight: 1
+---
+
+# {{% param title %}}
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO:
+
+- What is text
+ - null, string.Empty, and whitespace
+- Difference between string and char
+- Operators and Comparisons
+ - https://learn.microsoft.com/en-us/dotnet/standard/base-types/basic-string-operations
+ - Concatenation
+ - Equality
+ - Casing
+ - Ordinal
+ - Invariant Culture
+ - Current Culture
+ - https://learn.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings
+ - LiteralText vs Regex vs PatternMatching
+ - Links to LiteralText
+ - Links to Regex
+ - Links to PatternMatching
+- Parsing text to a number
+- String Formatting
+ - Date Formatting
+ - Number Formatting
+- Encoding
+- Immutability of strings https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/#immutability-of-strings
+- Literal, Verbatim and Interpolated Strings
+ - String escape sequences https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/#string-escape-sequences
+- Substrings and Indexing
+
+Links:
+
+- https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/
+
+## Remarks
+
+### Known Limitations
+
+TODO
+
+## See Also
+
+### Related Concepts
+
+TODO
+
+### Related Data Types
+
+TODO
+
+### Related Blocks
+
+TODO
+
+### External Documentation
+
+TODO
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/_index.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/_index.md
new file mode 100644
index 000000000..2bf5aaf81
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Property"
+linkTitle: "Property"
+description: "Exceptions related to issues with Block Properties"
+---
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-item-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-item-exception.md
new file mode 100644
index 000000000..1da6faad4
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-item-exception.md
@@ -0,0 +1,106 @@
+---
+title: "PropertyContainsNullItemException"
+linkTitle: "PropertyContainsNullItemException"
+description: "The exception thrown when a property is provided with a value that contains at least one item that is `null`."
+---
+
+# {{% param title %}}
+
+
+
+## Description
+
+The exception thrown when a [property][] is provided with a value that contains at least one item that is `null`.
+
+## Reasons
+
+### Value Contains `null` item
+
+A `null` item is contained in the value that was provided for the [property][].
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"'' contains at least one null value; it must only contain values that are not null.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the property.
+
+#### How to fix
+
+Ensure the value provided for the [property][] named `` does not contain items that are `null`.
+
+## Properties
+
+### Exception Type
+
+The type of the exception (i.e. `PropertyContainsNullItemException`).
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Message
+
+The exception message, providing information about the exception that occurred.
+
+For this exception:
+
+* `` will be replaced with the name of the [property][].
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Help Link
+
+The URL for the relevant section of this exception's help page.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+## Remarks
+
+### Known Limitations
+
+Currently, only the `` has been included in the exception. In future, we will look to include the name and Id of the [block][], the id, name and value of the [property][], as well as allowing the exception to contain a link to take you directly to the offending value.
+
+## See Also
+
+### Related Data Types
+
+* [String][]
+
+### Related Concepts
+
+* [Blocks][block]
+* [Block Properties][property]
+* [Exceptions][]
+
+### Related Blocks
+
+* Tasks
+ * [Cancel All Tasks][]
+ * [Wait For All Tasks][]
+
+### External Documentation
+
+None
+
+[Message]: {{< ref "#message" >}}
+
+[Cancel All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.CancelTask.CancelAllTasksBlock.MainDoc" >}}
+[Wait For All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForAllTasksBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-or-empty-item-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-or-empty-item-exception.md
new file mode 100644
index 000000000..a3a05b726
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-contains-null-or-empty-item-exception.md
@@ -0,0 +1,104 @@
+---
+title: "PropertyContainsNullOrEmptyItemException"
+linkTitle: "PropertyContainsNullOrEmptyItemException"
+description: "The exception thrown when a property is provided with a value that contains at least one item that is either `null` or empty, but the item is required to have a value."
+---
+
+# {{% param title %}}
+
+
+
+## Description
+
+The exception thrown when a [property][] is provided with a value that contains at least one item that is either `null` or empty, but the item is required to have a value.
+
+## Reasons
+
+### Value Contains `null` or empty item
+
+A `null` or empty item is contained in the value that was provided for the [property][].
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"'' contains at least one null or empty value; it must only contain values that are not null or empty.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the property.
+
+#### How to fix
+
+Ensure the value provided for the [property][] named `` does not contain items that are either `null` or empty.
+
+## Properties
+
+### Exception Type
+
+The type of the exception (i.e. `PropertyContainsNullOrEmptyItemException`).
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Message
+
+The exception message, providing information about the exception that occurred.
+
+For this exception:
+
+* `` will be replaced with the name of the [property][].
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Help Link
+
+The URL for the relevant section of this exception's help page.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+## Remarks
+
+### Known Limitations
+
+Currently, only the `` has been included in the exception. In future, we will look to include the name and Id of the [block][], the id, name and value of the [property][], as well as allowing the exception to contain a link to take you directly to the offending value.
+
+## See Also
+
+### Related Data Types
+
+* [String][]
+
+### Related Concepts
+
+* [Blocks][block]
+* [Block Properties][property]
+* [Exceptions][]
+
+### Related Blocks
+
+* Exceptions
+ * [Handle Block Exception Matching Type Names][]
+
+### External Documentation
+
+None
+
+[Message]: {{< ref "#message" >}}
+
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-empty-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-empty-exception.md
new file mode 100644
index 000000000..89bd5b29e
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-empty-exception.md
@@ -0,0 +1,239 @@
+---
+title: "PropertyEmptyException"
+linkTitle: "PropertyEmptyException"
+description: "The exception thrown when a property is provided with an empty value, but a non-empty value is required."
+---
+
+# {{% param title %}}
+
+
+
+## Description
+
+The exception thrown when a [property][] is provided with an [empty][] value, but a non-empty value is required.
+
+## Reasons
+
+### Empty value
+
+An [empty][] value was provided for the [property][].
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"'' is empty; it must be provided a value.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the property.
+
+#### How to fix
+
+Ensure the value provided for the [property][] named `` is not [empty][].
+
+## Properties
+
+### Exception Type
+
+The type of the exception (i.e. `PropertyEmptyException`).
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Message
+
+The exception message, providing information about the exception that occurred.
+
+For this exception:
+
+* `` will be replaced with the name of the [property][].
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Help Link
+
+The URL for the relevant section of this exception's help page.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+## Remarks
+
+### Known Limitations
+
+Currently, only the `` has been included in the exception. In future, we will look to include the name and Id of the [block][], the id, name and value of the [property][], as well as allowing the exception to contain a link to take you directly to the offending value.
+
+## See Also
+
+### Related Data Types
+
+* [String][]
+
+### Related Concepts
+
+* [Blocks][]
+* [Block Properties][]
+* [Exceptions][]
+
+### Related Blocks
+
+* Data
+ * [Execute Data Command][]
+* Data Storage
+ * [Create Collection][]
+ * [Delete Collection][]
+ * [Delete Data With Key][]
+ * [Read Data With Key][]
+ * [Wait For Collection To Exist][]
+ * [Wait For Collection To Not Exist][]
+ * [Wait For Key In Collection To Be Set][]
+ * [Wait For Key In Collection To Contain Value][]
+ * [Wait For Key In Collection To Exist][]
+ * [Wait For Key In Collection To Not Exist][]
+ * [Write Data With Key][]
+* Date & Time
+ * [Convert Text To Date Time][]
+* Email
+ * [Send Email Using SMTP Server][]
+* Exceptions
+ * [Handle Block Exception Matching Messages][]
+ * [Handle Block Exception Matching Type Name][]
+ * [Handle Block Exception Matching Type Names][]
+* Files & Folders
+ * [Copy File][]
+ * [Copy Files][]
+ * [Copy Folder][]
+ * [Copy Folders][]
+ * [Create Folder][]
+ * [Create Folders][]
+ * [Delete File][]
+ * [Delete Files][]
+ * [Delete Folder][]
+ * [Delete Folders][]
+ * [Duplicate Folder][]
+ * [Get File Information][]
+ * [Get Folder Content][]
+ * [Get Folder Information][]
+ * [Move File][]
+ * [Move Files][]
+ * [Move Folder][]
+ * [Move Folders][]
+ * [Read All Lines][]
+ * [Read All Text][]
+ * [Rename Folder][]
+ * [Search File][]
+ * [Search Files][]
+ * [Write All Lines][]
+ * [Write All Text][]
+* Json
+ * [Convert Json To Object][]
+* Lists
+ * [Get Item At Beginning][]
+ * [Get Item At End][]
+ * [Set Item At Beginning][]
+ * [Set Item At End][]
+ * [Set Items At Beginning][]
+ * [Set Items At End][]
+ * [Set Items At Index][]
+* Queues
+ * [Dequeue Item][]
+ * [Dequeue Items][]
+ * [Peek Item][]
+* Tasks
+ * [Cancel All Tasks][]
+ * [Wait For All Tasks][]
+* Xml
+ * [Convert Structure To Xml][]
+ * [Convert Xml To Structure][]
+
+### External Documentation
+
+None
+
+[Message]: {{< ref "#message" >}}
+
+[Execute Data Command]: {{< url path="Cortex.Reference.Blocks.Data.ExecuteDataCommand.ExecuteDataCommand.MainDoc" >}}
+
+[Convert Text To Date Time]: {{< url path="Cortex.Reference.Blocks.DateAndTime.ConvertDateTime.ConvertTextToDateTime.MainDoc" >}}
+
+[Create Collection]: {{< url path = "Cortex.Reference.Blocks.DataStorage.CreateCollection.CreateCollectionBlock.MainDoc">}}
+[Delete Collection]: {{< url path = "Cortex.Reference.Blocks.DataStorage.DeleteCollection.DeleteCollectionBlock.MainDoc">}}
+[Delete Data With Key]: {{< url path="Cortex.Reference.Blocks.DataStorage.DeleteData.DeleteDataWithKeyBlock.MainDoc">}}
+[Read Data With Key]: {{< url path="Cortex.Reference.Blocks.DataStorage.ReadData.ReadDataWithKeyBlock.MainDoc">}}
+[Wait For Collection To Exist]: {{< url path="Cortex.Reference.Blocks.DataStorage.WaitForCollection.WaitForCollectionToExistBlock.MainDoc">}}
+[Wait For Collection To Not Exist]: {{< url path="Cortex.Reference.Blocks.DataStorage.WaitForCollection.WaitForCollectionToNotExistBlock.MainDoc">}}
+[Wait For Key In Collection To Be Set]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WaitForKeyInCollection.WaitForKeyInCollectionToBeSetBlock.MainDoc">}}
+[Wait For Key In Collection To Contain Value]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WaitForKeyInCollection.WaitForKeyInCollectionToContainValueBlock.MainDoc">}}
+[Wait For Key In Collection To Exist]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WaitForKeyInCollection.WaitForKeyInCollectionToExistBlock.MainDoc">}}
+[Wait For Key In Collection To Not Exist]: {{< url path = "Cortex.Reference.Blocks.DataStorage.WaitForKeyInCollection.WaitForKeyInCollectionToNotExistBlock.MainDoc">}}
+[Write Data With Key]: {{< url path="Cortex.Reference.Blocks.DataStorage.WriteData.WriteDataWithKeyBlock.MainDoc">}}
+
+[Send Email Using SMTP Server]: {{< url path="Cortex.Reference.Blocks.Email.SendEmail.SendEmailUsingSmtpServer.MainDoc" >}}
+
+[Handle Block Exception Matching Messages]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingMessages.MainDoc" >}}
+[Handle Block Exception Matching Type Name]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeName.MainDoc" >}}
+[Handle Block Exception Matching Type Names]: {{< url path="Cortex.Reference.Blocks.Exceptions.HandleBlock.HandleBlockExceptionMatchingTypeNames.MainDoc" >}}
+
+[Copy File]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFile.CopyFile.MainDoc" >}}
+[Copy Files]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFile.CopyFiles.MainDoc" >}}
+[Copy Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.CopyFolder.MainDoc" >}}
+[Copy Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.CopyFolders.MainDoc" >}}
+[Create Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CreateFolder.CreateFolder.MainDoc" >}}
+[Create Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CreateFolder.CreateFolders.MainDoc" >}}
+[Delete File]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.DeleteFile.DeleteFile.MainDoc" >}}
+[Delete Files]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.DeleteFile.DeleteFiles.MainDoc" >}}
+[Delete Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.DeleteFolder.DeleteFolder.MainDoc" >}}
+[Delete Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.DeleteFolder.DeleteFolders.MainDoc" >}}
+[Duplicate Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.CopyFolder.DuplicateFolder.MainDoc" >}}
+[Get File Information]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.GetFileInformation.GetFileInformation.MainDoc" >}}
+[Get Folder Content]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.GetFolderContent.GetFolderContent.MainDoc" >}}
+[Get Folder Information]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.GetFolderInformation.GetFolderInformation.MainDoc" >}}
+[Move File]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFile.MoveFile.MainDoc" >}}
+[Move Files]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFile.MoveFiles.MainDoc" >}}
+[Move Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFolder.MoveFolder.MainDoc" >}}
+[Move Folders]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.MoveFolder.MoveFolders.MainDoc" >}}
+[Read All Lines]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.ReadFile.ReadAllLines.MainDoc" >}}
+[Read All Text]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.ReadFile.ReadAllText.MainDoc" >}}
+[Rename Folder]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.RenameFolder.RenameFolder.MainDoc" >}}
+[Search File]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.SearchFile.SearchFile.MainDoc" >}}
+[Search Files]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.SearchFile.SearchFiles.MainDoc" >}}
+[Write All Lines]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.WriteFile.WriteAllLines.MainDoc" >}}
+[Write All Text]: {{< url path="Cortex.Reference.Blocks.FilesAndFolders.WriteFile.WriteAllText.MainDoc" >}}
+
+[Convert Json To Object]: {{< url path="Cortex.Reference.Blocks.Json.ConvertJson.ConvertJsonToObject.MainDoc" >}}
+
+[Get Item At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemAtBeginning.MainDoc" >}}
+[Get Item At End]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemAtEnd.MainDoc" >}}
+[Set Item At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemAtBeginning.MainDoc" >}}
+[Set Item At End]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemAtEnd.MainDoc" >}}
+[Set Items At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtBeginning.MainDoc" >}}
+[Set Items At End]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtEnd.MainDoc" >}}
+[Set Items At Index]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtIndex.MainDoc" >}}
+
+[Dequeue Item]: {{< url path="Cortex.Reference.Blocks.Queues.DequeueItem.DequeueItemBlock.MainDoc" >}}
+[Dequeue Items]: {{< url path="Cortex.Reference.Blocks.Queues.DequeueItem.DequeueItemsBlock.MainDoc" >}}
+[Peek Item]: {{< url path="Cortex.Reference.Blocks.Queues.PeekItem.PeekItemBlock.MainDoc" >}}
+
+[Convert Structure To Xml]: {{< url path="Cortex.Reference.Blocks.Xml.ConvertXml.ConvertStructureToXml.MainDoc" >}}
+[Convert Xml To Structure]: {{< url path="Cortex.Reference.Blocks.Xml.ConvertXml.ConvertXmlToStructure.MainDoc" >}}
+
+[Cancel All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.CancelTask.CancelAllTasksBlock.MainDoc" >}}
+[Wait For All Tasks]: {{< url path="Cortex.Reference.Blocks.Tasks.WaitForTask.WaitForAllTasksBlock.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
+
+[empty]: {{< url path="Cortex.Reference.Glossary.A-E.Empty" >}}
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-item-count-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-item-count-exception.md
new file mode 100644
index 000000000..5b3f1b267
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-item-count-exception.md
@@ -0,0 +1,121 @@
+---
+title: "PropertyItemCountException"
+linkTitle: "PropertyItemCountException"
+description: "The exception thrown when the values provided for two properties are expected to contain the same number of items, but don't."
+---
+
+# {{% param title %}}
+
+
+
+## Description
+
+The exception thrown when the values provided for two [properties][] are expected to contain the same number of items, but don't.
+
+## Reasons
+
+### Item Counts Are Different
+
+Values provided for two [properties][] are expected to contain the same number of items, but don't.
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"Invalid '' provided.
+There are items in '' and items in ''.
+The number of items in '' must be the same as the number of items in ''.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the first property.
+* `` is the name of the second property.
+* `` is the count of items in the first property.
+* `` is the count of items in the second property.
+
+#### How to fix
+
+Ensure that the value provided for each of the two [properties][] contains the same number of items.
+
+## Properties
+
+### Exception Type
+
+The type of the exception (i.e. `PropertyItemCountException`).
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Message
+
+The exception message, providing information about the exception that occurred.
+
+For this exception:
+
+* `` will be replaced with the name of the first property.
+* `` will be replaced with the name of the second property.
+* `` will be replaced with the count of items in the first property.
+* `` will be replaced with the count of items in the second property.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Help Link
+
+The URL for the relevant section of this exception's help page.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+## Remarks
+
+### Known Limitations
+
+Currently, the `` and `` have been included in the exception. In future, we will look to include the name and Id of the [block][], the id, name and value of the [property][properties], as well as allowing the exception to contain a link to take you directly to the offending value.
+
+## See Also
+
+### Related Data Types
+
+* [String][]
+
+### Related Concepts
+
+* [Blocks][]
+* [Block Properties][]
+* [Exceptions][]
+
+### Related Blocks
+
+* Dictionaries
+ * [Set Items With Keys][]
+ * [Set Items With Values][]
+* Lists
+ * [Set Items At Indexes][]
+ * [Set Items With Values][List Set Items With Values]
+
+### External Documentation
+
+None
+
+[Message]: {{< ref "#message" >}}
+
+[Set Items With Keys]: {{< url path="Cortex.Reference.Blocks.Dictionaries.SetItem.SetItemsWithKeys.MainDoc" >}}
+[Set Items With Values]: {{< url path="Cortex.Reference.Blocks.Dictionaries.SetItem.SetItemsWithValues.MainDoc" >}}
+
+[Set Items At Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtIndexes.MainDoc" >}}
+[List Set Items With Values]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsWithValues.MainDoc" >}}
+
+[Blocks]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.MainDoc" >}}
+[block]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.WhatIsABlock.MainDoc" >}}
+[Block Properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.MainDoc" >}}
+[properties]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-null-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-null-exception.md
new file mode 100644
index 000000000..964d3bcd5
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/Property/property-null-exception.md
@@ -0,0 +1,403 @@
+---
+title: "PropertyNullException"
+linkTitle: "PropertyNullException"
+description: "The exception thrown when a property is provided with a `null` value, but a non-null value is required."
+---
+
+# {{% param title %}}
+
+
+
+## Description
+
+The exception thrown when a [property][] is provided with a value that falls outside its accepted range.
+
+There are multiple reasons that this exception can be thrown:
+
+* [Property Is Empty][]
+* [Property Is Empty Or `null`][]
+* [Property Is Invalid][]
+* [Property Is Negative][]
+* [Property Greater Than Maximum Value][]
+* [Property Less Than Minimum Value][]
+
+## Reasons
+
+### Property Is Empty
+
+An operation such as getting, setting or removing one or more items from an empty collection [property][] was performed.
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"Invalid '' provided.
+There are no items in ''.
+Check that '' is not empty.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the empty collection [property][].
+* `` is the name of another [property][] used to perform the get, set or remove operation (e.g. `index`, `indexes`, `count` etc.).
+
+#### How to fix
+
+Provide a non-empty collection [property][].
+
+### Property Is Empty Or `null`
+
+An operation such as adding, getting or removing text from a `null` or empty (i.e. `""`) text [property][] was performed.
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"Invalid '' provided.
+Check that '' is not null or empty.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the `null` or empty (i.e. `""`) text [property][].
+
+#### How to fix
+
+Provide a non-`null` or non-empty text [property][].
+
+### Property Is Invalid
+
+A [property][] was set to an invalid value.
+
+#### Message Format
+
+The format of the [Message][] can be one of the following:
+
+```json
+"'' given was ; it must be a value between and .
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"'' given was ; it must be a value between and ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"`` given was ; it must be less than or equal to .
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"'' given was and '' given was .
+The '' must be less than or equal to ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"Invalid '' provided.
+The values in '' are outside of the expected range.
+Check that the provided values of '' are between and .
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the [property][] with the invalid value (e.g. `Length`, `Count`, `Index`).
+* `` is the invalid value of the [property][] (e.g. `100` for non-collection values or `100, 200` for collection values).
+* `` is the minimum value allowed (e.g. `0`).
+* `` is the maximum value allowed (e.g. `9`).
+* `` is how the maximum allowed value is calculated (e.g. `'Text.Length' - 1`).
+* `` is the name of a related [property][] relevant to the exception (e.g. `Index`).
+* `` is the value of a related [property][] relevant to the exception (e.g. `1`).
+
+#### How to fix
+
+Provide a valid value for the [property][] as instructed by the [Message][].
+
+### Property Is Negative
+
+A [property][] was set to a negative [TimePeriod][] when a positive [TimePeriod][] was required.
+
+#### Message Format
+
+The format of the [Message][] is as follows:
+
+```json
+"The provided 'TimePeriod' () equates to milliseconds which is invalid; it must be a non-negative value.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the [TimePeriod][] value in its text representation (e.g. `0.0.0.0:0:0:-10`).
+* `` is the [TimePeriod][] value represented as total milliseconds (e.g. `-10`).
+
+#### How to fix
+
+Provide a valid non-negative [TimePeriod][] value for the [property][] as instructed by the [Message][].
+
+### Property Greater Than Maximum Value
+
+A positive [TimePeriod][] was added to the [property][] or a negative [TimePeriod][] was subtracted from the [property][], and the result is greater than the allowed maximum value of the [DateTimeOffset][] data type.
+
+#### Message Format
+
+The format of the [Message][] can be one of the following:
+
+* If a positive [TimePeriod][] was added
+
+```json
+"The provided 'DateTimeOffset' () with the addition of the given 'TimePeriod' () is greater than the maximum of a DateTimeOffset ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+* If a negative [TimePeriod][] value was subtracted
+
+```json
+"The provided 'DateTimeOffset' () with the subtraction of the given 'TimePeriod' () is greater than the maximum of a DateTimeOffset ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the value of the [DateTimeOffset][] in [ISO 8601 format][] (i.e. `2022-07-01T14:00:00.0000000+01:00`).
+* `` is the value of the [TimePeriod][] in text format (i.e. `9999.0.0.0:0:0:0`).
+* `` is the maximum value of a [DateTimeOffset][] (i.e. `9999-12-31T23:59:59.9999999+00:00`).
+
+#### How to fix
+
+Provide a [TimePeriod][] value that when added to or subtracted from the [property][] results in the [property][] being less than the allowed maximum value of the [DateTimeOffset][] data type.
+
+### Property Less Than Minimum Value
+
+A positive [TimePeriod][] was subtracted from the [property][] or a negative [TimePeriod][] was added to the [property][], and the result was less than the allowed minimum value of the [DateTimeOffset][] data type.
+
+#### Message Format
+
+The format of the [Message][] can be one of the following:
+
+* If a positive [TimePeriod][] was subtracted
+
+```json
+"The provided 'DateTimeOffset' () with the subtraction of the given 'TimePeriod' () is less than the minimum of a DateTimeOffset ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+* If a negative [TimePeriod][] value was added
+
+```json
+"The provided 'DateTimeOffset' () with the addition of the given 'TimePeriod' () is less than the minimum of a DateTimeOffset ().
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the value of the [DateTimeOffset][] in [ISO 8601 format][] (i.e. `2022-07-01T14:00:00.0000000+01:00`).
+* `` is the value of the [TimePeriod][] in text format (i.e. `-9999.0.0.0:0:0:0`).
+* `` is the minimum value of a [DateTimeOffset][] (i.e. `0001-01-01T00:00:00.0000000+00:00`).
+
+#### How to fix
+
+Provide a [TimePeriod][] value that when added to or subtracted from the [property][] results in the [property][] being greater than the allowed minimum value of the [DateTimeOffset][] data type.
+
+## Properties
+
+### Exception Type
+
+The type of the exception (i.e. `PropertyValueOutOfRangeException`).
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Message
+
+The exception message, providing information about the exception that occurred.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+### Help Link
+
+The URL for the relevant section of this exception's help page.
+
+| | |
+|-----------|------------|
+| Data Type | [String][] |
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### Related Data Types
+
+* Date & Time
+ * [DateTimeOffset][]
+ * [TimePeriod][]
+* Text
+ * [String][]
+
+### Related Concepts
+
+* [Exceptions][]
+* [Working with Collections][]
+* [Working with Date and Time][]
+* [Working with Text][]
+
+### Related Blocks
+
+* Date & Time
+ * [Add Time Period][]
+ * [Subtract Time Period][]
+* Lists
+ * [Add Item At Index][]
+ * [Add Items At Index][]
+ * [Get Item At Index][]
+ * [Get Items At Beginning][]
+ * [Get Items At End][]
+ * [Get Items At Index][]
+ * [Get Items At Indexes][]
+ * [Remove Item At Index][]
+ * [Remove Items At Beginning][]
+ * [Remove Items At End][]
+ * [Remove Items At Index][]
+ * [Remove Items At Indexes][]
+ * [Set Item At Index][]
+ * [Set Items At Index][]
+ * [Set Items At Indexes][]
+* PowerShell
+ * [Execute PowerShell Script][]
+* Queues
+ * [Dequeue Items][]
+* Schedules
+ * [Wait For Duration][]
+* Text
+ * [Add Text After Index][]
+ * [Add Text Before Index][]
+ * [Get Text At Beginning][]
+ * [Get Text At End][]
+ * [Get Text At Index][]
+ * [Get Text Before Index][]
+ * [Get Text Between Indexes][]
+ * [Remove Text At Beginning][]
+ * [Remove Text At End][]
+ * [Remove Text At Index][]
+ * [Remove Text Before Index][]
+ * [Remove Text Between Indexes][]
+
+### External Documentation
+
+None
+
+[Property Greater Than Maximum Value]: {{< ref "#property-greater-than-maximum-value" >}}
+[Property Less Than Minimum Value]: {{< ref "#property-less-than-minimum-value" >}}
+[Property Is Empty]: {{< ref "#property-is-empty" >}}
+[Property Is Empty Or `null`]: {{< ref "#property-is-empty-or-null" >}}
+[Property Is Invalid]: {{< ref "#property-is-invalid" >}}
+[Property Is Negative]: {{< ref "#property-is-negative" >}}
+
+[Message]: {{< ref "#message" >}}
+
+[Add Time Period]: {{< url path="Cortex.Reference.Blocks.DateAndTime.AddTimePeriod.AddTimePeriod.MainDoc" >}}
+[Subtract Time Period]: {{< url path="Cortex.Reference.Blocks.DateAndTime.SubtractTimePeriod.SubtractTimePeriod.MainDoc" >}}
+
+[Add Item At Index]: {{< url path="Cortex.Reference.Blocks.Lists.AddItem.AddItemAtIndex.MainDoc" >}}
+[Add Items At Index]: {{< url path="Cortex.Reference.Blocks.Lists.AddItem.AddItemsAtIndex.MainDoc" >}}
+[Get Item At Index]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemAtIndex.MainDoc" >}}
+[Get Items At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemsAtBeginning.MainDoc" >}}
+[Get Items At End]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemsAtEnd.MainDoc" >}}
+[Get Items At Index]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemsAtIndex.MainDoc" >}}
+[Get Items At Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.GetItem.GetItemsAtIndexes.MainDoc" >}}
+[Remove Item At Index]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemAtIndex.MainDoc" >}}
+[Remove Items At Beginning]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtBeginning.MainDoc" >}}
+[Remove Items At End]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtEnd.MainDoc" >}}
+[Remove Items At Index]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtIndex.MainDoc" >}}
+[Remove Items At Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.RemoveItem.RemoveItemsAtIndexes.MainDoc" >}}
+[Set Item At Index]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemAtIndex.MainDoc" >}}
+[Set Items At Index]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtIndex.MainDoc" >}}
+[Set Items At Indexes]: {{< url path="Cortex.Reference.Blocks.Lists.SetItem.SetItemsAtIndexes.MainDoc" >}}
+
+[Execute PowerShell Script]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.MainDoc" >}}
+
+[Wait For Duration]: {{< url path="Cortex.Reference.Blocks.Schedules.WaitFor.WaitForDuration.MainDoc" >}}
+
+[Add Text After Index]: {{< url path="Cortex.Reference.Blocks.Text.AddText.AddTextAfterIndex.MainDoc" >}}
+[Add Text Before Index]: {{< url path="Cortex.Reference.Blocks.Text.AddText.AddTextBeforeIndex.MainDoc" >}}
+[Get Text At Beginning]: {{< url path="Cortex.Reference.Blocks.Text.GetText.GetTextAtBeginning.MainDoc" >}}
+[Get Text At End]: {{< url path="Cortex.Reference.Blocks.Text.GetText.GetTextAtEnd.MainDoc" >}}
+[Get Text At Index]: {{< url path="Cortex.Reference.Blocks.Text.GetText.GetTextAtIndex.MainDoc" >}}
+[Get Text Before Index]: {{< url path="Cortex.Reference.Blocks.Text.GetText.GetTextBeforeIndex.MainDoc" >}}
+[Get Text Between Indexes]: {{< url path="Cortex.Reference.Blocks.Text.GetText.GetTextBetweenIndexes.MainDoc" >}}
+[Remove Text At Beginning]: {{< url path="Cortex.Reference.Blocks.Text.RemoveText.RemoveTextAtBeginning.MainDoc" >}}
+[Remove Text At End]: {{< url path="Cortex.Reference.Blocks.Text.RemoveText.RemoveTextAtEnd.MainDoc" >}}
+[Remove Text At Index]: {{< url path="Cortex.Reference.Blocks.Text.RemoveText.RemoveTextAtIndex.MainDoc" >}}
+[Remove Text Before Index]: {{< url path="Cortex.Reference.Blocks.Text.RemoveText.RemoveTextBeforeIndex.MainDoc" >}}
+[Remove Text Between Indexes]: {{< url path="Cortex.Reference.Blocks.Text.RemoveText.RemoveTextBetweenIndexes.MainDoc" >}}
+
+[property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" >}}
+
+[Exceptions]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Exceptions.MainDoc" >}}
+
+[Working with Collections]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Collections.MainDoc" >}}
+
+[Working with Date and Time]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.MainDoc" >}}
+[ISO 8601 format]: {{< url path="Cortex.Reference.Concepts.WorkingWith.DateAndTime.DateAndTimeFormatting.ISO8601Standard" >}}
+
+[Working with Text]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Text.MainDoc" >}}
+
+[DateTimeOffset]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.DateTimeOffset.MainDoc" >}}
+[TimePeriod]: {{< url path="Cortex.Reference.DataTypes.DateAndTime.TimePeriod.MainDoc" >}}
+
+[Dequeue Items]: {{< url path="Cortex.Reference.Blocks.Queues.DequeueItem.DequeueItemsBlock.MainDoc" >}}
+
+[String]: {{< url path="Cortex.Reference.DataTypes.Text.String.MainDoc" >}}
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Common/_index.md b/content/en/docs/2026.3/Reference/Exceptions/Common/_index.md
new file mode 100644
index 000000000..3aa58c5d8
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Common/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Common"
+linkTitle: "Common"
+description: "Exceptions related to commonly occurring errors"
+---
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Lists/_index.md b/content/en/docs/2026.3/Reference/Exceptions/Lists/_index.md
new file mode 100644
index 000000000..a0ad39d72
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Lists/_index.md
@@ -0,0 +1,5 @@
+---
+title: "List"
+linkTitle: "Lists"
+description: "Exceptions related to Lists"
+---
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Lists/cannot-modify-read-only-list-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Lists/cannot-modify-read-only-list-exception.md
new file mode 100644
index 000000000..58f7c331f
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Lists/cannot-modify-read-only-list-exception.md
@@ -0,0 +1,72 @@
+---
+title: "CannotModifyReadOnlyListException"
+linkTitle: "CannotModifyReadOnlyListException"
+description: "The exception thrown when trying to modify a read-only list."
+---
+
+# {{% param title %}}
+
+
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future.{{% /alert %}}
+
+## Description
+
+The exception thrown when trying to modify a read-only list.
+
+> Lists implementing [IList][]<[TItem][]> have the option to be read-only (e.g. [IReadOnlyList][]<[TItem][]>).
+
+## Reasons
+
+### Attempting to modify a read-only list
+
+The execution is attempting to perform a non-read operation on a read-only [IList][]<[TItem][]>.
+
+##### Message Format
+
+There was an attempt to modify a read-only list.
+
+##### Message Format
+
+The format of the exception message is as follows:
+
+```json
+"'' cannot be modified because it's read-only.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the property containing the read-only list.
+
+#### How to fix
+
+If the list was written directly into the block property using an [expression][], use a list type that is not read-only, such as [List][]<[TItem][]>.
+
+When using a variable, convert the read-only list to a list that can be written to by using the `.ToList()` expression like follows:
+
+```CSharp
+($)List.ToList()
+```
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+#### External Documentation
+
+* [System.Collections.Generic.IList<T>][MS IList]
+* [System.Collections.Generic.List<T>][MS List]
+
+[TItem]: {{< url path="Cortex.Reference.Concepts.Fundamentals.DataTypes.Generics.MainDoc" >}}
+[expression]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.Expressions" >}}
+
+[List]: {{}}
+[IList]: {{}}
+[IReadOnlyList]: {{}}
+
+[MS List]: {{< url path="MSDocs.DotNet.Api.System.Collections.Generic.List" >}}
+[MS IList]: {{< url path="MSDocs.DotNet.Api.System.Collections.Generic.IList" >}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Lists/duplicate-value-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Lists/duplicate-value-exception.md
new file mode 100644
index 000000000..e5b81f1aa
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Lists/duplicate-value-exception.md
@@ -0,0 +1,54 @@
+---
+title: "DuplicateValueException"
+linkTitle: "DuplicateValueException"
+description: "The exception thrown when a list has duplicate values but shouldn't."
+---
+
+# {{% param title %}}
+
+
(Cortex.Exceptions.Lists.DuplicateValueException)
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future.{{% /alert %}}
+
+## Description
+
+The exception thrown when a [list][IList] has duplicate values but shouldn't.
+
+## Reasons
+
+### Duplicate values in list when not supported
+
+A [list][IList] provided for an operation requiring unique values contains at least one duplicate value (e.g. providing duplicate indexes for the `Indexes` property of the [Get Items At Indexes][] block).
+
+#### Message Format
+
+The format of the exception message is as follows:
+
+```json
+"The value of '' cannot contain duplicate values.
+The values in '' are duplicated.
+Please click the HelpLink for more information on how to fix this."
+```
+
+where:
+
+* `` is the name of the property containing the list that has duplicate values.
+* `` is the list of values that are duplicated in the list.
+
+#### How to fix
+
+Ensure that duplicate values do not exist within the list being provided.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### External Documentation
+
+None
+
+[IList]: {{}}
+[Get Items At Indexes]: {{}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Xml/_index.md b/content/en/docs/2026.3/Reference/Exceptions/Xml/_index.md
new file mode 100644
index 000000000..0b563947c
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Xml/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Xml"
+linkTitle: "Xml"
+description: "Exceptions related to Xml"
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/Xml/xml-serialization-exception.md b/content/en/docs/2026.3/Reference/Exceptions/Xml/xml-serialization-exception.md
new file mode 100644
index 000000000..bab1052dc
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/Xml/xml-serialization-exception.md
@@ -0,0 +1,113 @@
+---
+title: "XmlSerializationException"
+linkTitle: "XmlSerializationException"
+description: "The exception thrown when an error occurs when serializing or deserializing XML."
+---
+
+# {{% param title %}}
+
+
(Cortex.Exceptions.Xml.XmlSerializationException)
+{{% alert type="information" title="Information" %}}Improvements to this page are planned for the future.{{% /alert %}}
+
+## Description
+
+The exception thrown when an error occurs when serializing or deserializing XML.
+
+## Reasons
+
+### Invalid Structure {#structure}
+
+The [Structure][ConvertStructureToXml Structure Property] provided to the [Convert Structure To Xml][ConvertStructureToXml] block is invalid.
+
+#### Message Format
+
+The format of the message can be one of the following:
+
+```json
+"Invalid 'Structure' provided. The 'Structure' has been provided an empty key that could not be converted to valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"Invalid 'Structure' provided. The 'Structure' has been provided a key that could not be converted to valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"Invalid 'Structure' provided. The 'Structure' has been provided an xml declaration key with an attribute value that could not be converted to valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"Invalid 'Structure' provided. The 'Structure' has been provided a document type definition key with an attribute value that could not be converted to valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+or
+
+```json
+"Invalid 'Structure' provided. The 'Structure' has been provided an attribute key with a value that could not be converted to valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+#### How to fix
+
+* Ensure that all keys in the structure provided are not empty (i.e. `""`). The path to the specific key which threw this exception can be seen in the `Key` property (e.g. `"firstItem."` indicates that the empty key is a child of a top level item that has the key `"firstItem"`). If a top level item has an empty key (i.e. `""`), then the `Key` property will also be empty (i.e. `""`).
+* Ensure that the XML declaration key (i.e. `"?xml"`) and document type definition key (i.e. `"!DOCTYPE"`) in the structure provided only have valid attributes:
+ * XML declaration key: `"@version"`, `"@encoding"` and `"@standalone"`
+ * Document type definition key: `"@name"`, `"@public"`, `"@system"` and `"@internalSubset"`
+
+ The path to the specific key which threw this exception can be seen in the `Key` property.
+* Ensure that all child attribute keys of the XML declaration item, in the structure provided, have values with a valid [Basic Data Type][BasicDataTypes] (e.g. the child attribute key `"@version"`, requires a numeric value like `1.0` or `1.1`, so a value of `false` is invalid).
+* Ensure that all child attribute keys of the document type definition item, in the structure provided, have values with a valid [Basic Data Type][BasicDataTypes] (e.g. the child attribute key `"@name"`, requires a text value like `"exampleName"`, so a value of `22` is invalid).
+* Ensure that all attribute keys in the structure provided have values which are not a [Complex Data Type][ComplexDataTypes]. The path to the specific key which threw this exception can be seen in the `Key` property.
+
+### Invalid XML {#xml}
+
+The [XML][ConvertXmlToStructure XML Property] provided to the [Convert Xml to Structure][ConvertXmlToStructure] block is invalid.
+
+#### Message Format
+
+The format of the message is as follows:
+
+```json
+"Invalid 'Xml' provided. The 'Xml' provided is not valid xml.
+Please click the HelpLink for more information on how to fix this."
+```
+
+#### How to fix
+
+Ensure that the [XML][ConvertXmlToStructure XML Property] provided is [valid XML][XmlValidator]. See the `Message` of the `InnerException` property for more information.
+
+## Remarks
+
+### Known Limitations
+
+None
+
+## See Also
+
+### External Documentation
+
+* [XML Validator][XmlValidator]
+
+[Structure]: {{}}
+
+[ConvertStructureToXml]: {{}}
+[ConvertStructureToXml Structure Property]: {{}}
+
+[ConvertXmlToStructure]: {{}}
+[ConvertXmlToStructure XML Property]: {{}}
+
+[XmlNodes]: {{}}
+
+[BasicDataTypes]: {{}}
+[ComplexDataTypes]: {{}}
+
+[XmlValidator]: {{}}
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/_index.md b/content/en/docs/2026.3/Reference/Exceptions/_index.md
new file mode 100644
index 000000000..a86fc4ede
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Exceptions"
+linkTitle: "Exceptions"
+description: "This section includes all reference documentation for exceptions."
+weight: 10
+---
\ No newline at end of file
diff --git a/content/en/docs/2026.3/Reference/Exceptions/collections/_index.md b/content/en/docs/2026.3/Reference/Exceptions/collections/_index.md
new file mode 100644
index 000000000..274cfc43a
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/collections/_index.md
@@ -0,0 +1,5 @@
+---
+title: "Collections"
+linkTitle: "Collections"
+description: "Exceptions related to Collections"
+---
diff --git a/content/en/docs/2026.3/Reference/Exceptions/collections/occurrence-not-present-exception.md b/content/en/docs/2026.3/Reference/Exceptions/collections/occurrence-not-present-exception.md
new file mode 100644
index 000000000..2ad588791
--- /dev/null
+++ b/content/en/docs/2026.3/Reference/Exceptions/collections/occurrence-not-present-exception.md
@@ -0,0 +1,98 @@
+---
+title: "OccurrenceNotPresentException"
+linkTitle: "OccurrenceNotPresentException"
+description: "The exception thrown when trying to get a specified occurrence of an item from a collection, or set a specified occurrence of an item in a collection."
+---
+
+# {{% param title %}}
+
+