diff --git a/README.md b/README.md
index e96e6209f0d43e90d1bfe48334a584073daa58bb..536572ead1a90ed55ca27f5ca8feba82d09a604a 100644
--- a/README.md
+++ b/README.md
@@ -80,6 +80,21 @@ Actris tactics are as follows:
   put `H : c ↣ prot1` and `H : c ↣ prot2` back into the contexts of the two
   respectively goals.
 
+The above tactics implicitly perform normalization of the protocol `prot` in
+the hypothesis `H : c ↣ prot`. For example, `wp_send` also works if there is a
+with protocol the `iProto_dual ((<?> y1 .. yn, MSG v; {{ P }}; END) <++> prot)`.
+Concretely, the normalization performs the following actions:
+
+- It re-associates appends (`<++>`), and removes left-identities (`END`) of it.
+- It moves appends (`<++>`) into sends (`<!>`), receives (`<?>`), selections
+  (`<+>`) and branches (`<&>`).
+- It distributed duals (`iProto_dual`) over append (`<++>`).
+- It unfolds `prot1` into `prot2` if there is an instance of the type class
+  `ProtoUnfold prot1 prot2`. When defining a recursive protocol, it is
+  useful to define a `ProtoUnfold` instance to obtain automatic unfolding
+  of the recursive protocol. For example, see `sort_protocol_br_unfold` in
+  [theories/examples/sort_br_del.v](theories/examples/sort_br_del.v).
+
 [HeapLang]: https://gitlab.mpi-sws.org/iris/iris/blob/master/HeapLang.md
 [ProofMode]: https://gitlab.mpi-sws.org/iris/iris/blob/master/ProofMode.md
 [ActrisProofMode]: theories/channel/proofmode.v