fully implemented, close #103