diff --git a/docs/user_technical/open-cypher.md b/docs/user_technical/open-cypher.md
index e84a57ca5..06e3f60b0 100644
--- a/docs/user_technical/open-cypher.md
+++ b/docs/user_technical/open-cypher.md
@@ -399,6 +399,39 @@ index `label` and `property`. Do not create indices concurrently.
 
 The following sections describe some of the other supported features.
 
+#### Filtering Variable Length Paths
+
+OpenCypher supports only simple filtering when matching variable length paths.
+For example:
+
+    MATCH (n)-[r:Type * {x: 42}]-(m)
+
+This will produce only those paths whose edges have the required `Type` and `x`
+property value.
+
+Memgraph extends openCypher with a syntax for arbitrary filter expressions
+during path matching. The next example filters edges which have property `x`
+between `0` and `10`.
+
+    MATCH (n)-[r * (edge, node | 0 < edge.x < 10)]-(m)
+
+Here we introduce a lambda function with parentheses, where the first two
+arguments, `edge` and `node`, correspond to each edge and node during path
+matching. `node` is the destination node we are moving to across the current
+`edge`. The last `node` value will be the same value as `m`. Following the
+pipe (`|`) character is an arbitrary expression which must produce a boolean
+value.  If `True`, matching continues, otherwise the path is discarded.
+
+The previous example can be written using the `all` function:
+
+    MATCH (n)-[r *]-(m) WHERE all(edge IN r WHERE 0 < edge.x < 10)
+
+However, filtering using a lambda function is more efficient because paths
+may be discarded earlier in the traversal. Furthermore, it provides more
+flexibility for deciding what kind of paths are matched due to more expressive
+filtering capabilities. Therefore, filtering through lambda functions should
+be preferred whenever possible.
+
 #### Breadth First Search
 
 A typical graph use-case is searching for the shortest path between nodes.
@@ -497,7 +530,7 @@ functions.
  `startsWith`    | Check if the first argument starts with the second.
  `endsWith`      | Check if the first argument ends with the second.
  `contains`      | Check if the first argument has an element which is equal to the second argument.
- `all`           | Check if all elements of a list satisfy a predicate.<br/>The syntax is: `all(variable IN list WHERE predicate)`.
+ `all`           | Check if all elements of a list satisfy a predicate.<br/>The syntax is: `all(variable IN list WHERE predicate)`.<br/> NOTE: Whenever possible, use Memgraph's lambda functions when [matching](#filtering-variable-length-paths) instead.
  `assert`        | Raises an exception reported to the client if the given argument is not `true`.
  `counter`       | Generates integers that are guaranteed to be unique on the database level, for the given counter name.
  `counterSet`    | Sets the counter with the given name to the given value.
@@ -638,7 +671,6 @@ String functions:
 * `reverse()`
 
 List functions:
-* `all()`
 * `any()`
 * `none()`
 * `single()`