finished basic version