  A modern approach to engineering correct-by-construction systems is to
synthesize them automatically from formal specifications. Oftentimes, a system
can only satisfy its guarantees if certain environment assumptions hold, which
motivates their inclusion in the system specification. Experience with modern
synthesis approaches shows that synthesized systems tend to satisfy their
specifications by actively working towards the violation of the assumptions
rather than satisfying assumptions and guarantees together. Such uncooperative
behavior is undesirable because it violates the aim of synthesis: the system
should try to satisfy its guarantees and use the assumptions only when needed.
Also, the assumptions often describe the valid behavior of other components in
a bigger system, which should not be obstructed unnecessarily.
  In this paper, we present a hierarchy of cooperation levels between system
and environment. Each level describes how well the system enforces both the
assumptions and guarantees. We show how to synthesize systems that achieve the
highest possible cooperation level for a given specification in Linear Temporal
Logic (LTL). The synthesized systems can also exploit cooperative environment
behavior during operation to reach a higher cooperation level that is not
enforceable by the system initially. The worst-case time complexity of our
synthesis procedure is doubly-exponential, which matches the complexity of
standard LTL synthesis.
  This is an extended version of [7] that features an additional appendix.
