Implemented as far as possible