A reference architecture implements features that can be reused, after possible customizations, across members of a system
family. Family members display similarities but they also vary one from another in user, design or implementation requirements.
In this paper, we describe techniques that allow us to handle certain classes of variations at the architecture level and
to build systems by customizing the architecture rather than by implementing variations at the code level. To achieve this
end, we model variations within a domain model and then define how variations in system requirements affect the configuration
of a reference architecture at different levels of granularity and abstraction. During system engineering, we customize a
reference architecture by selecting architecture components to be included into the target system, by customizing component
interfaces and, finally, by modifying components at the code level. In this paper, we show how we model variations within
a domain model and describe the mechanism for mapping variations into the architecture component interfaces. We applied described
techniques in our domain engineering projects in the facility reservation and software project domains.