implementing variants