Final Version, Not fully commented