lots of new work, even rougher code than usual, but much faster