Software components promise easy reuse, dependability, and simplified development. Problems arise when implicit assumptions about the use of the component are encoded in the implementation but not communicated to the user. One solution to this problem is to formally specify these constraints about a component's use. Once specified, these usage constraints can be statically verified or dynamically enforced. This dynamic enforcement code can be provided by either the developer or automatically generated. Our research project, lips, is a language for specifying usage constraints and a toolset for automatically generating dynamic code to enforce them. In this paper we present the notion of a virtual client and show how this is critical for ensuring correct usage of a component. We discuss our experiences providing automatic enforcement of usage constraints for CORBA components: while much of the needed support can be provided easily using a container concept, support for virtual clie...