base implementation