Hi Mira: here is the way I thought we could define a useful family of derived edges by writing strategies instead of writing Java code: Using your example: define -> v$Vertex,d,a$Adjacency (Graph g) {-> g$Graph Adjacency stop -> a$Adjacency v$Vertex through -> *,source,*} {precondition: for all v there is exactly one a such that: -> a$Adjacency v$Vertex through -> *,source,* } This derived edge could be added just for the purpose of the DFT computations. An alternative would be to actually store the link instead of recomputing it each time, using a link visitor: LinkVisitor(Strategy {-> Graph Adjacency stop -> a$Adjacency Vertex through -> *,source,*}) { when-traversing Vertex Adjacency d; (@ d = a; @) } {precondition: for all v there is exactly one a such that: -> a$Adjacency v$Vertex through -> *,source,* Both solutions are longer than your back-edge solution (<- source) but maybe also easier to implement. The idea is in both cases the same: Use strategies to define "object-linking code" instead of using oo code. -- Karl