Updated with lots of documentation!