This is a bit long, but well worth the read.