added an "optmised" version of the normal solver