There has been an increasing research interest in using Java for performance-oriented distributed applications. Many approaches tend towards automatic management of locality, parallelism and load balancing which is mostly under the exclusive control of a runtime system. However, the programmer is commonly disabled to provide crucial information about the application structure (e.g. locality relationships or affinities between data and tasks) to the compiler or runtime system which frequently results in critical performance problems. In previous work we described JavaSymphony to substantially mitigate this problem. JavaSymphony is a Java class library that allows to control parallelism, load balancing, and locality at a high level. Objects can be explicitly distributed based on virtual architectures which impose a virtual hierarchy on a distributed system of physical computing nodes. The concept of remote method invocation is used to exchange data among distributed objects and to process work by remote objects. In this paper we describe various extensions of JavaSymphony which includes a generalization of virtual architectures. Objects can now be dynamically converted from conventional Java objects to JavaSymphony objects. The programmer can control whether a single or multiple threads execute all methods of an object at any given time. Moreover, a lock/unlock mechanism has been introduced in order to avoid inconsistent modification of data. All of these features have been implemented. Experiments conducted on a heterogeneous workstation cluster and on a SMP cluster architecture are described to demonstrate performance values for several JavaSymphony applications. This research is supported by the Austrian Science Fund as part of Aurora Project under contract SFBF1104.