In architecting dependable systems, what is required to improve the overall system robustness is fault tolerance. Many methods have been proposed to this end, the solutions are usually considered late during the design and implementation phases of the software life-cycle (e.g., Java and Windows NT exception handling), thus reducing the effectiveness error and fault handling. Since the system design typically models only normal behaviour of the system while ignoring exceptional ones, the implementation of the system is unable to handle abnormal events. Consequently, the system may fail in unexpected ways due to faults.It has been argued that fault tolerance management during the entire life-cycle improves the overall system robustness and that different classes of threats need to be identified for and dealt with at each distinct phase of software development, depending on the abstraction level of the software system being modelled.This book builds on this trend and investigates how fault tolerance mechanisms can be applied when engineering a software system. In particular, it identifies the new problems arising in this area, introduces the new models to be applied at different abstraction levels, defines methodologies for model-driven engineering of such systems and outlines the new technologies and validation and verification environments supporting this.