I. Introduction
Software products must evolve in order to correct existing defects, provide new functionalities, adapt to new environments and increase their nonfunctional qualities, such as security, maintainability, performance, etc. As the size of the software product grows, maintenance becomes the most complicated activity in terms of time, effort and cost. Considerable research has been focused on understanding software evolution in order to reduce evolution complexity and evolution cost [1]–[5].