initial implementation plus smoke test