Dear Edward. Thank you for all the suggestions. I have summarized them: 1) Move matrix_exponential_rankN, to lib.dispersion.matrix_exponential. OK. Done. 1a) Split into matrix_exponential_rank6, and matrix_exponential_rank7. Add unit tests. OK. Done. 2) In matrices, use the float64 type in the array() function, or drop the '.0' from all numbers. ? I could skip the ".0". The "multiply.outer" with float 64, takes care of the conversion. No need to do float 64 as type. Where should the matrices "live" ? 3) Move rcpmg_star_rankN() from /lib/dispersion/ns_matrices.py into /lib/dispersion/ns_cpmg_2site_3d_matrices.py ? Several possibilities: a) Stay as it is. Good to keep all matrices in one place. b) Move all matrices into each dispersion file. Also very good. This would eliminate ns_matrices.py file. c) Move to separate files. I do not prefer this. 4) Shift all the m_* star matrices out. They are "not changing" matrices. Will do. 5) Shift "dA=omega - offset", and "theta=atan2(spin_lock_fields_i, dA)" out of loops. They dont change: Yep. That is true. 6) Unit tests of ns matrices are the same for low and high dimensionality. Yep, this is good. First determine where to store low and high dimensional matrices. Where is the ns matrices located? 7) The complex64 in ns_mmq_2site_mq. Change to complex128, and change systemtests. 8) Profiling scripts for the 3-site dispersion model. Same as the 2-site models and where states B and C are identical Coming up. 9) Handling numpy v 1.6. Relevant for all systemtests of NS models. How? Both system and unit tests. Under numpy 1.6, no NS models is possible ! 10) Move M1, M2, M1* and M2* out of for loops. Coming up.