We propose an atomic broadcast protocol that supports the construction of high performance fault-tolerant distributed systems by providing several different semantics simultaneously. This protocol supports three atomicity semantics---weak, strong, and strict atomicity---and three ordering semantics---unordered, total order, and time order. These result in nine group communication semantics and an application can dynamically choose the desired atomicity and order semantics when broadcasting an update. This protocol provides fast delivery and stability times, uses a small number of messages to accomplish a broadcast or a membership change, distributes evenly the processing load among group members, and uses efficient flow control techniques. The good overall performance is maintained in the absence of any failures and normal update arrival rates, in the presence of communication or process failures, and when updates arrive at a very fast or very slow rates.