Proxy objects are local representatives of remote objects in a distributed system. The authors use proxies to construct a transparent application programming interface (API) for the Choices distributed operating system. In earlier work, proxies were used in Choices to provide a protected, object-oriented interface to system objects. The addition of Remote Proxies allows applications to access all resources in a uniform way by simply invoking methods on objects, irrespective of whether they are local, in the kernel, in a different user virtual address space or remote. They also extend proxies to optimize access to remote and protected objects and to provide support for changing server interfaces. They describe a new remote procedure call (RPC) facility for invoking methods on remote objects through the proxy mechanism. The API is made dynamically reconfigurable by using table lookup to perform all functions normally provided by stubs in conventional RPC implementations. The API permits new versions of a service to be introduced without requiring recompilation of application client code.