Tempo is a declarative concurrent programming language based on classical first-order logic. It improves on traditional concurrent logic programming languages (e.g., Parlog) by explicitly specifying aspects of the behaviour of concurrent programs, namely their safety properties. This provides great advantages in writing concurrent programs and manipulating them while preserving correctness. The language has a procedural interpretation that allows the specification to be executed, also concurrently. Tempo is sufficiently high-level to simulate practical concurrent programming paradigms, and can act as a common framework in which algorithms for a variety of paradigms may be expressed, compared, and manipulated.