Hi Larry I have posted your 100 000 line Java metrics program at http://www.ccs.neu.edu/research/demeter/course/f97/projects/JavaMetrics It demonstrates the power of traversals very well. Below is a selection of your strategies. Fortunately, they are much shorter. I have the entropy metric algorithm in my office if you want to pursue that further. I agree with you that you over use traversals. Several of them could probably be combined resulting in a more efficient program. -- Karl lod.beh:int SysType1LoD() to UnmodifiedClassDeclaration { lod.beh:int SysType2LoD() to UnmodifiedClassDeclaration { lod.beh:Hashtable CollectDataMembers() to FieldDeclaration { lod.beh:int Type1LoD() to PrimarySuffixes { lod.beh: to Arguments { lod.beh: to AllocationExpression { lod.beh:Hashtable CollectArgs() to FormalParameter { lod.beh:traversal Type1LoDtrav(UniversalVisitor) { to dotIdent; } lod.beh:int countIdents() to dotIdent { program.beh:int SIZ() to UnmodifiedClassDeclaration { program.beh:int NOH() to UnmodifiedClassDeclaration { program.beh:int NIC() to UnmodifiedClassDeclaration { program.beh:int NLC() to UnmodifiedClassDeclaration { program.beh:int NSI() to UnmodifiedClassDeclaration { program.beh:float ADI(CompilationUnits self) to UnmodifiedClassDeclaration { program.beh:float AWI(CompilationUnits self) to UnmodifiedClassDeclaration { program.beh:void printHiearchies() to UnmodifiedClassDeclaration { program.beh:Vector getUnits() to CompilationUnit { program.beh:void updateChildren(CompilationUnits self) to UnmodifiedClassDeclaration { program.beh:UnmodifiedClassDeclaration findUCD(Name name) to {PackageDeclaration, UnmodifiedClassDeclaration} { program.beh:int Type2LoD(UnmodifiedClassDeclaration self) to MethodDeclaration { program.beh:int NOM() to MethodDeclarator { program.beh:int CIS() to MM_Public { program.beh:int NPA() to FM_Public { program.beh:int NOA() to FieldDeclaration { program.beh:int NAD() via FieldDeclaration to TName { program.beh:int totalParameters() via MethodDeclarator to FormalParameter { program.beh: to Name; program.beh: through{FieldDeclaration} bypassing {VariableDeclarators} to Name; program.beh:String printFileName() to UnmodifiedClassDeclaration { program.beh:void printFileMetrics(CompilationUnits system) to UnmodifiedClassDeclaration { util.beh:String getObjName() through {PrimaryPrefix,PName} to Name { util.beh:String getFirstId() to Identifier { util.beh:String getName() to Name { util.beh:Vector getObjNames() to Identifier{ util.beh:String getObjName() via VariableDeclaratorId to Identifier{ util.beh:String getObjName() to Identifier{