complete initial version