- As software requirements constantly increase in size and complexity, the need for methods, formalisms, techniques, tools and languages for managing and evolving software artifacts become crucial. One way to manage variability when dealing with a rapidly growing variety of software products is through developing and maintaining families of software products rather than individual products. Variability management is concerned with controlling the versions and the possible variants of software systems. Variability management gained a special interest in various software-related areas in different phases of the software development lifecycle. These areas include conceptual modeling, product line engineering, feature analysis, software reuse, configuration management, generative programming and programming language design. In the context of conceptual modeling, the terminology of variability management has been investigated, yielding ontologies, modeling languages, and classification frameworks. In the areas of software product line engineering and feature analysis, methods for developing core assets and efficiently using them in particular contexts have been introduced. In the software reuse and configuration management fields, different mechanisms for reusing software artifacts and managing software versions have been proposed, including adoption, specialization, controlled extension, parameterization, configuration, generation, template instantiation, analogy construction, assembly, and so on. Finally, generative programming deals with developing programs that synthesize or generate other programs and programming language design provides techniques for expressing and exploiting commonality of source code artifacts, but also for specifying the allowed or potential variability, whether it is static or dynamic.