The main goal of software engineering has been, and continuous to be, solving the cost, time and quality issues associated with software development. Since the existence of software engineering in the late 1960s, reuse through componentization has been the generally accepted approach to address these goals. Over the last 40 years, several techniques have been proposed that focused on the increase in the scale of reuse. However, primarily during the last decade, it was realized that with the increase in scale, variability was needed to increase the applicability of the components. Therefore, proper variability management is regarded as a key success factor in addressing the main goals of software engineering. in this thesis, we focus on vari...