Software systems are always changing to address new stakeholders' concerns. Design modularity improves the stability of software by decoupling design concerns that are likely to change so that they can be maintained independently. Despite the efforts of modern programming languages, some concerns, called crosscutting concerns, cannot be well modularised in the system design and implementation. This book presents a catalogue of crosscutting concerns - crosscutting patterns - empirically observed in several software systems. These patterns are described and classified based on an intuitive vocabulary that facilitates their recognition by software engineers. Crosscutting patterns are detected by a heuristic assessment technique composed of metrics and heuristic rules. The accuracy of the heuristic technique is assessed through their application to seven systems. The outcomes of our exploratory evaluation indicate that certain specific patterns of crosscutting concerns seem to be good indicators of design instabilities. This book targets Software Engineering researchers and practitioners. Developers of new programming languages for modular software would also benefit by reading it.