The original CSP was a language for parallel imperative programs communicating by synchronized message-passing. Most of the early foundational work concerned a more abstract process algebra, now known as Theoretical CSP (or TCSP). The early semantic models involved communication traces, refusals, failures, and divergence traces. These models support compositional reasoning about safety properties, but since they do not assume fair parallel scheduling they are less well suited for proving liveness properties. More recent developments using a suitably formulated form of action traces provide a unifying semantic framework, applicable both to CSP-style synchronized communication and to asynchronously communicating processes, as well as to shared memory parallel programs, in each case assuming a simple form of fair execution.