add a lot of documentation