--- /dev/null
+New: In the same spirit as provided by the C++20 [range
+adaptors](https://en.cppreference.com/w/cpp/ranges) feature, it is now
+possible to "filter" ranges over the active cells of Triangulation
+and DoFHandler objects.
+<br>
+This allows to replace:
+@code
+ DoFHandler<dim> dof_handler;
+ ...
+ for (const auto &cell : dof_handler.active_cell_iterators())
+ {
+ if (cell->is_locally_owned())
+ {
+ fe_values.reinit (cell);
+ ...do the local integration on 'cell'...;
+ }
+ }
+@endcode
+by:
+@code
+ DoFHandler<dim> dof_handler;
+ ...
+ const auto filtered_iterators_range =
+ filter_iterators();
+ for (const auto &cell :
+ dof_handler.active_cell_iterators() | IteratorFilters::LocallyOwnedCell())
+ {
+ fe_values.reinit (cell);
+ ...do the local integration on 'cell'...;
+ }
+@endcode
+Here, the `operator|` is to be interpreted in the same way as is done in
+the [range adaptors](https://en.cppreference.com/w/cpp/ranges) feature
+that is part of [C++20](https://en.wikipedia.org/wiki/C%2B%2B20). It has
+the same meaning as the `|` symbol on the command line: It takes what is
+on its left as its inputs, and filters and transforms to produce some
+output. In the example above, it "filters" all of the active cell iterators
+and removes those that do not satisfy the predicate -- that is, it produces
+a range of iterators that only contains those cells that are both active
+and locally owned.
+<br>
+(Wolfgang Bangerth, 2021/11/03)