An important goal in software engineering is to describe complex software systems at an architectural level of abstraction. While architectural design has always been a major factor in determining the success of a software system, architectural descriptions are typically understood only in informal, idiomatic ways. Because of this informality architectural designs are typically not well-integrated into the software development environments, but appear (if at all) as corroborative high-level documentation for a system. This research places architectural design on a more solid footing in two complementary ways. First, it provides a formal basis for describing and reasoning about architectural designs. This leads to rules for checking whether architectural designs are well-formed in a way that is analogous to type checking for existing implementation languages. Second, it provides tools for developing style-specific architectural design environments. These tools provide cost-effective ways to generate new environments tailored to the architectural design of specific application families. This grant includes support under the Research Experiences for Undergraduates (REU) Program.