split and moved implementation variants