Liveness and safeness are two key properties Petri nets should have when they are used to model asynchronous systems. The analysis of liveness and safeness for general Petri nets, though shown to be decidable by Mayr [1981], is still computa- tionally expensive (Lipton [1976]1). In this paper an hierarchical approach is taken: a class of Petri nets is recursively defined starting with simple, live and safe struc- tures, becoming progressively more complex using net transformations designed to preserve liveness and safeness. Using simple net transformations, nice nets, which are live and safe, are defined. Their behavior is too restrictive for modeling non-trivial systems, so the mutual exclusion and the repetition constructs are added to g...