This is a lot of work