implementing the variants