Dependable software is a requirement for a variety of mission- critical applications such as telecommunications switching systems, embedded automotive powertrain control software, and banking systems. Dependable software must not only produce correct output, but must also be highly available, meet stringent performance requirements, and must be able to detect and recover from component failures and malicious attacks. In this talk, current research on improving the dependability of software under development and at runtime will be described. Experiences applying some of the research to real systems will also be presented. The talk will conclude with a discussion of ongoing software dependability challenges and potential future research directions.