This lecture is an introduction to fault tolerant computing. How can we make systems that are resilient to hardware and software faults? Systems can fail for a number of reasons, the hardware can fail or the software can fail. In this lecture I'll talk about the foundations of fault tolerant computation and the basic properties a system should have in order to be able to function in an adequate manner despite the occurrence of hardware and software errors. We'll see how concurrency and scalability are intimately related to fault tolerance and and take a quick peep at shared memory and message passing concurrency. I'll also summaries the key features of Erlang and show how they can be used for programming fault-tolerant and scalable systems on multi-core clusters.