implement variants