Although useful in the development of distributed systems, current reliable distributed environments, such as group communication toolkits (e.g., ISIS, TOTEM, PHOENIX) or transactional monitors (e.g., ENCINA, TUXEDO), are hardly extensible or customisable for specific application needs. The limitations of those systems are mainly due to their underlying distributed protocols, which are usually designed and implemented in an ad hoc manner. This paper presents BAST, an object-oriented framework for building fault-tolerant distributed applications. We also show how BAST is used to implement distributed protocols, by providing centralised and distributed design patterns . In particular, we present how we built atomic commitment and atomic multicast protocols, which provide adequate support for a wide range of fault-tolerant distributed applications. We detail customisation facilities of BAST and discuss our design in the light of different alternatives. Finally, we present BAST implementations in Smalltalk and Java, and we point out some optimisation issues.