One way to do this update in stages is to add new functions to old {quote:ClassAds} that hide the assignment operator. They would operate on the attribute name as a string and the attribute value as an {quote:ExprTree}. The internal structures could remain the same. Then, the users of the old functions could be be switched over to use the new ones. The new {quote:ClassAds} compatibility class would implement the new functions. +{subsubsection: Cross-Ad References} +In old {quote:ClassAds}, when evaluating an expression in the context two ads, if variable in the expression isn't in the local ad, it is looked for in the remote ad as well. The scopes 'my' and 'target' can be used to look in only one of the two ads for a variable. New {quote:ClassAds} include a {quote:MatchClassAd} for evaluating expressions in the context of two ads. But references to attributes in the remote ad must use the 'target' scope. + {subsubsection: AttrList} Several parts of the code use {quote:AttrList}, which is a parent class to {quote:ClassAd} in old {quote:ClassAds}. This code can be converted to use {quote:ClassAd} instead if the put() or initFromStream() methods are used. Where those methods are used, alternative functions (which exist) need to used which don't include special handling for {quote:MyType} and {quote:TargetType}.