revised but not complete ver