  Typestates are state machines used in object-oriented programming to specify
and verify correct order of method calls on an object. To avoid inconsistent
object states, typestates enforce linear typing, which eliminates - or at best
limits - aliasing. However, aliasing is an important feature in programming,
and the state-of-the-art on typestates is too restrictive if we want typestates
to be adopted in real-world software systems.
  In this paper, we present a type system for an object-oriented language with
typestate annotations, which allows for unrestricted aliasing, and as opposed
to previous approaches it does not require linearity constraints. The typestate
analysis is global and tracks objects throughout the entire program graph,
which ensures that well-typed programs conform and complete the declared
protocols. We implement our framework in the Scala programming language and
illustrate our approach using a running example that shows the interplay
between typestates and aliases.
