The original drivers behind YAWL were to define a workflow language that would support all (or most) of the workflow patterns and that would have a formal semantics. Observing that Petri nets came close to supporting most of the workflow patterns, the designers of YAWL decided to take Petri nets as a starting point and to extend this formalism with three main constructs, namely or-join, cancellation sets, and multi-instance activities. These three concepts are aimed at supporting five of the workflow patterns that were not directly supported in Petri nets, namely "synchronizing merge", "discriminator", "N-out-of-M join", "multiple instance with no a priori runtime knowledge" and "cancel case".