Bi-directional support added

This builds on @setumiami's bidirectional additions, adding unit tests and documentation, and ironing out a few things that surfaced along the way. Thanks to @setumiami for paving the way here.