Variability is a fundamental aspect of software. It is the ability to create system variants for different market segments or contexts of use. Variability has been most extensively studied in software product lines [10], but is also relevant in other areas, including software ecosystems [4] and context-aware software [15]. Virtually any successful software faces eventually the need to exist in multiple variants.Variability introduces essential complexity into all areas of software engineering, and calls for variability-aware methods and tools that can deal with this complexity effectively. Engineering a variable system amounts to engineering a set of systems simultaneously. As a result, requirements, architecture, code and tests are inherently more complex than in single-system engineering. A developer wanting to understand a particular system variant has to identify the relevant parts of requirements and code and ignore those that pertain solely to other variants. A quality assurer verifying a variable system has to ensure that all relevant variants are correct. Variability-aware methods and tools leverage the commonalities among the system variants, while managing the differences effectively.This talk will analyze how variability affects the software lifecycle, focusing on requirements, architecture and verification and validation, review the state of the art of variability-aware methods and tools, and identify future directions. Variability modeling at the requirements level helps explaining a variable system and its evolution to all stakeholders, technical and nontechnical ones. A popular technique is feature models [19,11], which are hierarchically composed declarations of common and variable features and their dependencies. At the requirements level, system features represent cohesive clusters of requirements [7,8], providing convenient "mental chunks" to all stakeholders to understand the system, its variability, and its evolution. For example, changes at the code level can be explained as feature additions, removals, merges, or other kinds of modifications at the feature level [27]. As feature models provide only declarations of features, an obvious direction is to enrich them with feature specifications, such as behavioral ones (e.g., [30]). Feature models can also be enhanced with rich forms of dependencies, such as representations of feature interactions (e.g., [24]), and with quality attributes, such as performance (e.g., [2,26]). Feature-oriented software development (FOSD) aims at treating features as first-class citizens,