This book provides an accessible introduction to the principles of concurrent programming using a rigorous approach based on labelled state transition systems. It aims to take the middle ground between lightweight introductory texts and very theoretical texts. The basic concepts are presented in an elementary manner suitable for undergraduates.