The achievement of efficient implementations Is still considered an open problem in the distributed object-oriented programming languages field. In this article, we present an approach to implement distributed objects in a reasonable, efficient way. This approach is based on the use of a protocol that allows objects to be migrated and replicated. The basic idea is to reduce the overhead of remote invocations among objects by making them local. The effectiveness of our scheme requires a strict programming model, in which object invocations must be enclosed between pairs of acquire and release operations, and operations are classified in commands or queries. Details of a thread-based implementation are presented. Experiments with a parallel matrix multiply program and a parallel branch and bound program, executed in three different architectures, demonstrate that significant speedups can be obtained.