Many applications have a need for different degrees of fault tolerance in the same system. The paper presents the software architecture of a fault-tolerant distributed system which supports both cold and hot standby redundancy of selected software modules. Cold standby modules are created and activated by the system in order to replace failed modules, but no state information is preserved. Hot standby modules do preserve state information and provide transparent recovery from failures. A technique is used that allows modules to be programmed without fault-tolerance in mind; afterwards they can be transformed in order to achieve that capability. These two types of redundancy are supported by common mechanisms which provide for detection of failures and reconfiguration of the software modules of the application. Reconfiguration is also used to recover the reliability of the system by providing further standby modules to replace failed ones. We believe that this approach provides a simple, flexible, and practical approach for the provision of fault tolerance in distributed embedded systems.