Since the architecture of a software system constrains the non-functional requirements, the decisions taken during architectural design have a large impact in the resulting system. An architectural design method is presented that employs iterative evaluation and transformation of the software architecture in order to satisfy the non-functional requirements (NFRs). Architecture evaluation is performed by using scenarios, simulation, mathematical modelling and reasoning. The architecture can be transformed by imposing an architectural style, imposing an architectural pattern, using a design pattern, converting an NFR to functionality and by distributing NFRs. The method has, in various forms, been applied in several industrial projects.