new version with implementations