diff --git a/docs/components/modeler/bpmn/ad-hoc/ad-hoc.md b/docs/components/modeler/bpmn/ad-hoc/ad-hoc.md
new file mode 100644
index 0000000000..67883eccc3
--- /dev/null
+++ b/docs/components/modeler/bpmn/ad-hoc/ad-hoc.md
@@ -0,0 +1,75 @@
+---
+id: ad-hoc
+title: "Ad-hoc"
+description: "The ad-hoc marker is only available for embedded subprocesses, so called ad-hoc subprocesses."
+---
+
+The ad-hoc marker (**~** a tilde character) is only available
+for [embedded subprocesses](../embedded-subprocesses/embedded-subprocesses.md), so called **ad-hoc subprocesses**.
+Compared to regular subprocesses, it allows more flexibility for executing the inner elements.
+
+![A demo process with an ad-hoc subprocess. Some elements inside the subprocess are active.](assets/ad-hoc-subprocess.png)
+
+The inner elements of an ad-hoc subprocess are not connected to a start or end event. Each element can be executed
+multiple times, in any order, or skipped.
+
+If elements depend on each other, the elements can be connected by a sequence flow to build a structured sequence
+within the ad-hoc subprocess.
+
+When a process instance reaches an ad-hoc subprocess, it [activates the inner elements](#activate-an-element) and waits
+for their completion. After the last element is completed, the process instance completes the ad-hoc subprocess and
+takes the outgoing sequence flows.
+
+### Constraints
+
+An ad-hoc subprocess has the following constraints:
+
+- Must have at least one activity
+- Must not have start events or end events
+- Any intermediate catch event must have an outgoing sequence flow
+
+## Activate an element
+
+An ad-hoc subprocess can define an expression `activeElementsCollection` that should return a
+[list](../../feel/language-guide/feel-data-types.md#list) of strings. Each string in the list should match to an id of
+an inner element of the ad-hoc subprocess. Usually, the expression accesses a process instance variable that was
+created before and holds the list of element ids.
+
+![A process with an ad-hoc subprocess that shows how a variable is used to active the inner elements.](assets/ad-hoc-subprocess-activation.png)
+
+When a process instance reaches an ad-hoc subprocess, it evaluates the expression `activeElementsCollection` and
+activates all elements whose element ids are in the list.
+
+If the list is empty or the expression is not defined, no element is activated and the ad-hoc subprocess stays active.
+
+If the expression doesn't evaluate to a list of strings, or the list contains other values than inner element ids, the
+process instance creates an incident.
+
+:::note
+Currently, it is not possible to activate elements dynamically after the ad-hoc subprocess is activated, only on
+entering the subprocess.
+:::
+
+## Variable mappings
+
+An ad-hoc subprocess can define input and output
+[variable mappings](../../../concepts/variables.md#inputoutput-variable-mappings).
+
+Input variable mappings are applied on activating the ad-hoc subprocess and before evaluating the expression
+`activeElementsCollection`. They can be used to create local variables for the ad-hoc subprocess.
+
+Output variable mappings are applied on completing the ad-hoc subprocess. They can be used to propagate local variables
+from the ad-hoc subprocess into the process instance. By default, no local variables are propagated.
+
+## Additional resources
+
+### XML representation
+
+```xml
+