Distributed cooperative engineering applications require consistent and long-term sharing of large volumes of data, which may cause conflicts due to concurrent read/write operations. Therefore designing concurrency control for underlying middleware systems is a difficult issue. Current transactional solutions, even if based on an optimistic approach, do not solve the problem because such applications access shared data for long periods of time performing a large number of read/write operations. Typically, a large set of modifications has to be discarded and this is unacceptable given the amount of work lost. In this paper, we describe the design and implementation of concurrency control mechanisms aimed at both reducing the amount of such conflicts and supporting the consistent long-term sharing of data. The mechanism of visibility depth allows the programmer to specify the consistency of shared data w.r.t. different sets of sites. We also provide other mechanisms: privatecopy that al...