The emergence of patterns as an organizational and design tool can help abate what Brooks calls the accidental complexity of software development. This project addresses practical and pedagogical concerns of the computer science and software engineering communities with an integrated approach to the use, learning, and teaching of patterns. Work in Design Patterns to date has focused on the recognition, cataloging, and finding of patterns with little attention to the use of patterns by experienced software practitioners and particularly by students and practitioners not well-versed in object-oriented technologies. The foundation of the project is the design, development, and delivery of a layered support structure for design patterns. The first layer focuses on how to use catalogs of patterns, idioms, and architectures accessible to those without a deep background in object-oriented programming and methodologies. The second layer builds on this catalog by developing methods for using patterns based on heuristics for recognizing when specific patterns are applicable and relevant. As part of both layers, the project bridges the gap between novice and expert designers by developing resources to aid in the recognition and discovery of patterns.