Snappy

@bpot @dim this is a redux of #28 based on #56. Thanks for the original work @dim!
Why are these changes necessary?