An initial software design is a raw structure that needs to be refined before implementation starts. In this thesis, we introduced a set of transformations which can be applied to an initial design. The refinement is conducted in two steps. In the first step, the major abstract modules in the initial design and the relations among them are identified. The identified abstract modules are then transformed into more refined modules in the second step. Design transformations are derived on the basis of relations between the modules. Such design transformations are also automated when the program design is represented in a textual form.