initial complete version