Clustering is a well known technique that allows scalability and fault tolerance in distributed systems. In the J2EE framework, clustering can be used to improve the performance and the availability of an application. In this context, however, great care has to be taken with respect to the replication of stateful components; specifically, stateful components replication can adversely affect the performance of the system and can introduce unexpected modifications in the semantics of the application. In this paper, exploiting our experience in this area, we analyze and discuss these issues, and propose possible solutions. We also describe how component replication is implemented in a number of (open source and commercial) J2EE compliant application servers. The aim of this paper is to provide the insight to better evaluate the software solutions and the related costs/benefits trade-off issues that a software architect has to address when designing a critical, high available, system.