Objects model the world, and state is fundamental to a faithful modeling. Engineers use state machines to understand and reason about state transitions, but programming languages provide little support for reasoning about or implementing these state machines, causing software defects and lost productivity when objects are misused. We propose Typestate-Oriented Programming as a natural extension to the object paradigm, where objects are modeled not just in terms of classes, but in terms of changing states. Each state may have its own representation and methods which may transition the object into a new state. A flow-sensitive, permission-based type system helps developers track which state objects are in. First-class typestates are ul abstraction that will help developers model and reuse objects more efficiently and correctly. Categories and Subject Descriptors D.3.1 [Programming Techniques]: Miscellaneous—Typestate-oriented programming; D.3.2 [Programming Languages]: Language Clas...