Single-inheritance in object-oriented languages can lead to duplicated code in rich class libraries where feature-sharing cannot be linearized. Multiple-inheritance and mixins alleviate this problem, but lead to other difficulties in the face of evolution. Changes to classes or mixins can break code lower in the hierarchy in unexpected ways. Traits solve both problems by factoring out shared behaviour as sets of methods that do not depend on state. Traits have the important property that composition is symmetric, so changes do not lead to unexpected side effects. We present a formal model of traits, and define some basic properties of traits and classes.