Most object-oriented languages for distributed programming offer only a limited number of message semantics. At best, languages support a default mode of synchronous remote message passing, plus some keywords to express different styles of asynchronous messaging. The very few approaches that offer richer libraries of invocation abstractions, usually introduce a significant time overhead, lose - to some extent - transparency and/or do not support the composition of their abstractions. This thesis describes a pragmatic approach for abstracting message passing semantics. Using a combination of the Strategy and Decorator design patterns, we suggest an effective way to compose arbitrary new message semantics. To reduce the overhead induced by the flexibility underlying our approach, we rely on a technique for just-in-time stub generation. By taking run-time knowledge into account, the code snippets are further optimised. The implementation of a prototypical distributed objects system shows the feasibility of our approach. Measurements prove that the overhead, due to the flexible semantics, is only marginal. A number of applications serve as a proof for the usability of our approach.