cleaned up and added comments;)