This course provides an overview of contemporary research, techniques and tools whose aims are to improve software reliability. Systems are increasingly reliant on software and software-controlled elements – including those with safety-critical applications. This course covers manual and automated techniques and frameworks for improving software reliability as part of the development and release process. This includes code verification and software model checking. Key software reliability prediction models will be introduced, including those that inform software reliability growth. Key topics include N-version programing and the development of fault tolerant software.