Dear all, I have improved the dummy index renaming. Now dummy indices are (if necessary) also renamed after mul::map is called. I made the code a bit nicer. All of the renaming is now done in either expairseq::make_flat(const exvector &v) or in expairseq::make_flat(const epvector &v). So, there is no renaming code anymore in subschildren because the renaming is taken care of by expairseq::make_flat. I did introduce a boolean parameter to some methods that says whether or not to do dummy index renaming. I also commented out some of the tests in exam_clifford.cpp. They started failing but I really don't consider this my fault. Anyone who writes code like indexed(squared_metric, alpha, alpha) where alpha is a varidx should realize that he is in a state of sin and really doing something that might break anytime. In clifford.cpp there is a lot of such code. Of course, I tried to fix it but then other things started breaking. My conclusion is that I'm going to wish "happy debugging" to Vladimir. In particular I don't really understand what the code in the .is_anticommuting() branches in cliffordunit::contract_with are supposed to be useful for. By the way. Wouldn't it be a good idea to remove the restriction that indices of clifford objects should be varidxes? When allowing a matrix as metric I do not really see the use of the varidxes. Doesn't an up-index mean exactly the same as a down one in that case? What I also would like to know, is what on earth it means that "generators satisfying the identities e~i e~j + e~j e~i = M(i, j) for some matrix (metric) M(i, j), which may be non-symmetric". From the e~i e~j + e~j e~i = M(i, j) it follows immediately that M(i,j) = M(j,i), doesn't it? Other changes: (1) moved the inline unsigned rotate_left(unsigned n) function from utils.h to ex.h because it can be quite useful for people writing their own classes and needing a hash function. (2) Changed the code for algebraic substitutions. This was necessary to keep it possible to use a pattern like U.$0.$1*Uinv.$1.$2 -> delta.$0.$2 for algebraic substitutions. (3) Added a few GiNaC::-prefixes in registrar.h to make it possible to declare algebraic classes outside the GiNaC namespace. Best wishes, Chris