Hi Bill and I-Chen: here are some further thoughts on dealing with APPCs using transducers. We discussed this in our seminar yesterday. I hope this helps you with giving more context to your project. The starting point is: interface class graph icg application class graph ccg strategy sicg: strategy for icg refined strategy rsicg1: for mapping 1 of icg to ccg refined strategy rsicg2: for mapping 2 of icg to ccg For example: sicg: from A to B // counts all Bs rsicg1: from A bypassing X to B // counts some Bs rsicg2: from A bypassing Y to B // counts some other Bs We have one traversal specified by sicg and two APPCs driven by sicg but computing according to the two refined strategies. The traversal specified by sicg is done by traversal bean for ccg. Two APPC beans listen and are interested only in rsicg1 and rsicg2 events. In the special case of sicg = rsicg1 = rsicg2 (what I-Chen does now), this is just a deletion of events. In the general case, we need traversal graphs as produced by the AP library to transform the event stream from the traversal bean. A good name for the device that transforms such event streams is: strategy transducer. A strategy transducer is specified by a tuple (s1, s2), where s1 and s2 are strategy graphs. It will be instantiated by a class graph g. s1 is a strategy for traversing g and s2 is a refinement of s1 also for traversing g. The nodes of s1 and s2 are contained in the nodes of g. The transducer takes as input a traversal history Hist(o, s1, g), obtained by traversing object o of g according to s1 and creating all node and edge events including edge events for s1 (Bill: does your traversal bean produce those?), and produces as output a traversal history Hist(o,(s1,s2),g) that consists only of node and edge events of the positive strategy graph of s2. More precisely, an s2 edge event is produced each time the target of the edge is reached on a path from the source of the edge and satisfying the constraint map. Besides strategy transducers we also have selection transducers: select node(_,before) selects only before node events. _ is a "don't care". select node ({node set}, _) selects both before and after node events for events in the node set. In general we can compose transducers. And we have interestung relationships between tranducers: For the strategy transducer (s1, s1) we have: Hist(o,(s1,s1),g) = Hist(o, s1, g) select ({nodes of s1},_) and select ({edges of s1},_) In other words, when s1=s2 then the strategy transducer is equivalent to two concatenated selection transducers. -- Karl