The problem of managing the evolution of complex and large software systems is well known. Evolution implies reuse and modification of existing software artifacts, and this means that the related knowledge must be documented and maintained. This paper focuses on the evolution of software product families, although the same principles apply in other software development environments as well. We describe our experience gained in a case study recovering a family of six software products. We give an overview of the case study, and report a list of lessons learned, a list of implicit assumptions reconstructed during the case study, and some rules that we think are generally applicable. Our experience indicates that organizing architectural knowledge is a difficult issue. To properly serve the various uses of this knowledge, it needs to be organized along different dimensions. For effective use, tools are required. Our experience also indicates that, next to variability explicitly designed i...