where a subprogram calls itself, each invocation needs its own copy of work fields 2. **Reentrant programs** -- where the same program might be executing simultaneously in multiple threads 3. **Fresh-start semantics** -- when you need work fields guaranteed to be clean on every call