added a lot of header documentation