Updated with some polish and more documentation