My thesis research has explored software techniques that simplify the development of distributed programs. In particular, I have focused on the problem of evolving a centralized program into a distributed program using software tools, aiming to enable distributed programming with a programming model/semantics that closely resembles centralized programming. Although similar research has been done in the systems community (with distributed shared memory tools), my research has explored novel software tools that address the problem. As a result of my research, three software artifacts for transforming a centralized program into a distributed one have been developed: NRMI, middleware with copy-restore semantics; GOTECH, a program generator for distribution; and J-Orchestra, an automatic partitioning system. NRMI is a drop-in replacement for Java RMI that offers an efficient implementation of call-by-copy-restore semantics in addition to regular call-by-copy. The GOTECH framework adds the J2EE style distribution to unaware centralized programs and uniquely combines generative and aspect-oriented techniques. J-Orchestra, a system for automatic partitioning of Java programs, takes as input a Java application in bytecode format and transforms it into a distributed application that runs across multiple Java Virtual Machines. J-Orchestra has significant generality, flexibility, and degree of automation advantages over previous work on automatic partitioning.