Source idempotent

Closes issue #6.