Program understanding is an essential part of all software maintenance and enhancement activities. As currently practiced, program understanding consists mainly of code reading. The few automated understanding tools that are actually used in industry provide helpful but relatively shallow information, such as the line numbers on which variable names occur or the calling structure possible among system components. These tools rely on analyses driven by the nature of the programming language used. As such, they are adequate to answer questions concerning implementation details, so called what questions. They are severely limited, however, when trying to relate a system to its purpose or requirements, the why questions. Application programs solve realdworld problems. The part of the world with which a particular application is concerned is that application’s domain. A model of an application’s domain can serve as a supplement to programmingdlanguagedbased analysis methods and tools. A domain model carries knowledge of domain boundaries, terminology, and possible architectures. This knowledge can help an analyst set expectations for program content. Moreover, a domain model can provide information on how domain concepts are related. This article discusses the role of domain knowledge in program understanding. It presents a method by which domain models, together with the results of programmingdlanguagedbased analyses, can be used to answers both what and why questions. Representing the results of domaindbased program understanding is also important, and a variety of representation techniques are discussed. Although domaindbased understanding can be performed manually, automated tool support can guide discovery, reduce effort, improve consistency, and provide a repository of knowledge useful for downstream activities such as documentation, reengineering, and reuse. A tools framework for domaindbased program understanding, a dowser, is presented in which a variety of tools work together to make use of domain information to facilitate understanding. Experience with domaindbased program understanding methods and tools is presented in the form of a collection of case studies. After the case studies are described, our work on domaindbased program understanding is compared with that of other researchers working in this area. The paper concludes with a discussion of the issues raised by domaindbased understanding and directions for future work.