Boogie is an intermediate verification language, designed to make the prescription of verification conditions natural and convenient. It serves as a common intermediate representation for static program verifiers of various source languages, and it abstracts over the interfaces to various theorem provers. Boogie can also be used as a shared input and output format for techniques like abstract interpretation and predicate abstraction. As a language, Boogie has both mathematical and imperative components. The imperative components of Boogie specify sets of execution traces, the states of which are described and constrained by the mathematical components. The language includes features like parametric polymorphism, partial orders, logical quantifications, nondeterminism, total expressions, partial statements, and flexible control flow. The Boogie language was previously known as BoogiePL. This paper is a reference manual for Boogie version 2.