This course provides a comprehensive, in-depth introduction to procedural modeling of architecture using grammar-based approaches. It first presents all necessary fundamentals and discusses the various advanced features of grammar languages in detail. Subsequently, context sensitivity, which is crucial for many practical tasks, and the different forms of support for it are addressed extensively. The course then looks into several further advanced aspects, such as local edits or GPU-based variants, and finally explores related inverse procedural modeling approaches. Elements from a large body of work are covered and presented in a coherent, structured way. The course explores the range of solution approaches, provides examples, and identifies limitations; it also highlights and investigates practical problem cases. The course is useful for practitioners and researchers from many different domains, ranging from urban planning, geographic information systems (GIS) and virtual maps to movies and computer games, with interests ranging from content creation to grammar-based procedural approaches in general. They learn about the arsenal of available techniques and obtain an overview of the field, including more recent developments. The audience benefits from a coherent treatment of ideas, concepts, and techniques scattered across many (sometimes lesser-known) publications and systems. This course helps in developing a realistic understanding of what can be done with current solutions, how difficult and practical that is, and with which tasks existing approaches cannot cope.