Design And Validation Of A Layered Approach To Fault Tolerance For Distributed Applications