This is a work in progress. Feedback is welcome.