Answers question 3: Here is a systematic approach: Translate from A through A1 through A2 through A3 ... to {A -> A1 to-stop A1 -> A2 to-stop A2 -> A3 ... } For each leg l[i] compute the propagation graph p[i] and define a traversal method t[i] for that traversal graph. When t[i] enters its target at which it stops, switch to t[i+1]. For 1: The following is NOT correct: t0: A.x X.b t1 t1: B X.b c C translation rule: tt: X.y defines a traversal tt for class X calling tt for part y X.y tt2 defines a traversal tt for class X calling tt2 for part y This hand-generated traversal is NOT equal to "from A via B to C"? The above is a summary to: class A { public void t0( ) { x.t0(); } } class X { void t0(){ System.out.println(" at X t0"); b.t1(); } void t1(){ System.out.println(" at X t1"); b.t1(); c.t1(); } } class B { void t1(){ System.out.println(" at B t1"); } } class C { void t1(){ System.out.println(" at C t1"); } } The correct answer is: (Note: Demeter/Java does not handle this correctly but DJ does) class A { public void t0( ) { x.t0(); } } class X { void t0(){ super.t0_bef(); System.out.println(" at X t0"); super.t0(); // this is essentially what's missing in the // Demeter/Java-generated code } void t1(){ super.t1_bef(); System.out.println(" at X t1"); b.t1(); c.t1(); } } class B { void t0_bef() { System.out.println(" at B t0"); } void t0() { this.t1(); } void t1_bef(){ System.out.println(" at B t1"); } void t1() { // do nothing; premature termination // (to catch t1() on an E-object) } } class C { void t1(){ System.out.println(" at C t1"); } } =============== For 2: t0: A.b1 B1.b t1 t1: B.if b1 B1.b d D.f1 F1.f t2 t2: F.if f1 F1.f g G translation rule: tt: X.y defines a traversal tt for class X calling tt for part y X.y tt2 defines a traversal tt for class X calling tt2 for part y X.if y defines a traversal tt for class X calling tt for part y but only if part y exists.