The evolution of software systems over many years often leads to unnecessarily complex and in exible designs which in turn lead to a huge amount of e ort for enhancements and maintenance. Thus, the reengineering of object-oriented software becomes more and more important as the number, age and size of such legacy systems grow. A key issue during reengineering is the identi cation and location of design problems which prevent the e cient further development of a system. Up to now this problem area has not been su ciently supported, either by methods, or by tools. In this paper, we present a technique for analyzing legacy code, specifying frequent design problems as queries and locating the occurrences of these problems in a model derived from source code. We present our experiences with a tool set which we implemented to support this task by automatically analyzing a given system and detecting the speci ed problems. We applied our tools to check violations of a number of well-known des...