uses a clean exit