more complete version