I am interested in all aspects of software modelling, documentation, and analysis. I am particularly interested in what I call practical formalisms -- specification and design notations that are practitioner-friendly and yet have a precise semantics that is suitable for automated analysis. Much of my research work has focused on computer-aided tools and techniques for analyzing software requirements and specifications. My students and I work with model checkers and reachability analyzers, to exhaustively check that a software specification adheres to desired system properties (e.g., safety, liveness, and timing properties, expressed as logic formulae). These tools hold the promise of providing to software practitioners push-button mathematical verification of their specifications and designs. However, such verification is computationally expensive in both space and time, so much of our work involves understanding how to structure and abstract specifications to make their model checking feasible. Recent work looks at how to generate notation-specific analysis tools from a template definition of a notation's semantics -- in the manner that we currently generate parsers from grammar definitions. Recently, I have been working with WatForm colleagues on how to support the rapid development of new services from distributed, modular components. Ideally, modular components do not need to know about each other to cooperate. However, modular components and features can subtly interfere with each other because they override the same application and manipulate the same data. We are experimenting with theories, architectures, design conventions, and analysis techniques that help to ensure that independently devFSE'08eloped features inter-operate well.