completes #22
completes #23