Compatibility Version: 31.24250 |
| [{{% ctx %}} Interaction Portal][Interaction Portal] | 2.0.0.24340 | Yes | Major | Yes | The Interaction Portal flows will need to be [upgraded][upgrade flows steps] |
| {{% ctx %}} App Server Install Scripts | 5.1.1.24340 | Yes | Patch | No | |
-| {{% ctx %}} Web App Server Install Scripts | 10.1.0.24340 | Yes | Major | No | Major changes occurred between internal development releases, however, these changes are not breaking between 2024.5 and 2024.7 |
+| {{% ctx %}} Web App Server Install Scripts | 8.0.0.24330 | Yes | Major | No | Major changes occurred between internal development releases, however, these changes are not breaking between 2024.5 and 2024.7 |
+| {{% ctx %}} Upgrade Scripts | 1.2.0.24210 | Yes | Minor | N/A | |
| {{% ctx %}} Licence Fingerprint Generator | 3.1.1.24250 | No | N/A | N/A | |
| {{% ctx %}} Encryption Key Generator | 1.2.0.23470 | No | N/A | N/A | |
| {{% ctx %}} Encryptor | 3.1.0.24330 | Yes | Minor | N/A | |
| {{% ctx %}} Flows Upgrader | 1.2.1.24330 | Yes | Minor | N/A | |
-
-
### Features
#### Performance
##### Reduced the number of license check calls
+Previously, the [{{% ctx %}} Execution Service][] would request to the [{{% ctx %}} Licence Management Service][] whether the license was valid before every flow execution. Now, the [{{% ctx %}} Execution Service][] will only query the license on startup, license added, license removed, and license updated events.
Previously, the [{{% ctx %}} Execution Service][] would request to the [{{% ctx %}} Licence Management Service][] whether the license was valid before every flow execution. Now, the [{{% ctx %}} Execution Service][] will only query the license on startup, license added, license removed, and license updated events.
Affected Components:
diff --git a/content/en/blog/releases/2024.X/2024.9.md b/content/en/blog/releases/2024.X/2024.9.md
new file mode 100644
index 000000000..87de9aae1
--- /dev/null
+++ b/content/en/blog/releases/2024.X/2024.9.md
@@ -0,0 +1,634 @@
+---
+title: "2024.9"
+linkTitle: "2024.9"
+date: 2024-10-07
+author: Paul Arnold ([@paulmarnold](https://twitter.com/paulmarnold))
+---
+
+## Summary
+
+The 2024.9 [Release][] is now available.
+
+## Download Artefacts
+
+Installation artefacts can be requested by raising a case in the [{{% ctx %}} Service Portal][].
+
+## Release Notes
+
+### Overview
+
+2024.9 is the second [Release][] of the next generation of {{% ctx %}} and improves on the [2024.7][] release in the following areas:
+
+* Capability
+* Observability
+* Scalability
+* Security
+* Usability
+* Third-Party Support
+* Installation
+* Upgrade
+* Documentation
+
+This release introduces multiple new features to the {{% ctx %}} platform:
+
+* The concept of [Process and Activity][], which are types of [Flow][], has now been introduced to {{% ctx %}} Gateway.
+* [Saving Output Properties to multiple variables][] is now supported.
+* A new built-in [execution context variable][] has been added to the Flow Engine which contains the initiator.
+* A new [Proxy for the {{% ctx %}} 7 Flow API][] has been added to the platform.
+
+[Observability][] has been improved by [adding logging to blocks that communicate with external systems][Logging added to blocks that communicate with external systems].
+\
+Optimisation to [Scalability][] has also been made by [reducing the total number of NServiceBus endpoints and RabbitMQ queues][Reduction of total number of NServiceBus endpoints and RabbitMQ queues].
+\
+We increased the [Security][] of the platform by:
+
+* [Upgrading the OpenSSL version][Upgrade OpenSSL] shipped with the platform.
+* Added [Multi-domain certificates support][].
+* A [CortexManagementUser for RabbitMQ is now created during upgrade][New CortexManagementUser added to manage RabbitMQ queues].
+* [Server-side validation added to {{% ctx %}} Gateway API][] to prevent [Path Traversal][] attacks.
+* Removal of the [refresh token cookie on sign out][remove refresh token cookie on sign out].
+
+The [Usability][] of the platform has been improved by:
+
+* Renaming the [Flows Charm to Dev and changing the icon][Rename Flows Charm to Dev and change icon].
+* Renaming the [Settings Charm to Admin and changing the icon][Rename Settings Charm to Admin and change icon].
+
+[Third-party Support][] has been improved by [upgrading the platform to .NET 8][Upgrade to .NET 8].
+\
+[Installation][] when [files are blocked by the operating system][Support installation when files are blocked by the operating system] due to the `Zone.Identifier` is now supported.
+\
+The [Upgrade][] process has been improved by:
+
+* [Supporting upgrade when files are blocked by the operating system][Support upgrade when files are blocked by the operating system].
+* Upgrading the [Execution Service when the engine version is unchanged][Execution Service is upgraded when the engine version is unchanged].
+* [Handling of the Execution Services lifecycle events][].
+
+Finally, the [Documentation][] includes updates related to:
+
+* New concepts such as [Process and Activity][Process and Activity Documentation] as well as [Decomposition of Output properties][].
+* [Preventing deadlocks when using semaphores][Prevent deadlocks when using semaphores].
+* [Updating screenshots][screenshots updated] to reflect the new branding.
+* [Flow compatibility version][Flow compatibility version introduced] being added to the release notes.
+* [General improvements to the documentation][].
+
+### Components
+
+| Release Component | Version | Updated | Update Type | Breaking Change | Notes |
+|--------------------------------------------------------------------------------|---------------|---------|---------------|-----------------|--------|
+| [{{% ctx %}} Innovation Core Application][] | 53.0.0.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} API Gateway Service][] | 38.3.0.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Authorisation Service][] | 7.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Concurrency Management Service][] | 7.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Configuration Management Service][] | 7.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Data Storage Service][] | 9.0.13.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Execution Management Service][] | 7.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Licence Management Service][] | 7.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Listeners Service][] | 2.0.0.24430 | Yes | First Release | N/A | |
+| > [{{% ctx %}} Package Management Service][] | 11.0.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Provisioning Service][] | 13.1.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Scheduling Service][] | 7.0.8.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Triggers Service][] | 11.0.0.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| [{{% ctx %}} Innovation Execution Application][] | 24.1.1.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| > [{{% ctx %}} Execution Service][] | 24.1.1.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the reduction of the total number of NServiceBus endpoints and RabbitMQ queues are [breaking][Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues] between 2024.7 and 2024.9 if upgraded on its own |
+| [{{% ctx %}} Gateway][Gateway], including [{{% ctx %}} Studio][] | 12.3.2.24430 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the server-side validation of the APIs are [breaking][Breaking - Server-side validation added to {{% ctx %}} Gateway API] between 2024.7 and 2024.9 |
+| [{{% ctx %}} Blocks Package][Blocks] | 48.2.0.24420 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the upgrade to .NET 8 and are [breaking][Breaking - Upgrade to .NET 8] between 2024.7 and 2024.9 |
+| [{{% ctx %}} Interaction Portal][Interaction Portal] | 2.0.0.24340 | No | N/A | N/A | |
+| {{% ctx %}} App Server Install Scripts | 5.2.3.24430 | Yes | Minor | N/A | |
+| {{% ctx %}} Web App Server Install Scripts | 8.1.1.24420 | Yes | Patch | N/A | |
+| {{% ctx %}} Upgrade Scripts | 1.2.8.24430 | Yes | Patch | N/A | |
+| {{% ctx %}} Licence Fingerprint Generator | 4.1.0.24360 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the upgrade to .NET 8 and are [breaking][Breaking - Upgrade to .NET 8] between 2024.7 and 2024.9 |
+| {{% ctx %}} Encryption Key Generator | 2.0.0.24350 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the upgrade to .NET 8 and are [breaking][Breaking - Upgrade to .NET 8] between 2024.7 and 2024.9 |
+| {{% ctx %}} Encryptor | 3.1.0.24330 | No | N/A | N/A | |
+| {{% ctx %}} Flows Upgrader | 2.0.0.24350 | Yes | Major | Yes | Major changes occurred between releases, these changes are related to the upgrade to .NET 8 and are [breaking][Breaking - Upgrade to .NET 8] between 2024.7 and 2024.9 |
+
+### Features
+
+#### Capability
+
+##### Process and Activity
+
+The [concept of Process and Activity][Process and Activity] has been introduced to the {{% ctx %}} Gateway. This allows for the creation of [Process][] and [Activity][] flows.
+[Processes][Process] are a type of [Flow][] that can contain multiple [Activities][Activity] and are used to model high-level business processes.
+[Activities][Activity] are a type of [Flow][] that can be used to model tasks or actions.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+* [{{% ctx %}} Block Packages][Blocks]
+
+##### Saving Output Properties to multiple variables
+
+It is now possible to use the [Expression editor][] for output properties.
+This supports a new [decomposition syntax][] allowing saving selected values from an output property to multiple variables.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Execution context variable
+
+A new [built-in _executionContext variable][] is now exposed in [processes][process] and [activities][activity].
+The `_executionContext` variable contains the initiator of the flow execution, as well as an `Extensions` property that can be used to store additional information.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+##### Proxy for the {{% ctx %}} 7 Flow API
+
+A new proxy for the {{% ctx %}} 7 Flow [API][] has been added to simplify migrating to the platform. This allows for the execution of flows using the same [API][] as the one used in {{% ctx %}} 7.
+
+The [API][] includes the following endpoints:
+
+* Encrypt
+* Run Flow
+* Run Flow Asynchronously
+
+By default, the `Run Flow` and `Run Flow Asynchronously` endpoints will run the specified flow within the default package and version.
+To run the flow in a different package and version, the following [APIs][API] have been added to configure mappings between FlowNames and specific package versions:
+
+* Get all mappings
+* Add single mapping
+* Remove single mapping
+* Remove all mappings
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Listeners Service][]
+ * [{{% ctx %}} Triggers Service][]
+
+#### Observability
+
+##### Logging added to blocks that communicate with external systems
+
+Block logging has been added to blocks that communicate with external systems.
+The following blocks and properties are logged:
+
+* [Execute Data Command][]
+ * [Command][DataCommand]
+* [Execute HTTP Request][]
+ * [HTTPRequest][]
+ * [HTTPResponse][]
+* [Execute SOAP Request][]
+ * [SOAPRequest][]
+ * [SOAPResponse][]
+* [Execute Powershell Script][]
+ * [Script][]
+ * [Parameters][]
+ * [Outputs][]
+ * [Records][]
+* [Execute SSH Command][]
+ * [Command][]
+ * [Response][]
+ * [SSH Logs][]
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+* [{{% ctx %}} Block Packages][Blocks]
+
+#### Scalability
+
+##### Reduction of total number of NServiceBus endpoints and RabbitMQ queues
+
+An exercise has been undertaken to reduce the total number of NServiceBus endpoints and RabbitMQ queues in the platform.
+This has been achieved by consolidating the endpoints and queues where possible.
+
+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 %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+
+#### Security
+
+##### Upgrade OpenSSL
+
+The OpenSSL version shipped with the platform has been upgraded to the latest version.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+* {{% ctx %}} Web App Server Install Scripts
+
+##### Multi-domain certificates support
+
+Support for Multi Domain Certificates in HA deployment is now supported.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+* {{% ctx %}} Web App Server Install Scripts
+
+##### New CortexManagementUser added to manage RabbitMQ queues
+
+A new management user for RabbitMQ queues is now created when providing `RabbitMqManagementUser` and `RabbitMqManagementPassword` during installation or upgrade.
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+
+##### Server-side validation added to {{% ctx %}} Gateway API
+
+The {{% ctx %}} Gateway [API][] now includes server-side validation to prevent [Path Traversal][] attacks when creating new flows and groups.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Remove refresh token cookie on sign out
+
+The refresh token cookie is now removed when a user signs out of {{% ctx %}} Gateway, preventing any further use of the token after the user has logged out.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+#### Usability
+
+##### Rename Flows Charm to Dev and change icon
+
+The Flows Charm has been renamed to Dev and the icon has been changed to reflect this.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+##### Rename Settings Charm to Admin and change icon
+
+The Settings Charm has been renamed to Admin and the icon has been changed to reflect this.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+#### Third-party Support
+
+##### Upgrade to .NET 8
+
+The platform has been upgraded to [.NET 8][], allowing us to go to the latest version of [Service Fabric][].
+This was required as .NET 6 will be out of support in November.
+
+{{% alert title="Note" %}}
+Upgrade excludes {{% ctx %}} Gateway as currently on .NET Framework 4.7.2 which is not compatible with .NET 8, and still under long term support.
+{{% /alert %}}
+
+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 %}} Package Management Service][]
+ * [{{% ctx %}} Provisioning Service][]
+ * [{{% ctx %}} Scheduling Service][]
+ * [{{% ctx %}} Triggers Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+* [{{% ctx %}} Block Packages][Blocks]
+* {{% ctx %}} App Server Install Scripts
+* {{% ctx %}} Web App Server Install Scripts
+* {{% ctx %}} Upgrade Scripts
+* {{% ctx %}} Licence Fingerprint Generator
+* {{% ctx %}} Encryption Key Generator
+* {{% ctx %}} Flows Upgrader
+
+##### Upgrade to the latest version of Service Fabric
+
+The latest version of Service Fabric has been included in the artefacts.
+During upgrade, the Service Fabric cluster version will be upgrade to the packaged version in the artefacts.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+#### Installation
+
+##### Support installation when files are blocked by the operating system
+
+The installation scripts have been amended to unblock files before running if the operating system has files being blocked by `Zone.Identifier`.
+
+{{% alert title="Note" %}}
+`Zone.Identifier` is a file property that indicates a file was downloaded from the internet and is potentially unsafe. Windows uses this property as a protection feature.
+{{% /alert %}}
+
+Affected Components:
+
+* {{% ctx %}} App Server Install Scripts
+* {{% ctx %}} Web App Server Install Scripts
+
+#### Upgrade
+
+##### Support upgrade when files are blocked by the operating system
+
+The upgrade scripts have been amended to unblock files before running if the operating system has files being blocked by `Zone.Identifier`.
+
+{{% alert title="Note" %}}
+`Zone.Identifier` is a file property that indicates a file was downloaded from the internet and is potentially unsafe. Windows uses this property as a protection feature.
+{{% /alert %}}
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+##### Execution Service is upgraded when the engine version is unchanged
+
+The Execution Service will now be upgraded when the engine version is unchanged. This is to ensure the upgrade works, including edge cases such as patches.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+##### Handling of the Execution Services lifecycle events
+
+The Execution Services handle Service Fabric lifecycle events allowing flows to end gracefully within a defined period.
+This includes a `Graceful Period timeout` and a `Cancel Period Timeout`, both which default to 5 minutes, and are configurable.
+
+Currently, there is no documentation available on how to do this. For further assistance, please raise a case in the [{{% ctx %}} Service Portal][].
+
+Affected Components:
+
+* [{{% ctx %}} Innovation Core Application][]
+ * [{{% ctx %}} API Gateway Service][]
+ * [{{% ctx %}} Configuration Management Service][]
+* [{{% ctx %}} Innovation Execution Application][]
+ * [{{% ctx %}} Execution Service][]
+* [{{% ctx %}} Block Packages][Blocks]
+
+#### Documentation
+
+##### Process and Activity
+
+The [What is a Flow][] documentation has been updated to include information on the new concepts of [Processes][Process] and [Activities][Activity].
+
+##### Decomposition of Output properties
+
+The [What is a Block Property][] documentation has been updated to include information on the new [Decomposition of Output properties][decomposition syntax] feature.
+
+##### Prevent deadlocks when using semaphores
+
+A new section has been added to the documentation explaining how to [prevent deadlocks][] when using semaphores.
+
+##### Screenshots updated
+
+Screenshots within the documentation has been updated to reflect the new branding, including [Blocks][] icons and various [{{% ctx %}} Gateway][] screenshots.
+
+##### Flow compatibility version introduced
+
+The [Flow compatibility version][] has been added to the release notes.
+
+##### General improvements to the documentation
+
+Various improvements have been made to the documentation to improve the overall quality and readability.
+
+### Bug Fixes
+
+#### Capability
+
+##### {{% ctx %}} Gateway encryptor not aligned with Service Fabric
+
+The Encryptor has been aligned between the {{% ctx %}} Gateway and Service Fabric.
+This ensures that encrypted values created with the default key can still be decrypted if a custom private key has been set.
+
+Affected Components:
+
+* [{{% ctx %}} Gateway][Gateway]
+
+#### Upgrade
+
+##### Certificate update does not work after upgrade
+
+A bug has been fixed which prevented the update of certificates after an upgrade.
+
+Affected Components:
+
+* {{% ctx %}} Upgrade Scripts
+
+#### Documentation
+
+##### Missing Platform property in Log Event documentation
+
+The Platform property the the Log Event documentation was missing. This has been added to the documentation.
+
+### Breaking Changes
+
+The following features have introduced breaking changes in the 2024.9 release of the {{% ctx %}} Platform:
+
+#### Upgrade to .NET 8
+
+The platform has been upgraded to [.NET 8][].
+
+#### Reduction of total number of NServiceBus endpoints and RabbitMQ queues
+
+The following feature has changed internal endpoints and queues in the platform, which may cause issues if upgrading from 2024.7 to 2024.9 without upgrading all components at the same time.
+The platform will need to be upgraded using the [Upgrade Instructions][].
+
+#### Server-side validation added to {{% ctx %}} Gateway API
+
+The following feature has added validation to the [{{% ctx %}} Gateway][] API to prevent [Path Traversal][] attacks, which now returns an error if the path is invalid.
+
+### Known Limitations
+
+There are no known limitations added as part of the 2024.9 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.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 |
+|---------|-----------------------|
+| 2024.9 | 31.24311 |
+| 2024.7 | 31.24311 |
+| 2024.5 | 31.24311 |
+| 2024.3 | 30 |
+
+## Install Instructions
+
+If you are installing a new 2024.9 platform or adding it to an existing 7.2 Installation see the guidance below; otherwise, if you are upgrading from an existing 2024.7 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 7.2 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 2024.7 platform see the guidance below:
+
+Upgrading {{% ctx %}}:
+
+* [Multiple Server - With HA][Upgrade - Multiple Server - With HA]
+* [Single Server - Without HA][Upgrade - Single Server - Without HA]
+
+## Upcoming Releases
+
+Releases are currently forecast to be made available on:
+
+| Release | Release Type | Forecast Release Date |
+|---------|----------------|------------------------------------|
+| 2024.9 | [Release][] | Week commencing 7th October 2024 |
+| 2024.11 | [Fast Track][] | Week commencing 2nd December 2024 |
+| 2025.1 | [Fast Track][] | Week commencing 10th February 2024 |
+
+[{{% ctx %}} Innovation Core Application]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.MainDoc" version="2024.9" >}}
+[{{% ctx %}} API Gateway Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ApiGatewayService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Authorisation Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.AuthorisationService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Concurrency Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ConcurrencyManagementService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Configuration Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ConfigurationManagementService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Data Storage Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.DataStorageService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Execution Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ExecutionManagementService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Licence Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.LicenceManagementService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Listeners Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ListenersService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Package Management Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.PackageManagementService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Provisioning Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.ProvisioningService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Scheduling Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.SchedulingService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Triggers Service]: {{< url path="Cortex.Guides.CortexInnovation.CoreApplication.Services.TriggersService.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Innovation Execution Application]: {{< url path="Cortex.Guides.CortexInnovation.ExecutionApplication.MainDoc" version="2024.9" >}}
+[{{% ctx %}} Execution Service]: {{< url path="Cortex.Guides.CortexInnovation.ExecutionApplication.Services.ExecutionService.MainDoc" version="2024.9" >}}
+[Interaction Portal]: {{< url path="Cortex.Guides.CortexInteractionPortal.MainDoc" version="2024.9" >}}
+
+[Process and Activity]: {{< ref "#process-and-activity" >}}
+[Saving Output Properties to multiple variables]: {{< ref "#saving-output-properties-to-multiple-variables" >}}
+[execution context variable]: {{< ref "#execution-context-variable" >}}
+[Proxy for the {{% ctx %}} 7 Flow API]: {{< ref "#proxy-for-the-cortex-7-flow-api" >}}
+[Observability]: {{< ref "#observability" >}}
+[Logging added to blocks that communicate with external systems]: {{< ref "#logging-added-to-blocks-that-communicate-with-external-systems" >}}
+[Scalability]: {{< ref "#scalability" >}}
+[Reduction of total number of NServiceBus endpoints and RabbitMQ queues]: {{< ref "#reduction-of-total-number-of-nservicebus-endpoints-and-rabbitmq-queues" >}}
+[Security]: {{< ref "#security" >}}
+[Upgrade OpenSSL]: {{< ref "#upgrade-openssl" >}}
+[Multi-domain certificates support]: {{< ref "#multi-domain-certificates-support" >}}
+[New CortexManagementUser added to manage RabbitMQ queues]: {{< ref "#new-cortexmanagementuser-added-to-manage-rabbitmq-queues" >}}
+[Server-side validation added to {{% ctx %}} Gateway API]: {{< ref "#server-side-validation-added-to-cortex-gateway-api" >}}
+[Remove refresh token cookie on sign out]: {{< ref "#remove-refresh-token-cookie-on-sign-out" >}}
+[Usability]: {{< ref "#usability" >}}
+[Rename Flows Charm to Dev and change icon]: {{< ref "#rename-flows-charm-to-dev-and-change-icon" >}}
+[Rename Settings Charm to Admin and change icon]: {{< ref "#rename-settings-charm-to-admin-and-change-icon" >}}
+[Third-party Support]: {{< ref "#third-party-support" >}}
+[Upgrade to .NET 8]: {{< ref "#upgrade-to-net-8" >}}
+[Installation]: {{< ref "#installation" >}}
+[Support installation when files are blocked by the operating system]: {{< ref "#support-installation-when-files-are-blocked-by-the-operating-system" >}}
+[Upgrade]: {{< ref "#upgrade" >}}
+[Support upgrade when files are blocked by the operating system]: {{< ref "#support-upgrade-when-files-are-blocked-by-the-operating-system" >}}
+[Execution Service is upgraded when the engine version is unchanged]: {{< ref "#execution-service-is-upgraded-when-the-engine-version-is-unchanged" >}}
+[Handling of the Execution Services lifecycle events]: {{< ref "#handling-of-the-execution-services-lifecycle-events" >}}
+[Documentation]: {{< ref "#documentation" >}}
+[Process and Activity Documentation]: {{< ref "#process-and-activity-1" >}}
+[Decomposition of Output properties]: {{< ref "#decomposition-of-output-properties" >}}
+[Prevent deadlocks when using semaphores]: {{< ref "#prevent-deadlocks-when-using-semaphores" >}}
+[Screenshots updated]: {{< ref "#screenshots-updated" >}}
+[Flow compatibility version introduced]: {{< ref "#flow-compatibility-version-introduced" >}}
+[General improvements to the documentation]: {{< ref "#general-improvements-to-the-documentation" >}}
+
+[Flow compatibility version]: {{< ref "#flow-compatibility" >}}
+
+[Upgrade Instructions]: {{< ref "#upgrade-instructions" >}}
+
+[{{% ctx %}} Gateway]: {{< url path="Cortex.Guides.Gateway.MainDoc" version="2024.9" >}}
+[Blocks]: {{< url path="Cortex.Reference.Blocks.MainDoc" version="2024.9" >}}
+[What is a Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" version="2024.9" >}}
+[Process]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.Process" version="2024.9" >}}
+[Activity]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.Activity" version="2024.9" >}}
+[What is a Block Property]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.MainDoc" version="2024.9" >}}
+
+[prevent deadlocks]: {{< url path="Cortex.Reference.Concepts.WorkingWith.Concurrency.Semaphores.WhatIsASemaphore.PreventingDeadlocks" version="2024.9" >}}
+
+[Execute Data Command]: {{< url path="Cortex.Reference.Blocks.Data.ExecuteDataCommand.ExecuteDataCommand.MainDoc" version="2024.9" >}}
+[DataCommand]: {{< url path="Cortex.Reference.Blocks.Data.ExecuteDataCommand.ExecuteDataCommand.CommandProperty" version="2024.9" >}}
+
+[Execute HTTP Request]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteHttpRequest.ExecuteHttpRequest.MainDoc" version="2024.9" >}}
+[HttpRequest]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteHttpRequest.ExecuteHttpRequest.HttpRequestProperty" version="2024.9" >}}
+[HttpResponse]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteHttpRequest.ExecuteHttpRequest.HttpResponseProperty" version="2024.9" >}}
+
+[Execute Soap Request]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteSoapRequest.ExecuteSoapRequest.MainDoc" version="2024.9" >}}
+[SoapRequest]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteSoapRequest.ExecuteSoapRequest.SoapRequestProperty" version="2024.9" >}}
+[SoapResponse]: {{< url path="Cortex.Reference.Blocks.Http.ExecuteSoapRequest.ExecuteSoapRequest.SoapResponseProperty" version="2024.9" >}}
+
+[Execute Powershell Script]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.MainDoc" version="2024.9" >}}
+[Script]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.ScriptProperty" version="2024.9" >}}
+[Parameters]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.ParametersProperty" version="2024.9" >}}
+[Outputs]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.OutputsProperty" version="2024.9" >}}
+[Records]: {{< url path="Cortex.Reference.Blocks.PowerShell.ExecutePowerShellScript.ExecutePowerShellScript.RecordsProperty" version="2024.9" >}}
+
+[Execute SSH Command]: {{< url path="Cortex.Reference.Blocks.Ssh.ExecuteSshCommand.ExecuteSshCommandBlock.MainDoc" version="2024.9" >}}
+[Command]: {{< url path="Cortex.Reference.Blocks.Ssh.ExecuteSshCommand.ExecuteSshCommandBlock.CommandProperty" version="2024.9" >}}
+[Response]: {{< url path="Cortex.Reference.Blocks.Ssh.ExecuteSshCommand.ExecuteSshCommandBlock.Response" version="2024.9" >}}
+[SSH Logs]: {{< url path="Cortex.Reference.Blocks.Ssh.ExecuteSshCommand.ExecuteSshCommandBlock.SshLogsProperty" version="2024.9" >}}
+
+[Gateway]: {{< url path="Cortex.Guides.Gateway.MainDoc" version="2024.9" >}}
+[Expression Editor]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.PropertyEditors.ExpressionEditor.MainDoc" version="2024.9" >}}
+[decomposition syntax]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.WhatIsABlockProperty.DecomposingOutputProperties" version="2024.9" >}}
+
+[.NET 8]: {{< url path="Cortex.Reference.Glossary.A-E.DotNet" >}}
+[API]: {{< url path="Cortex.Reference.Glossary.A-E.API" >}}
+[Service Fabric]: {{< url path="Cortex.Reference.Glossary.P-T.ServiceFabric" >}}
+[built-in _executionContext variable]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Executions.WhatIsAnExecution.ExecutionContext" version="2024.9" >}}
+
+[Innovation Only - Single Server - Without HA]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.SingleServerWithoutHA.MainDoc" version="2024.9" >}}
+[Innovation Only - Multiple Server - With HA]: {{< url path="Cortex.GettingStarted.OnPremise.InstallInnovationOnly.MultipleServerWithHA.MainDoc" version="2024.9" >}}
+
+[Adding Innovation to a 7.2 Installation - Single Server - Without HA]: {{< url path="Cortex.GettingStarted.OnPremise.AddInnovationTo72.SingleServerWithoutHA.MainDoc" version="2024.9" >}}
+[Adding Innovation to a 7.2 Installation - Multiple Server - With HA]: {{< url path="Cortex.GettingStarted.OnPremise.AddInnovationTo72.MultipleServerWithHA.MainDoc" version="2024.9" >}}
+
+[Upgrade - Single Server - Without HA]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.MainDoc" version="2024.9" >}}
+[Upgrade - Multiple Server - With HA]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.MainDoc" version="2024.9" >}}
+[Breaking - Reduction of total number of NServiceBus endpoints and RabbitMQ queues]: {{< ref "#reduction-of-total-number-of-nservicebus-endpoints-and-rabbitmq-queues-1" >}}
+[Breaking - Upgrade to .NET 8]: {{< ref "#upgrade-to-net-8-1" >}}
+[Breaking - Server-side validation added to {{% ctx %}} Gateway API]: {{< ref "#server-side-validation-added-to-cortex-gateway-api-1" >}}
+
+[{{% ctx %}} Studio]: {{< url path="Cortex.Guides.Studio.MainDoc" version="2024.9" >}}
+
+[{{% ctx %}} Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" version="2024.9" >}}
+
+[Flow]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Flows.WhatIsAFlow.MainDoc" version="2024.9" >}}
+
+[Fast Track]: {{< url path="Cortex.Reference.Glossary.F-J.FastTrack" version="2024.9" >}}
+[Release]: {{< url path="Cortex.Reference.Glossary.P-T.Release" version="2024.9" >}}
+
+[2024.7]: {{< url path="Cortex.Blogs.Releases.2024.7.MainDoc" version="2024.9" >}}
+
+[Path Traversal]: {{< url path="Owasp.PathTraversal.MainDoc" version="2024.9" >}}
diff --git a/content/en/docs/2024.7/getting-started/on-premise/add-innovation-to-72/multiple-server-with-ha/prerequisites.md b/content/en/docs/2024.7/getting-started/on-premise/add-innovation-to-72/multiple-server-with-ha/prerequisites.md
index c3c3fc918..ff7f1c0d2 100644
--- a/content/en/docs/2024.7/getting-started/on-premise/add-innovation-to-72/multiple-server-with-ha/prerequisites.md
+++ b/content/en/docs/2024.7/getting-started/on-premise/add-innovation-to-72/multiple-server-with-ha/prerequisites.md
@@ -333,6 +333,7 @@ Innovation has a [gobetween][] load balancer included that isn't highly availabl
[alternative load balancer]: {{< ref "#alternative-load-balancer-requirements" >}}
[Anycast]: {{< url path="Anycast.MainDoc" >}}
[Architecture]: {{< url path="Cortex.GettingStarted.OnPremise.AddInnovationTo72.MultipleServerWithHA.Architecture" >}}
+[Create Full DB Backup]: {{< url path="MSDocs.SqlServer.CreateFullDbBackup" >}}
[C++ Redistributable]: {{< url path="MSDownload.CPlusPlusRedistributable.2013" >}}
[CORTEX Service Portal]: {{< url path="Cortex.ServicePortal.MainDoc" >}}
[gobetween]: {{< url path="GoBetween.MainDoc" >}}
diff --git a/content/en/docs/2024.9/FAQs/_index.md b/content/en/docs/2024.9/FAQs/_index.md
new file mode 100644
index 000000000..654613e9b
--- /dev/null
+++ b/content/en/docs/2024.9/FAQs/_index.md
@@ -0,0 +1,8 @@
+---
+title: "FAQs"
+linkTitle: "FAQs"
+description: "Answers to our most frequently asked questions."
+weight: 10000
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/_index.md b/content/en/docs/2024.9/Guides/_index.md
new file mode 100644
index 000000000..e9ff0c934
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Guides"
+linkTitle: "Guides"
+description: "This section includes all guides for the {{% ctx %}} Innovation platform."
+weight: 10
+---
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/_index.md b/content/en/docs/2024.9/Guides/cortex-gateway/_index.md
new file mode 100644
index 000000000..30d09957b
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/_index.md
@@ -0,0 +1,8 @@
+---
+title: "CORTEX Gateway"
+linkTitle: "CORTEX Gateway"
+description: "The centralised web-based portal for accessing all user applications and tooling in the {{% ctx %}} Innovation platform."
+weight: 1
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/help/_index.md b/content/en/docs/2024.9/Guides/cortex-gateway/help/_index.md
new file mode 100644
index 000000000..dae7d1fc2
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/help/_index.md
@@ -0,0 +1,7 @@
+---
+title: "Help"
+linkTitle: "Help"
+description: "System level help"
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/help/cortex-release-notes.md b/content/en/docs/2024.9/Guides/cortex-gateway/help/cortex-release-notes.md
new file mode 100644
index 000000000..e60258650
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/help/cortex-release-notes.md
@@ -0,0 +1,7 @@
+---
+title: "Release Notes"
+linkTitle: "Release Notes"
+description: "Release notes for all currently available {{% ctx %}} Versions."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/_index.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/_index.md
new file mode 100644
index 000000000..4303ed2bb
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-gateway/settings/ldap-authorisation.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/ldap-authorisation.md
new file mode 100644
index 000000000..e4e6647d0
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-gateway/settings/ldap-connection.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/ldap-connection.md
new file mode 100644
index 000000000..9d4f4c87f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-gateway/settings/license-consumption.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/license-consumption.md
new file mode 100644
index 000000000..fdb2d879d
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/license-consumption.md
@@ -0,0 +1,7 @@
+---
+title: "License Consumption"
+linkTitle: "License Consumption"
+description: "Review current license consumption of flows in master."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/packages.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/packages.md
new file mode 100644
index 000000000..c42f0f395
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/packages.md
@@ -0,0 +1,7 @@
+---
+title: "Packages"
+linkTitle: "Packages"
+description: "Create and Manage {{% ctx %}} Innovation Packages"
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-authorisation.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-authorisation.md
new file mode 100644
index 000000000..58ecac5b6
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-authorisation.md
@@ -0,0 +1,7 @@
+---
+title: "Studio Authorisation"
+linkTitle: "Studio Authorisation"
+description: "Assign access rights to flows based on security groups."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-export.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-export.md
new file mode 100644
index 000000000..21de622a6
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-export.md
@@ -0,0 +1,7 @@
+---
+title: "Studio Export"
+linkTitle: "Studio Export"
+description: "Create {{% ctx %}} Studio Packages by exporting flows."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-hierarchy.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-hierarchy.md
new file mode 100644
index 000000000..27a09993e
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-hierarchy.md
@@ -0,0 +1,7 @@
+---
+title: "Studio Hierarchy"
+linkTitle: "Studio Hierarchy"
+description: "Manage the location of flows in the Flow Hierarchy."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-import.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-import.md
new file mode 100644
index 000000000..28a685526
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/studio-import.md
@@ -0,0 +1,7 @@
+---
+title: "Studio Import"
+linkTitle: "Studio Import"
+description: "Import {{% ctx %}} Studio Packages."
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/settings/version-control.md b/content/en/docs/2024.9/Guides/cortex-gateway/settings/version-control.md
new file mode 100644
index 000000000..7033dc287
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/settings/version-control.md
@@ -0,0 +1,7 @@
+---
+title: "Version Control"
+linkTitle: "Version Control"
+description: "High level view of flows out of sync with master. Allow for mass Commit or Get Master"
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-gateway/welcome-page/_index.md b/content/en/docs/2024.9/Guides/cortex-gateway/welcome-page/_index.md
new file mode 100644
index 000000000..04b16f12a
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-gateway/welcome-page/_index.md
@@ -0,0 +1,13 @@
+---
+title: "Welcome Page"
+linkTitle: "Welcome Page"
+description: "Welcome Page"
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Recently Edited Flows
+
+TODO: Summary, Screenshots
diff --git a/content/en/docs/2024.9/Guides/cortex-innovation/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/_index.md
new file mode 100644
index 000000000..47faeb366
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-innovation/_index.md
@@ -0,0 +1,6 @@
+---
+title: "CORTEX Innovation"
+linkTitle: "CORTEX Innovation"
+description: "The {{% ctx %}} Innovation platform."
+weight: 300
+---
diff --git a/content/en/docs/2024.9/Guides/cortex-innovation/core-application/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/_index.md
new file mode 100644
index 000000000..87cdd11cd
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/_index.md
new file mode 100644
index 000000000..3bb8a5855
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/api-gateway-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/api-gateway-service/_index.md
new file mode 100644
index 000000000..31c122c46
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/authorisation-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/authorisation-service/_index.md
new file mode 100644
index 000000000..9ff8c5979
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/concurrency-management-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/concurrency-management-service/_index.md
new file mode 100644
index 000000000..8974784b2
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/configuration-management-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/configuration-management-service/_index.md
new file mode 100644
index 000000000..0e25b5739
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/data-storage-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/data-storage-service/_index.md
new file mode 100644
index 000000000..61d5fb9d1
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/execution-management-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/execution-management-service/_index.md
new file mode 100644
index 000000000..4b49b1866
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/licence-management-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/licence-management-service/_index.md
new file mode 100644
index 000000000..ad3a309fd
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/listeners-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/listeners-service/_index.md
new file mode 100644
index 000000000..3cc2cd206
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/package-management-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/package-management-service/_index.md
new file mode 100644
index 000000000..8e451b3a7
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/provisioning-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/provisioning-service/_index.md
new file mode 100644
index 000000000..165229e50
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/scheduling-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/scheduling-service/_index.md
new file mode 100644
index 000000000..4a06f4fdf
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/core-application/services/triggers-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/core-application/services/triggers-service/_index.md
new file mode 100644
index 000000000..415b9aa71
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/execution-application/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/execution-application/_index.md
new file mode 100644
index 000000000..3ec60b6f4
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/execution-application/services/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/execution-application/services/_index.md
new file mode 100644
index 000000000..33f2fe7b6
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-innovation/execution-application/services/execution-service/_index.md b/content/en/docs/2024.9/Guides/cortex-innovation/execution-application/services/execution-service/_index.md
new file mode 100644
index 000000000..3c8bea4c3
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/cortex-interaction-portal/_index.md b/content/en/docs/2024.9/Guides/cortex-interaction-portal/_index.md
new file mode 100644
index 000000000..797357f30
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-interaction-portal/_index.md
@@ -0,0 +1,10 @@
+---
+title: "CORTEX Interaction Portal"
+linkTitle: "CORTEX Interaction Portal"
+description: "A web application that provides Human-in-the-Loop capabilities to the {{% ctx %}} Innovation 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/2024.9/Guides/cortex-studio/_index.md b/content/en/docs/2024.9/Guides/cortex-studio/_index.md
new file mode 100644
index 000000000..d54973ba6
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/_index.md
@@ -0,0 +1,8 @@
+---
+title: "CORTEX Studio"
+linkTitle: "CORTEX Studio"
+description: "The web-based, low-code, integrated development environment (IDE) for creating, editing, debugging, testing and managing flows that define the logic and actions required to capture and automate simple user tasks through to complex business or IT processes."
+weight: 100
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/debugging.md b/content/en/docs/2024.9/Guides/cortex-studio/debugging.md
new file mode 100644
index 000000000..3e3ed9f9e
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/debugging.md
@@ -0,0 +1,20 @@
+---
+title: "Debugging"
+linkTitle: "Debugging"
+description: ""
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Property Viewer
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/east-panel.md b/content/en/docs/2024.9/Guides/cortex-studio/east-panel.md
new file mode 100644
index 000000000..94a52f91e
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/east-panel.md
@@ -0,0 +1,40 @@
+---
+title: "CORTEX Studio - East Panel (TBC)"
+linkTitle: "CORTEX Studio - East Panel (TBC)"
+description: "Eastern panel for Property Editor, Execution Viewer and Exceptions"
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Property Editor
+
+### Add Variables button
+
+### Show/Hide Advanced Properties button
+
+### Help button
+
+## Execution Viewer
+
+### Variables Viewer
+
+#### Variable Details Viewer
+
+##### Load Value Button
+
+### Exceptions Viewer
+
+## Settings Editor
+
+### Inputs Property
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/expression-editor.md b/content/en/docs/2024.9/Guides/cortex-studio/expression-editor.md
new file mode 100644
index 000000000..c2016f173
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/expression-editor.md
@@ -0,0 +1,34 @@
+---
+title: "CORTEX Studio - Expression Editor"
+linkTitle: "CORTEX Studio - Expression Editor"
+description: "A guide on how to use the Expression Editor"
+weight: 0
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: What is used for, etc.
+
+## Snippets
+
+TODO: How to Access, Whats Available, etc
+
+## Tools
+
+TODO: Full Screen, Find and Replace, Command Menu, Replace All (Ctrl F2), etc
+
+## Example Expressions
+
+TODO: Variable, Object Construct (Complex/Collection), String Concatenation/Interpolation, Arithmetics, etc
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
+
+TODO
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/literal-editor.md b/content/en/docs/2024.9/Guides/cortex-studio/literal-editor.md
new file mode 100644
index 000000000..5b76f0261
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/literal-editor.md
@@ -0,0 +1,26 @@
+---
+title: "CORTEX Studio - Literal Editor"
+linkTitle: "CORTEX Studio - Literal Editor"
+description: "A guide on how to use the Literal Editor"
+weight: 0
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: What is used for, etc.
+
+## Selecting a Literal Type
+
+TODO: Searching/Filtering
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
+
+TODO
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/main-display-area.md b/content/en/docs/2024.9/Guides/cortex-studio/main-display-area.md
new file mode 100644
index 000000000..2547a75c9
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/main-display-area.md
@@ -0,0 +1,72 @@
+---
+title: "CORTEX Studio - Main Display Area"
+linkTitle: "CORTEX Studio - Main Display Area"
+description: "The Main Display Area for developing and managing a flow"
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Main Toolbar
+
+### Undo
+
+TODO:
+
+- What happens when an undo action is taken
+- What can be undone
+- Keyboard Shortcuts?
+
+### Redo
+
+TODO:
+
+- What happens when an redo action is taken
+- What can be redone
+- Keyboard Shortcuts?
+
+### Start an execution
+
+TODO:
+
+- Should this be called 'starting an execution' or 'debugging an execution'
+- Start execution via API or Studio
+ - describe the steps of starting from API (API call is made to Gateway, Authentication and Authorisation is performed, etc)
+ - describe the steps of starting from Studio (User clicks button, call is made to Gateway, Authentication and Authorisation is performed, etc)
+- Image of button and token after button was pressed
+- Executions are private and only displayed to the user that requested them (Check this is true, look at the APIs).
+- link debugging in this page to glossary
+- link 'what is an execution.md' debugging/production to glossary
+- Providing input variables (API or Studio)
+ - literals and expression
+- Retrieving Output variables (API or Studio)
+
+#### Break On Exception
+
+TODO
+
+### Edit and Continue an Execution
+
+## Workspaces
+
+### Blocks
+
+#### Breakpoints
+
+### Executions
+
+Executions are represented by tokens on a workspace.
+
+#### Set Next Block to Execute
+
+## Workspace Toolbar
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/navigation.md b/content/en/docs/2024.9/Guides/cortex-studio/navigation.md
new file mode 100644
index 000000000..25ffb0804
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/navigation.md
@@ -0,0 +1,24 @@
+---
+title: "CORTEX Studio - Navigation"
+linkTitle: "CORTEX Studio - Navigation"
+description: "How to navigate between and in flows"
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Breadcrumb trail
+
+## Quick Navigation
+
+## Swimlane Management
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/package-management.md b/content/en/docs/2024.9/Guides/cortex-studio/package-management.md
new file mode 100644
index 000000000..31bea9f7b
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/package-management.md
@@ -0,0 +1,20 @@
+---
+title: "CORTEX Studio - Package Management (TBC)"
+linkTitle: "CORTEX Studio - Package Management (TBC)"
+description: "Package Management"
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Automatic Selection of Dependent Flows
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/palettes.md b/content/en/docs/2024.9/Guides/cortex-studio/palettes.md
new file mode 100644
index 000000000..38e9742f5
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/palettes.md
@@ -0,0 +1,8 @@
+---
+title: "CORTEX Studio - Palettes"
+linkTitle: "CORTEX Studio - Palettes"
+description: "Block palette information"
+weight: 1
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/south-panel.md b/content/en/docs/2024.9/Guides/cortex-studio/south-panel.md
new file mode 100644
index 000000000..0e8f75286
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/south-panel.md
@@ -0,0 +1,68 @@
+---
+title: "CORTEX Studio - South Panel (TBC)"
+linkTitle: "CORTEX Studio - South Panel (TBC)"
+description: "Southern panel for Executions, Messages, and Variables"
+weight: 1
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+## Executions Grid
+
+### Pausing an Execution
+
+### Stepping an Execution
+
+### Continuing an Execution
+
+### Stopping an Execution
+
+## Variables Grid
+
+TODO: Add Screenshot of Grid
+
+### Creating Variables
+
+TODO: Screenshots, How to create
+
+### Viewing Variables
+
+TODO: Screenshots, Searching/Filtering
+
+### Renaming Variables
+
+TODO: Screenshots, Searching/Filtering
+
+### Modifying Variables
+
+TODO: Screenshots, How to modify
+
+#### Changing a Variable's Scope
+
+TODO: Screenshots, how to modify scope
+
+1. Find the variable in the [Variable Grid][]
+2. Double-click the **Scope** to load a dropdown menu
+3. Select the desired workspace
+
+If the variable does not appear in the grid, the most likely reason is the variable is not in scope of the workspace currently in focus. To resolve this, either select the appropriate workspace, or change the **Scope** filter on the [Variable Grid][] to **All**.
+
+### Deleting Variables
+
+TODO: Screenshots, How to delete
+
+### Validating Variables
+
+TODO: Screenshots
+
+## Messages Grid
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
diff --git a/content/en/docs/2024.9/Guides/cortex-studio/variable-editor.md b/content/en/docs/2024.9/Guides/cortex-studio/variable-editor.md
new file mode 100644
index 000000000..79b9d2faa
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/cortex-studio/variable-editor.md
@@ -0,0 +1,31 @@
+---
+title: "CORTEX Studio - Variable Editor"
+linkTitle: "CORTEX Studio - Variable Editor"
+description: "A guide on how to use the Variable Editor"
+weight: 0
+---
+
+{{< workinprogress >}}
+
+## Summary
+
+TODO: What is used for, etc.
+
+## Selecting Variables
+
+TODO: Searching/Filtering
+TODO: Complex/Collection variable referencing
+
+## Creating Variables
+
+TODO: Create variable from property, create all undefined variables
+
+## Remarks
+
+### Known Limitations
+
+## See Also
+
+### Related Concepts
+
+TODO
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/_index.md
new file mode 100644
index 000000000..719b7315d
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2024.1 to 2024.3"
+linkTitle: "2024.1 to 2024.3"
+description: "Instructions to upgrade {{% ctx %}} 2024.1 to 2024.3"
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..5a8a0e4d3
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..7aa892b26
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..956ddc1d6
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..97990aab4
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2024.9/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..e896f3e3a
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2024.9/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..e13598a03
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeCortex.2024.1to2024.3.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..05aa5aa36
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.1to2024.3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..4f698ff4c
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.1-to-2024.3/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..7757a353f
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.1to2024.3.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeCortex.2024.1to2024.3.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/_index.md
new file mode 100644
index 000000000..d180e4d11
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2024.3 to 2024.5"
+linkTitle: "2024.3 to 2024.5"
+description: "Instructions to upgrade {{% ctx %}} 2024.3 to 2024.5"
+weight: 999
+---
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..df5e453b7
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..2b7972aa8
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..d935713ea
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..d749f6f71
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2024.9/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..cdf7307cc
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2024.9/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..92748ba31
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeCortex.2024.3to2024.5.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..e6deaefdb
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.3to2024.5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..a378b3b86
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.3-to-2024.5/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..2011d979e
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.3to2024.5.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeCortex.2024.3to2024.5.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/_index.md
new file mode 100644
index 000000000..b8251f69d
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2024.5 to 2024.7"
+linkTitle: "2024.5 to 2024.7"
+description: "Instructions to upgrade {{% ctx %}} 2024.5 to 2024.7"
+weight: 998
+---
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..f2dd5df57
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..61d52ecd6
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..82bc958cb
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..5645bd0eb
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2024.9/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..a0bd3fc93
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2024.9/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..813475bf1
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeCortex.2024.5to2024.7.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..4577a2be6
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.5to2024.7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..6f25888bf
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.5-to-2024.7/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..947a007c9
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.5to2024.7.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeCortex.2024.5to2024.7.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/_index.md
new file mode 100644
index 000000000..4a29d5dca
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/_index.md
@@ -0,0 +1,6 @@
+---
+title: "2024.7 to 2024.9"
+linkTitle: "2024.7 to 2024.9"
+description: "Instructions to upgrade {{% ctx %}} 2024.7 to 2024.9"
+weight: 997
+---
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/try-it-out.md
new file mode 100644
index 000000000..8750d3ba8
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-application-and-loadbalancer-servers.md
new file mode 100644
index 000000000..7f23a7095
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/_index.md
new file mode 100644
index 000000000..ec4c6a59d
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/prerequisites.md
new file mode 100644
index 000000000..fbbadcc08
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeApplicationAndLoadBalancerServers" >}}
+[Upgrade Flow Debugger]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeDebugger" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-debugger.md b/content/en/docs/2024.9/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..e79dc6f38
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.WebApplicationServerPreqrequisites" >}}
+[Upgrade Gateway]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeGateway" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/multiple-server-with-ha/upgrade-web-application-server/upgrade-gateway.md b/content/en/docs/2024.9/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..c10bf9752
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.UpgradeDebugger" >}}
+[Try It Out]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.MultipleServerWithHA.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/try-it-out.md
new file mode 100644
index 000000000..de31c3621
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
+[Web Application Server Upgrade]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-application-server.md
new file mode 100644
index 000000000..c2e76965f
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.UpgradeWebApplicationServer" >}}
+
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-web-application-server.md b/content/en/docs/2024.9/Guides/upgrade-cortex/2024.7-to-2024.9/single-server-without-ha/upgrade-web-application-server.md
new file mode 100644
index 000000000..e4fc5c5ca
--- /dev/null
+++ b/content/en/docs/2024.9/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.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.TryItOut" >}}
+[Upgrade Application Server]: {{< url path="Cortex.Guides.UpgradeCortex.2024.7to2024.9.SingleServerWithoutHA.UpgradeApplicationServer" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-cortex/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/_index.md
new file mode 100644
index 000000000..4d02a4f21
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/upgrade-cortex/advanced/_index.md b/content/en/docs/2024.9/Guides/upgrade-cortex/advanced/_index.md
new file mode 100644
index 000000000..c28d33a5c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/upgrade-cortex/advanced/ssl-best-practices.md b/content/en/docs/2024.9/Guides/upgrade-cortex/advanced/ssl-best-practices.md
new file mode 100644
index 000000000..5e6b69e78
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Guides/upgrade-cortex/advanced/upgrade-flows.md b/content/en/docs/2024.9/Guides/upgrade-cortex/advanced/upgrade-flows.md
new file mode 100644
index 000000000..149033b99
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-cortex/advanced/upgrade-flows.md
@@ -0,0 +1,23 @@
+---
+title: "Upgrade Flows"
+linkTitle: "Upgrade Flows"
+description: "Information about upgrading flows."
+---
+
+# {{% param title %}}
+
+{{% alert title="Note" %}}
+Sometimes, between versions of {{% ctx %}}, breaking or non-breaking changes have to be made to blocks. This can cause existing flows to break or not work as expected which requires them to be upgraded to resolve the issues.
+{{% /alert %}}
+
+## Prerequisites
+
+1. Copy the following artefacts to a folder on a machine:
+
+ * Cortex Innovation 2024.7 - Flows Upgrader.zip
+
+1. Extract the `Cortex Innovation 2024.7 - Flows Upgrader.zip` zip file to a folder with the same name.
+
+## Upgrade the flows
+
+{{< section "/upgrade/2024.7/upgrade-web-application-server/upgrade-flows.md" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/_index.md
new file mode 100644
index 000000000..8faaea3a2
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/_index.md
@@ -0,0 +1,6 @@
+---
+title: "Upgrade Observability"
+linkTitle: "Upgrade Observability"
+description: "Information about upgrading your observability platform for {{% ctx %}}."
+weight: 1000
+---
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/cloud/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/cloud/_index.md
new file mode 100644
index 000000000..4eaa242d6
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/cloud/grafana/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/_index.md
new file mode 100644
index 000000000..1337f8126
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/cloud/grafana/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/prerequisites.md
new file mode 100644
index 000000000..d141133bc
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.Cloud.Grafana.UpgradePromtail" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/try-it-out.md
new file mode 100644
index 000000000..f6d53e219
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.Cloud.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeObservability.Cloud.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/upgrade-promtail.md b/content/en/docs/2024.9/Guides/upgrade-observability/cloud/grafana/upgrade-promtail.md
new file mode 100644
index 000000000..001236749
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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.UpgradeObservability.Cloud.Grafana.BackupOldFiles" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeObservability.Cloud.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeObservability.Cloud.Grafana.Prerequisites" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeObservability.Cloud.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/Grafana/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/Grafana/_index.md
new file mode 100644
index 000000000..83fd0b271
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/dashboards/Grafana/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/Grafana/try-it-out.md
new file mode 100644
index 000000000..09b163023
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.Cloud.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeObservability.Cloud.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/Grafana/upgrade-dashboards.md b/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/Grafana/upgrade-dashboards.md
new file mode 100644
index 000000000..6f95386b5
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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 %}} Innovation 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.UpgradeObservability.Dashboards.Grafana.Download" >}}
+[Grafana.Dashboards.zip]: {{< url path="GitHub.Cortex.Observability.3.0.0.GrafanaDashboardsZip" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeObservability.Dashboards.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/dashboards/_index.md
new file mode 100644
index 000000000..4078c1304
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/on-premise/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/_index.md
new file mode 100644
index 000000000..59f2ef8fd
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/on-premise/grafana/_index.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/_index.md
new file mode 100644
index 000000000..0b777445d
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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/2024.9/Guides/upgrade-observability/on-premise/grafana/prerequisites.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/prerequisites.md
new file mode 100644
index 000000000..1a7dbf3e1
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.OnPremise.Grafana.UpgradeGrafana" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/try-it-out.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/try-it-out.md
new file mode 100644
index 000000000..3f46dd3c6
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.OnPremise.Grafana.UpgradePromtail" >}}
+[verifying the old version]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.VerifyOldVersion" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-grafana.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-grafana.md
new file mode 100644
index 000000000..c60d9a272
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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.UpgradeObservability.OnPremise.Grafana.BackupOldFiles" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Prerequisites]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.Prerequisites" >}}
+[Upgrade Loki]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.UpgradeLoki" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-loki.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-loki.md
new file mode 100644
index 000000000..8da4dd9db
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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.UpgradeObservability.OnPremise.Grafana.BackupOldFiles" >}}
+[Grafana Upgrade]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.UpgradeGrafana" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Upgrade Promtail]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.UpgradePromtail" >}}
diff --git a/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-promtail.md b/content/en/docs/2024.9/Guides/upgrade-observability/on-premise/grafana/upgrade-promtail.md
new file mode 100644
index 000000000..267e2e10b
--- /dev/null
+++ b/content/en/docs/2024.9/Guides/upgrade-observability/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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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:\Program Data\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.UpgradeObservability.OnPremise.Grafana.BackupOldFiles" >}}
+[Loki Upgrade]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.UpgradeLoki" >}}
+[Make Artefacts Available]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.MakeArtefactsAvailable" >}}
+[Try it out]: {{< url path="Cortex.Guides.UpgradeObservability.OnPremise.Grafana.TryItOut" >}}
diff --git a/content/en/docs/2024.9/Overview/_index.md b/content/en/docs/2024.9/Overview/_index.md
new file mode 100644
index 000000000..408a100e8
--- /dev/null
+++ b/content/en/docs/2024.9/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][Studio]**, **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" >}}
+[Studio]: {{< url path="Cortex.Guides.Studio.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/2024.9/Reference/APIs/_index.md b/content/en/docs/2024.9/Reference/APIs/_index.md
new file mode 100644
index 000000000..c1ff26a3d
--- /dev/null
+++ b/content/en/docs/2024.9/Reference/APIs/_index.md
@@ -0,0 +1,6 @@
+---
+title: "APIs"
+linkTitle: "APIs"
+description: "This section includes all reference documentation for APIs."
+weight: 10
+---
diff --git a/content/en/docs/2024.9/Reference/APIs/cortex-gateway/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-gateway/_index.md
new file mode 100644
index 000000000..d9bbeaffa
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/_index.md
new file mode 100644
index 000000000..d5185d02e
--- /dev/null
+++ b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/_index.md
@@ -0,0 +1,6 @@
+---
+title: "CORTEX Innovation"
+linkTitle: "CORTEX Innovation"
+description: "This section includes all reference documentation for the APIs exposed by the {{% ctx %}} Innovation platform."
+weight: 300
+---
diff --git a/content/en/docs/2024.9/Reference/APIs/cortex-innovation/core-application/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/core-application/_index.md
new file mode 100644
index 000000000..35082aa64
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/core-application/services/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/core-application/services/_index.md
new file mode 100644
index 000000000..e144554b5
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/core-application/services/api-gateway-service/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/APIs/cortex-innovation/core-application/services/licence-management-service/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/APIs/cortex-innovation/core-application/services/package-management-service/_index.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/APIs/cortex-innovation/core-application/services/provisioning-service/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/core-application/services/provisioning-service/_index.md
new file mode 100644
index 000000000..3d4300820
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/execution-application/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/execution-application/_index.md
new file mode 100644
index 000000000..9e97eb21a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/execution-application/services/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/execution-application/services/_index.md
new file mode 100644
index 000000000..058daec0c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-innovation/execution-application/services/execution-service/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-innovation/execution-application/services/execution-service/_index.md
new file mode 100644
index 000000000..b25716e02
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/APIs/cortex-studio/_index.md b/content/en/docs/2024.9/Reference/APIs/cortex-studio/_index.md
new file mode 100644
index 000000000..930596c18
--- /dev/null
+++ b/content/en/docs/2024.9/Reference/APIs/cortex-studio/_index.md
@@ -0,0 +1,9 @@
+---
+title: "CORTEX Studio"
+linkTitle: "CORTEX Studio"
+type: swagger
+description: "This section includes all reference documentation for the APIs exposed by {{% ctx %}} Studio."
+weight: 100
+---
+
+{{< workinprogress >}}
diff --git a/content/en/docs/2024.9/Reference/Blocks/Dictionaries/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/_index.md
new file mode 100644
index 000000000..00ec618d3
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/add-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/add-item/_index.md
new file mode 100644
index 000000000..b2b2a09a8
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/add-item/add-item-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/contains-item/_index.md
new file mode 100644
index 000000000..18d91f743
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-and-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/contains-item-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/contains-item-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/contains-items-with-keys-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/contains-item/contains-items-with-values-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-count/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/get-count/_index.md
new file mode 100644
index 000000000..ec65cd646
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-count/get-count-of-all-items-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-count/get-count-of-items-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-count/get-counts-of-items-with-values-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/get-item/_index.md
new file mode 100644
index 000000000..9a60abac1
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-item/get-all-items-block-3.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/get-item/get-all-items-block-3.md
new file mode 100644
index 000000000..694e4c54b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-item/get-item-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-item/get-items-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-key/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/get-key/_index.md
new file mode 100644
index 000000000..d0504c442
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/get-key/get-all-keys-block-3.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/get-key/get-all-keys-block-3.md
new file mode 100644
index 000000000..3486432e2
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/remove-item/_index.md
new file mode 100644
index 000000000..a516b96dd
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-all-items-block-3.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-all-items-block-3.md
new file mode 100644
index 000000000..cbcf93b83
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-item-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-item-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-items-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-items-with-keys-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-items-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/remove-item/remove-items-with-values-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/set-item/_index.md
new file mode 100644
index 000000000..56379859a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-all-items-block-3.md b/content/en/docs/2024.9/Reference/Blocks/Dictionaries/set-item/set-all-items-block-3.md
new file mode 100644
index 000000000..67b6571ce
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-item-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-item-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-items-with-key-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-items-with-keys-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-items-with-value-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Dictionaries/set-item/set-items-with-values-block-3.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/_index.md
new file mode 100644
index 000000000..517a2760b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/handle-block-exception/_index.md
new file mode 100644
index 000000000..0b363a866
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-block.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-block.md
new file mode 100644
index 000000000..6e454a488
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-message-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-messages-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-name-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-block-exception/handle-block-exception-matching-type-names-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-flow-exception/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/handle-flow-exception/_index.md
new file mode 100644
index 000000000..9a2fdbacc
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-flow-exception/handle-flow-exception-workspace-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-workspace-exception/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/handle-workspace-exception/_index.md
new file mode 100644
index 000000000..bfe98fb7b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/handle-workspace-exception/handle-workspace-exception-block.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/handle-workspace-exception/handle-workspace-exception-block.md
new file mode 100644
index 000000000..822923d3c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/rethrow-exception/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/rethrow-exception/_index.md
new file mode 100644
index 000000000..2867ac09a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/rethrow-exception/rethrow-exception-block.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/rethrow-exception/rethrow-exception-block.md
new file mode 100644
index 000000000..1289c161d
--- /dev/null
+++ b/content/en/docs/2024.9/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.Studio.EastPanel.ExceptionsViewer">}}
+
+[Advanced]: {{< url path="Cortex.Reference.Concepts.Fundamentals.Blocks.BlockProperties.AdvancedProperties.MainDoc" >}}
\ No newline at end of file
diff --git a/content/en/docs/2024.9/Reference/Blocks/Exceptions/throw-exception/_index.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/throw-exception/_index.md
new file mode 100644
index 000000000..6825cb935
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Exceptions/throw-exception/throw-new-flow-exception-block.md b/content/en/docs/2024.9/Reference/Blocks/Exceptions/throw-exception/throw-new-flow-exception-block.md
new file mode 100644
index 000000000..31007f815
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/_index.md
new file mode 100644
index 000000000..f42a0941a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/check-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/check-file/_index.md
new file mode 100644
index 000000000..e5fb6edbb
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/check-file/check-file-exists-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/check-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/check-folder/_index.md
new file mode 100644
index 000000000..4ae62e559
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/check-folder/check-folder-exists-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-file/_index.md
new file mode 100644
index 000000000..71e54f21e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-file/copy-file-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-file/copy-file-block.md
new file mode 100644
index 000000000..0542f41e9
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-file/copy-files-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-file/copy-files-block.md
new file mode 100644
index 000000000..c54a51005
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/_index.md
new file mode 100644
index 000000000..0b4717a91
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/copy-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/copy-folder-block.md
new file mode 100644
index 000000000..c759f552f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/copy-folders-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/copy-folders-block.md
new file mode 100644
index 000000000..f1f10885c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/duplicate-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/copy-folder/duplicate-folder-block.md
new file mode 100644
index 000000000..0cc8ffb25
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/create-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/create-folder/_index.md
new file mode 100644
index 000000000..91e4e4279
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/create-folder/create-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/create-folder/create-folder-block.md
new file mode 100644
index 000000000..ef24a457f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/create-folder/create-folders-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/create-folder/create-folders-block.md
new file mode 100644
index 000000000..e055574d7
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-file/_index.md
new file mode 100644
index 000000000..e4e10375e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-file/delete-file-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-file/delete-file-block.md
new file mode 100644
index 000000000..a3596286b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-file/delete-files-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-file/delete-files-block.md
new file mode 100644
index 000000000..1f775355a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/_index.md
new file mode 100644
index 000000000..03f110087
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/delete-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/delete-folder-block.md
new file mode 100644
index 000000000..c10eede1b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md
new file mode 100644
index 000000000..99c2b2b7d
--- /dev/null
+++ b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/delete-folder/delete-folders-block.md
@@ -0,0 +1,176 @@
+---
+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" >}}
+[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/2024.9/Reference/Blocks/Files-And-Folders/get-file-information/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/get-file-information/_index.md
new file mode 100644
index 000000000..e2945e03a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/get-file-information/get-file-information-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/get-folder-content/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/get-folder-content/_index.md
new file mode 100644
index 000000000..4c4696535
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/get-folder-content/get-folder-content-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/get-folder-information/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/get-folder-information/_index.md
new file mode 100644
index 000000000..9b3213535
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/get-folder-information/get-folder-information-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-file/_index.md
new file mode 100644
index 000000000..72624ef3e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-file/move-file-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-file/move-file-block.md
new file mode 100644
index 000000000..f28976562
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-file/move-files-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-file/move-files-block.md
new file mode 100644
index 000000000..b99f6d675
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-folder/_index.md
new file mode 100644
index 000000000..facdb6dda
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-folder/move-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-folder/move-folder-block.md
new file mode 100644
index 000000000..b36340253
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/move-folder/move-folders-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/move-folder/move-folders-block.md
new file mode 100644
index 000000000..da4312d0d
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/read-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/read-file/_index.md
new file mode 100644
index 000000000..172a52744
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/read-file/read-all-lines-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/read-file/read-all-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/rename-folder/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/rename-folder/_index.md
new file mode 100644
index 000000000..e4b6c16b7
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/rename-folder/rename-folder-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/rename-folder/rename-folder-block.md
new file mode 100644
index 000000000..0595cb931
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/search-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/search-file/_index.md
new file mode 100644
index 000000000..5bdc44c30
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/search-file/search-file-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/search-file/search-file-block.md
new file mode 100644
index 000000000..0362dca0f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/search-file/search-files-block.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/search-file/search-files-block.md
new file mode 100644
index 000000000..d5129d3dc
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/write-file/_index.md b/content/en/docs/2024.9/Reference/Blocks/Files-And-Folders/write-file/_index.md
new file mode 100644
index 000000000..bcadbe7f5
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/write-file/write-all-lines-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Files-And-Folders/write-file/write-all-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Count/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/Get-Count/_index.md
new file mode 100644
index 000000000..6e11b63ca
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Count/get-count-of-all-items-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Count/get-count-of-items-with-values-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Index/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/Get-Index/_index.md
new file mode 100644
index 000000000..f76c2f371
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Index/get-index-of-item-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/Get-Index/get-indexes-of-items-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/_index.md
new file mode 100644
index 000000000..81c3fb421
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/add-item/_index.md
new file mode 100644
index 000000000..46346dea3
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-item-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-item-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-item-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-items-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-items-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/add-item/add-items-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/contains-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/contains-item/_index.md
new file mode 100644
index 000000000..30f4fc7df
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/contains-item/contains-item-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/contains-item/contains-items-with-values-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/get-item/_index.md
new file mode 100644
index 000000000..cb3bb09ff
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-item-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-item-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-item-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-items-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-items-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-items-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/get-item/get-items-at-indexes-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/remove-item/_index.md
new file mode 100644
index 000000000..233ff40fb
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-all-items-block-2.md b/content/en/docs/2024.9/Reference/Blocks/Lists/remove-item/remove-all-items-block-2.md
new file mode 100644
index 000000000..de5db2ef2
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-duplicate-items-block-2.md b/content/en/docs/2024.9/Reference/Blocks/Lists/remove-item/remove-duplicate-items-block-2.md
new file mode 100644
index 000000000..9763d5c85
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-item-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-item-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-item-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-item-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-at-indexes-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/remove-item/remove-items-with-values-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/_index.md b/content/en/docs/2024.9/Reference/Blocks/Lists/set-item/_index.md
new file mode 100644
index 000000000..1a848c4be
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-all-items-block-2.md b/content/en/docs/2024.9/Reference/Blocks/Lists/set-item/set-all-items-block-2.md
new file mode 100644
index 000000000..0c6cde53a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-item-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-item-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-item-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-item-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-at-beginning-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-at-end-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-at-index-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-at-indexes-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-with-value-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Lists/set-item/set-items-with-values-block-2.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/PowerShell/_index.md b/content/en/docs/2024.9/Reference/Blocks/PowerShell/_index.md
new file mode 100644
index 000000000..7bb3eb21b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/PowerShell/execute-powershell-script/_index.md b/content/en/docs/2024.9/Reference/Blocks/PowerShell/execute-powershell-script/_index.md
new file mode 100644
index 000000000..abc8da99e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/PowerShell/execute-powershell-script/execute-powershell-script-block-1.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/_index.md
new file mode 100644
index 000000000..414eb632e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/convert-to-camel-case-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/convert-to-camel-case-block.md
new file mode 100644
index 000000000..d63ef328a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/convert-to-lower-case-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/convert-to-lower-case-block.md
new file mode 100644
index 000000000..f9eb6e2d0
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/convert-to-pascal-case-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/convert-to-pascal-case-block.md
new file mode 100644
index 000000000..cce527f40
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/convert-to-title-case-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/convert-to-title-case-block.md
new file mode 100644
index 000000000..b3d013e36
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Convert-To/convert-to-upper-case-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Convert-To/convert-to-upper-case-block.md
new file mode 100644
index 000000000..3f1effcb6
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Get-Index/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/Get-Index/_index.md
new file mode 100644
index 000000000..b1f69b98a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Get-Index/get-index-of-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Get-Index/get-index-of-text-block.md
new file mode 100644
index 000000000..8b860d2ee
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Get-Index/get-indexes-of-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Get-Index/get-indexes-of-text-block.md
new file mode 100644
index 000000000..a973e520d
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Get-Length/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/Get-Length/_index.md
new file mode 100644
index 000000000..0602a8e34
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/Get-Length/get-length-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/Get-Length/get-length-block.md
new file mode 100644
index 000000000..216193d6a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/_index.md
new file mode 100644
index 000000000..cfd3af806
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/add-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/add-text/_index.md
new file mode 100644
index 000000000..bafeeb0f4
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/add-text/add-text-after-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/add-text/add-text-after-index-block.md
new file mode 100644
index 000000000..01aff80cf
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/add-text/add-text-at-beginning-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/add-text/add-text-at-beginning-block.md
new file mode 100644
index 000000000..9bc8f3ed2
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/add-text/add-text-at-end-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/add-text/add-text-at-end-block.md
new file mode 100644
index 000000000..604cd2d67
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/add-text/add-text-before-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/add-text/add-text-before-index-block.md
new file mode 100644
index 000000000..03f569a5f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/contains-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/contains-text/_index.md
new file mode 100644
index 000000000..a39909591
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/contains-text/contains-all-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/contains-text/contains-all-text-block.md
new file mode 100644
index 000000000..e369d9766
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/contains-text/contains-any-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/contains-text/contains-any-text-block.md
new file mode 100644
index 000000000..35cf47be0
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/contains-text/contains-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/contains-text/contains-text-block.md
new file mode 100644
index 000000000..5d43abc66
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/decode-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/decode-text/_index.md
new file mode 100644
index 000000000..fc6653945
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/decode-text/decode-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/decode-text/decode-text-block.md
new file mode 100644
index 000000000..afde31ce1
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/encode-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/encode-text/_index.md
new file mode 100644
index 000000000..38ce0b2f7
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/encode-text/encode-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/encode-text/encode-text-block.md
new file mode 100644
index 000000000..1b5d720a1
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/find-and-remove-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/find-and-remove-text/_index.md
new file mode 100644
index 000000000..f11296cc6
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/find-and-remove-text/find-and-remove-all-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/find-and-remove-text/find-and-remove-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/find-and-replace-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/find-and-replace-text/_index.md
new file mode 100644
index 000000000..f9038379b
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/find-and-replace-text/find-and-replace-all-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/find-and-replace-text/find-and-replace-text-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/find-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/find-text/_index.md
new file mode 100644
index 000000000..e04585aac
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/find-text/find-all-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/find-text/find-all-text-block.md
new file mode 100644
index 000000000..65d013756
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/find-text/find-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/find-text/find-text-block.md
new file mode 100644
index 000000000..d9927c071
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/format-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/format-text/_index.md
new file mode 100644
index 000000000..3510eb0bb
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/format-text/format-text-with-value-block-1.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/format-text/format-text-with-values-block-1.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/get-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/_index.md
new file mode 100644
index 000000000..c3a9c2e87
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/get-text/get-text-at-beginning-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/get-text-at-beginning-block.md
new file mode 100644
index 000000000..197e0541f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/get-text/get-text-at-end-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/get-text-at-end-block.md
new file mode 100644
index 000000000..4f822d37c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/get-text/get-text-at-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/get-text-at-index-block.md
new file mode 100644
index 000000000..b4a4b80cb
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/get-text/get-text-before-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/get-text-before-index-block.md
new file mode 100644
index 000000000..ec7e18142
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/get-text/get-text-between-indexes-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/get-text/get-text-between-indexes-block.md
new file mode 100644
index 000000000..30d78b689
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/is-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/is-text/_index.md
new file mode 100644
index 000000000..1b1f9d50d
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-empty-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/is-text/is-text-empty-block.md
new file mode 100644
index 000000000..35898d82e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-empty-or-whitespace-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-equal-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/is-text/is-text-equal-block.md
new file mode 100644
index 000000000..9474ebb9f
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-null-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/is-text/is-text-null-block.md
new file mode 100644
index 000000000..f4a7bb7dc
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-null-empty-or-whitespace-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/is-text/is-text-null-or-empty-block.md b/content/en/docs/2024.9/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/2024.9/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/2024.9/Reference/Blocks/Text/join-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/join-text/_index.md
new file mode 100644
index 000000000..60c7d1193
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/join-text/join-text-block-1.md b/content/en/docs/2024.9/Reference/Blocks/Text/join-text/join-text-block-1.md
new file mode 100644
index 000000000..8296d6f30
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/_index.md
new file mode 100644
index 000000000..73ba8925c
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-beginning-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-beginning-block.md
new file mode 100644
index 000000000..faad3bab9
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-end-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-end-block.md
new file mode 100644
index 000000000..932ea0f2a
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/remove-text-at-index-block.md
new file mode 100644
index 000000000..49b78c595
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/remove-text-before-index-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/remove-text-before-index-block.md
new file mode 100644
index 000000000..d91eb1419
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/remove-text/remove-text-between-indexes-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/remove-text/remove-text-between-indexes-block.md
new file mode 100644
index 000000000..afde04054
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/split-text/_index.md b/content/en/docs/2024.9/Reference/Blocks/Text/split-text/_index.md
new file mode 100644
index 000000000..498cf5969
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/Text/split-text/split-text-block.md b/content/en/docs/2024.9/Reference/Blocks/Text/split-text/split-text-block.md
new file mode 100644
index 000000000..adbff686e
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/_index.md b/content/en/docs/2024.9/Reference/Blocks/_index.md
new file mode 100644
index 000000000..321f178f6
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/data-storage/_index.md b/content/en/docs/2024.9/Reference/Blocks/data-storage/_index.md
new file mode 100644
index 000000000..1ec60a4e9
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/data-storage/create-collection/_index.md b/content/en/docs/2024.9/Reference/Blocks/data-storage/create-collection/_index.md
new file mode 100644
index 000000000..7d76634a0
--- /dev/null
+++ b/content/en/docs/2024.9/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/2024.9/Reference/Blocks/data-storage/create-collection/create-collection-block.md b/content/en/docs/2024.9/Reference/Blocks/data-storage/create-collection/create-collection-block.md
new file mode 100644
index 000000000..b3246083b
--- /dev/null
+++ b/content/en/docs/2024.9/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."
+---
+{{