update with a large amount of abstraction