Designing Fault Tolerant Applications