A reliable multicast protocol ensures that all of the intended recipients of a message m that do not fail eventually deliver m. For example, consider the reliable multicast protocol of 11, and consider a message m, sent by process p 1, that is intended to be delivered by p 1, p 2, and p 3. We impose a directed spanning tree on these processes that is rooted at the message source. For example, for m we could have the directed spanning tree p 1 → p 2 → p 3. The message m propagates down this spanning tree and acknowledgments of the receipt of m propagate back up the tree. A leaf process in this tree delivers m when it receives m, and a non-leaf process delivers m when it gets the acknowledgment for m from all of its children. If a non-leaf process (say, p 1) does not get an acknowledgment for m from one of its children (here, p 2), then it removes the child from the tree and “adopts” that child’s children (here, p 3). The process sends m to the newly-adopted children and continues the broadcast. A similar monitoring and adoption approach is used to recover from the failure of the root of the tree.