Recently, formal approaches to reverse engineering have received considerable attention as a means of creating correct high level specifications. We show how a formal approach to reverse engineering can be applied when constructing distributed systems, eg. if we want to reuse an existing algorithm, but in a different environment, or develop a new distributed algorithm that is somehow similar to an existing one. We introduce a formal approach to reverse engineering that is dedicated to distributed systems. Our approach is based on a technique we call coarsement. The idea is that an implementation is stepwise turned into a high level specification through a number of intermediate coarsement steps that abstract away the details while preserving the behaviour of the implementation.