Add a lot more documentation