Fixes #497 and fixes #496. Still rough edges, but at least less duplication.
Too much code for such little use. This should simplify porting.