React

I thought I'd open this as a PR to make it easier to compare

All the work was done by @petehunt