Designing Fault Tolerant Systems