1. Introduction
Design problems are structures that indicate violations of key design principles or rules [38]. Every software system suffers from design problems, introduced either during original development or during evolution. Examples of design problems are Fat Interfaces [10], [38], Overused Interfaces [10], [38], and Scattered Concerns [10], [38]. These problems may have different degrees of severity, but all of them should be detected and possibly removed from the source code. Software systems have been often discontinued [22] or have had to be fundamentally reengineered [12], [34], [40] when design problems were allowed to persist in a system and to be compounded by other design problems introduced later.