Cleaned up more documentation, forced provider protocol, added is_reversible to protocol, implemented reverse functions