reimplemented canon to handle reversing
Merge branch 'canon-fixed' into 3.0-wip