revised to correct some things in the last push